OpenCL:如何在上下文中选择GPU

时间:2018-01-20 17:26:32

标签: opencl

我从多个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

2 个答案:

答案 0 :(得分:1)

当您为多个设备共享的上下文创建缓冲区时,缓冲区将被共享&#34;在这些设备之间,您可以使用相同的cl_mem对象在它们上执行命令。实现是否定义了实际在两个设备上分配用于保存此缓冲区的内存。 OpenCL驱动程序可能推迟实际分配,直到特定设备上执行的命令需要缓冲区,并且通常它足够智能,但它实际上取决于硬件和实现细节。

基本上,您有两个选择:

  1. 检查OpenCL供应商文档,了解运行时如何为共享上下文执行内存分配。
  2. 为每个设备创建单独的cl::Context

答案 1 :(得分:0)

即使在只有一个设备的上下文中,缓冲区对象也可能驻留在设备和主机上。如果使用clEnqueueWriteBuffer填充缓冲区,则将在特定命令队列上进行,从而与特定设备关联。在这种情况下,大多数实现都会在与队列对应的设备上分配内存,并使用其DMA引擎来填充缓冲区。

但是,您在OpenCL中没有比此更低级别的控制权。

因此,如果您在具有不同设备的不同队列上继续使用相同的缓冲区,则取决于访问模式以及如何编写实现,可能会有多个副本浮动,或者实现不断移动内存。分析将告诉您是否使用单独的上下文或共享上下文更好。