我从多个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
答案 0 :(得分:1)
当您为多个设备共享的上下文创建缓冲区时,缓冲区将被共享&#34;在这些设备之间,您可以使用相同的cl_mem
对象在它们上执行命令。实现是否定义了实际在两个设备上分配用于保存此缓冲区的内存。 OpenCL驱动程序可能推迟实际分配,直到特定设备上执行的命令需要缓冲区,并且通常它足够智能,但它实际上取决于硬件和实现细节。
基本上,您有两个选择:
cl::Context
。答案 1 :(得分:0)
即使在只有一个设备的上下文中,缓冲区对象也可能驻留在设备和主机上。如果使用clEnqueueWriteBuffer
填充缓冲区,则将在特定命令队列上进行,从而与特定设备关联。在这种情况下,大多数实现都会在与队列对应的设备上分配内存,并使用其DMA引擎来填充缓冲区。
但是,您在OpenCL中没有比此更低级别的控制权。
因此,如果您在具有不同设备的不同队列上继续使用相同的缓冲区,则取决于访问模式以及如何编写实现,可能会有多个副本浮动,或者实现不断移动内存。分析将告诉您是否使用单独的上下文或共享上下文更好。