Opencl clCreateBuffer不是特定于设备的吗?

Opencl clCreateBuffer不是特定于设备的吗?,opencl,Opencl,采用上下文标识符,但不采用设备标识符;一个clContext有多个设备 这是否意味着OpenCL缓冲区不是特定于设备的?或者上下文只能包含共享单个物理内存空间的设备?或者我只是遗漏了什么?缓冲区不是特定于设备的,只是特定于上下文。因此,它们可以用于作为CL上下文一部分的所有设备。 这使得运行OpenCL内核成为可能,每个内核在不同的GPU中运行 如果你的问题是:“好的,但是内存实际驻留在哪里?” 答案是“不清楚” 它可以驻留在主机、设备或多个设备中。它最终将驻留在内核执行所需的设备中。CL AP

采用上下文标识符,但不采用设备标识符;一个clContext有多个设备


这是否意味着OpenCL缓冲区不是特定于设备的?或者上下文只能包含共享单个物理内存空间的设备?或者我只是遗漏了什么?

缓冲区不是特定于设备的,只是特定于上下文。因此,它们可以用于作为CL上下文一部分的所有设备。 这使得运行OpenCL内核成为可能,每个内核在不同的GPU中运行

如果你的问题是:“好的,但是内存实际驻留在哪里?” 答案是“不清楚”

它可以驻留在主机、设备或多个设备中。它最终将驻留在内核执行所需的设备中。CL API可确保一致性,但不能确保缓冲区位于给定位置。如果API认为将来需要缓冲区,它会将缓冲区异步复制到另一个设备

但是,您可以手动告诉API将缓冲区移动到具有以下内容的设备:
clenqueumememobject()

但是如果另一个内核需要,API可以自由地再次移动它。

我没有遇到过这种自动复制行为不好的情况。大多数时候,API在移动缓冲区方面做得很好。显然,必须使用适当的事件系统+内存标志,否则API可能无法理解何时需要移动/更新缓冲区。问题是,有时您只希望在设备上有一个缓冲区,而不需要复制任何内容。如果不需要数据迁移,您可以始终在ctx中分配缓冲区,它绑定到特定的设备,并手动执行memcpy。事实上OpenCL并不是一个低级的lewel API,它在我看来是相当高级的。@RomanArzumanyan:记住我没有说过任何关于复制的事情。我不想复制任何东西,只要分配。如果设备有单独的内存,它们会隐式地执行memcpy(除非驱动程序足够聪明,能够通过PCI Express路由数据,而不从一个GPU复制到另一个GPU)。即使司机能做到这一点,公交车也将成为瓶颈。