在opencl中分配的缓冲区在哪里?

时间:2014-11-26 02:39:28

标签: c++ opencl

我试图在OpenCL中使用C ++绑定创建内存缓冲区。这句话看起来像

cl::Buffer buffer(context,CL_MEM_READ_ONLY,sizeof(float)*(100));

这句话让我感到困惑,因为它没有指定分配内存的设备。原则上context包含所选平台上的所有设备,包括cpu和gpu。缓冲区是否放在所有设备共享的公共区域中?

1 个答案:

答案 0 :(得分:6)

规范没有定义内存的位置。对于API用户,它在上下文中是"。

如果您只有一台设备,可能(99.99%)将在设备中。 (在极少数情况下,如果设备暂时没有足够的内存,它可能在主机中)

如果有许多不同的设备,它将在创建时出现在其中一个设备中。但它可能会透明地移动到另一个设备,具体取决于内核启动。

这就是为什么存在调用clEnqueueMIgrateMemObjects(仅限OpenCL 1.2)的原因。 它允许用户告诉API一些关于内存需要的提示,并提前准备副本。

以下是它的定义:

  

clEnqueueMIgrateMemObjects提供了一种机制,用于分配OpenCL内存对象所驻留的设备。用户可能希望在创建时更明确地控制其存储器对象的位置。这可以用于:

     
      
  • 确保在使用前在特定设备上分配对象。
  •   
  • 抢先将对象从一个设备迁移到另一个设备。
  •   
     

通常,内存对象会隐式迁移到使用内存对象排队的命令的设备

相关问题