我试图在OpenCL中使用C++绑定创建一个内存缓冲区.这句话看起来像
cl::Buffer buffer(context,CL_MEM_READ_ONLY,sizeof(float)*(100));
Run Code Online (Sandbox Code Playgroud)
这句话让我困惑,因为它没有指定分配内存的设备.原则上context包含所选平台上的所有设备,包括cpu和gpu.缓冲区是否放在所有设备共享的公共区域中?
规范没有定义内存的位置.对于API用户,它是"在上下文中".
如果您只有一台设备,可能(99.99%)将在设备中.(在极少数情况下,如果设备暂时没有足够的内存,它可能在主机中)
在许多不同的设备的情况下,它将在其中一个创建时.但它可能会透明地移动到另一个设备,具体取决于内核启动.
这就是为什么调用clEnqueueMIgrateMemObjects(仅限OpenCL 1.2)存在的原因.它允许用户告诉API一些关于内存需要的提示,并提前准备副本.
以下是它的作用定义:
clEnqueueMIgrateMemObjects提供了一种机制,用于分配OpenCL内存对象所驻留的设备.用户可能希望在创建时更明确地控制其存储器对象的位置.这可以用于:
- 确保在使用之前在特定设备上分配对象.
- 抢先将对象从一个设备迁移到另一个设备.
通常,内存对象被隐式迁移到设备,对于该设备,使用内存对象对其进行目标排队