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

and*_*y90 0 c++ opencl

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

cl::Buffer buffer(context,CL_MEM_READ_ONLY,sizeof(float)*(100));
Run Code Online (Sandbox Code Playgroud)

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

Dar*_*ros 6

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

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

在许多不同的设备的情况下,它将在其中一个创建时.但它可能会透明地移动到另一个设备,具体取决于内核启动.

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

以下是它的作用定义:

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

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

通常,内存对象被隐式迁移到设备,对于该设备,使用内存对象对其进行目标排队