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