clCreateBuffer function采用上下文标识符,但没有设备标识符; clContext may有多个设备。
这是否意味着OpenCL缓冲区不是特定于设备的?或者上下文只包含共享单个物理内存空间的设备?或许我只是错过了什么?
答案 0 :(得分:4)
缓冲区不是特定于设备的,只是特定于上下文的。因此,它们可以用在属于CL上下文的所有设备中。 这使得运行OpenCL内核成为可能,其中每个内核在不同的GPU中运行。
如果您的问题是:“好的,但内存实际存在于哪里?” 答案是,“目前尚不清楚”。
它可以驻留在主机,设备或多个设备中。它最终将驻留在需要内核执行的设备中。 CL API确保一致性,但不确保缓冲区位于给定位置。如果它认为将来需要缓冲区,API会将缓冲区异步复制到另一个设备。
但是,您可以手动告诉API将缓冲区移动到设备:clEnqueueMigrateMemObject()
但是如果另一个内核需要,API可以再次移动它。