【发布时间】:2018-01-22 05:47:03
【问题描述】:
我从多个 GPU 设备中选择了我的上下文,如下所示:
type = platforms[0].getDevices(CL_DEVICE_TYPE_GPU, &devices);
if(type == CL_SUCCESS)
{
//Create context and access device names
cl::Context ctx_(devices);
context = ctx_;
gpuDevices = context.getInfo<CL_CONTEXT_DEVICES>();
for(i=0; i<gpuDevices.size(); i++) {
deviceName = gpuDevices[i].getInfo<CL_DEVICE_NAME>();
queues.emplace_back(cl::CommandQueue(context, gpuDevices[i], CL_QUEUE_PROFILING_ENABLE));
op::log("Adding " + deviceName + " to queue");
}
}
else if(type == CL_INVALID_DEVICE_TYPE || type == CL_DEVICE_NOT_FOUND)
{
throw std::runtime_error("Error: GPU Invalid Device or Device not found");
}
break;
但是,当我创建 cl::Buffer 时,它只允许我在一个上下文中传递。如何选择创建内存的 GPU。
cl::Buffer的构造函数是
Buffer(
const Context& context,
cl_mem_flags flags,
::size_t size,
void* host_ptr = NULL,
cl_int* err = NULL)
如您所见,它只包含 1 个上下文,我无法选择我的 GPU
【问题讨论】:
-
一个命令队列只为 1 个 gpu 服务。当您将“读/写缓冲区”排入其中之一时,它们会对该命令队列的 gpu 进行操作。这意味着您需要 2 个命令队列。
-
是的,但是当我创建一个新的 cl::Buffer 时,它会被复制到哪个 gpu
-
缓冲区可以在其上下文中的任何地方移动。你决定他们如何做。有时它甚至是隐含的。您可以在创建缓冲区后立即发出缓冲区写入命令,以确保它在这些设备上得到更新。最简单的方法是每个设备有 1 个上下文。但这意味着它们只能通过 RAM 或迁移命令进行通信。仅对整个 pc 使用 1 个上下文可以为您优化事物,这使得预测在哪里变得更加困难。实际上,在您真正使用它之前,它甚至可能是一个惰性分配。它甚至可以在 RAM 上有一个镜像,以加快复制速度。
-
但是您可以尝试 CL_MEM_HOST_NO_ACCESS 标志以确保它不在 RAM 上。
标签: opencl