【问题标题】:OpenCL: How does one select the GPU in a contextOpenCL:如何在上下文中选择 GPU
【发布时间】: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


【解决方案1】:

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

基本上,您有两个选择:

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

【讨论】:

    【解决方案2】:

    即使在只有一台设备的情况下,缓冲区对象也可能同时驻留在设备和主机上。如果您使用clEnqueueWriteBuffer 填充缓冲区,这将发生在特定的命令队列上,因此与特定的设备相关联。理所当然地,在这种情况下,大多数实现都会在与队列对应的设备上分配内存,并使用其 DMA 引擎来填充缓冲区。

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

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

    【讨论】:

      猜你喜欢
      • 2013-08-18
      • 2015-04-16
      • 1970-01-01
      • 1970-01-01
      • 2016-03-22
      • 2015-06-04
      • 1970-01-01
      • 2018-07-19
      • 2017-02-23
      相关资源
      最近更新 更多