【发布时间】:2014-05-26 17:02:32
【问题描述】:
我正在开发一个对视频帧数据执行一些处理的应用程序。为了加速它,我使用了 2 个图形卡并使用 OpenCL 处理数据。我的想法是将一帧发送到第一张卡,另一帧发送到第二张卡。这些设备使用相同的上下文,但命令队列、内核和内存对象不同。
但是,在我看来,计算不是并行执行的,因为 2 张卡所需的时间几乎与仅一张显卡所需的时间相同。
有没有人有一个很好的例子,可以同时在独立的数据片段上使用多个设备?
提前致谢。
编辑:
这是切换到 2 个独立上下文后的结果代码。但是,使用 2 个显卡的执行时间仍然与使用 1 个显卡的相同。
cl::NDRange globalws(imageSize);
cl::NDRange localws;
for (int i = 0; i < numDevices; i++){
// Copy the input data to the device
commandQueues[i].enqueueWriteBuffer(inputDataBuffer[i], CL_TRUE, 0, imageSize*sizeof(float), wt[i].data);
// Set kernel arguments
kernel[i].setArg(0, inputDataBuffer[i]);
kernel[i].setArg(1, modulusBuffer[i]);
kernel[i].setArg(2, imagewidth);
}
for (int i = 0; i < numDevices; i++){
// Run kernel
commandQueues[i].enqueueNDRangeKernel(kernel[i], cl::NullRange, globalws, localws);
}
for (int i = 0; i < numDevices; i++){
// Read the modulus back to the host
float* modulus = new float[imageSize/4];
commandQueues[i].enqueueReadBuffer(modulusBuffer[i], CL_TRUE, 0, imageSize/4*sizeof(float), modulus);
// Do something with the modulus;
}
【问题讨论】:
-
抱歉,只有指向 developer.nvidia.com/opencl#oclSimpleMultiGPU 的指针,以及有一段时间(在 CUDA 3.0 左右,很久以前)NVIDIA 卡无法在 Win Vista/7 上同时运行的提示,. ..但我希望他们能解决这个问题。
-
@Marco13 当前的 Nvidia 和 AMD 图形驱动程序允许在 Windows 7 和 8 上的同一应用程序中同时使用多个 GPU(可能也是 Vista,但我尚未对此进行测试)。
-
@krisg 在没有看到代码的情况下,我只能提出一般性建议:不要使用任何阻塞 API 调用,仅在将工作分派到所有设备后使用 clWaitForEvents/clFinish。为两个设备使用单个上下文的一个副作用是,您分配的缓冲区和图像将在两个设备上,即两者都将具有第 1 帧和第 2 帧的内存对象,即使每个设备只需要一帧。就个人而言,我只是为每个设备使用单独的上下文。
-
感谢两位的回答。切换到不同的上下文确实很有意义。我会尝试一下并发布一些代码并稍后报告结果。