clCreateBuffer 不是特定于设备的吗?

Is clCreateBuffer not device-specific?

clCreateBuffer function takes a context identifier but no device identifier; and a clContext may 有多个设备。

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

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

如果您的问题是:"Ok, but where does the memory actually reside?" 答案是,"it is not clear".

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

然而,您可以手动告诉 API 将缓冲区移动到设备:clEnqueueMigrateMemObject() 但是如果另一个内核需要,API 可以自由地再次移动它。