C++ 将多个设备传递到一个上下文是否意味着内核将被分发到这两个设备?

C++ 将多个设备传递到一个上下文是否意味着内核将被分发到这两个设备?,c++,opencl,C++,Opencl,我一直在编写一些基本的OpenCL程序,并在单个设备上运行它们。我一直在对代码的性能进行计时,以了解每个程序的性能 我一直在考虑让我的内核同时在GPU设备和CPU设备平台上运行。可以向cl::context构造函数传递设备的std::vector,以初始化具有多个设备的上下文。我有一个系统,只有一个GPU和一个CPU 要将内核分发到多个设备,您需要做的就是用可用设备向量构建上下文吗?当我用2台设备构建上下文时,我注意到性能有了显著提高,但这似乎太简单了 有一个DeviceCommandQueue

我一直在编写一些基本的OpenCL程序,并在单个设备上运行它们。我一直在对代码的性能进行计时,以了解每个程序的性能

我一直在考虑让我的内核同时在GPU设备和CPU设备平台上运行。可以向cl::context构造函数传递设备的std::vector,以初始化具有多个设备的上下文。我有一个系统,只有一个GPU和一个CPU

要将内核分发到多个设备,您需要做的就是用可用设备向量构建上下文吗?当我用2台设备构建上下文时,我注意到性能有了显著提高,但这似乎太简单了


有一个DeviceCommandQueue对象,也许我应该使用它为每个设备显式地创建一个队列?

我在我的系统上做了一些测试。事实上,你可以这样做:

使用名称空间cl;
上下文({devices[0],devices[1]});
队列=命令队列(上下文);//队列以推送设备的命令,但不指定哪个设备,只移交上下文
程序::源代码;
字符串kernel_code=get_opencl_code();
push_back({kernel_code.c_str(),kernel_code.length()});
程序(上下文、源);
program.build(“-cl快速松弛数学-w”);
我发现,如果这两个设备来自不同的平台(如一个Nvidia GPU和一个Intel GPU),
clCreateContext
将在运行时抛出读取访问冲突错误,或者
程序。生成
将在运行时失败。但是,如果两个设备来自同一平台,则代码将编译并运行;但它不会同时在两台设备上运行。我使用Intel i7-8700K CPU及其集成的Intel UHD 630 GPU进行了测试,在这种情况下,无论创建
context
的向量中的设备顺序如何,代码都将始终在CPU上执行。我使用Windows任务管理器进行了检查,还检查了内核执行时间测量的结果(每个设备的执行时间都是特定的)

您还可以使用任务管理器之类的工具监视设备使用情况,以查看哪个设备正在实际运行。如果你的系统与我观察到的有什么不同,请告诉我


通常,跨多个设备的并行化不是通过给上下文一个设备向量来完成的,而是给每个设备一个专用的
上下文
队列
,并明确地处理在哪个队列上执行哪些内核。这使您能够完全控制内存传输和执行顺序/同步点。

当传入设备向量时,我看到性能有所提高。我下载了一个CPU/GPU探查器,以便在运行代码时实际检查我的GPU和CPU的活动,似乎我看到了这两个设备上的活动。CPU的活动率约为95-100%,GPU的活动率高达30-40%,因此OpenCL必须在这两个设备之间拆分内核。我的电脑有一个带有集成GPU的CPU,这可能是内核在设备间共享的原因之一,因为它不像它有一个CPU和一个完全独立的GPU,它们连接在同一个组件上