【问题标题】:Where is the buffer allocated in opencl?opencl 中分配的缓冲区在哪里?
【发布时间】:2014-11-26 22:15:50
【问题描述】:

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

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

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

【问题讨论】:

  • 我用的是苹果平台。

标签: c++ opencl


【解决方案1】:

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

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

如果有许多不同的设备,它会在创建时在其中一个中。但它可能会根据内核启动情况透明地移动到另一个设备。

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

这是它的定义:

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

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

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

【讨论】:

  • 感谢您的回答!
猜你喜欢
  • 1970-01-01
  • 2023-03-15
  • 2018-12-06
  • 1970-01-01
  • 2014-12-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-03
相关资源
最近更新 更多