clEnqueueReadBuffer太慢了

时间:2015-08-24 20:01:26

标签: opencl gpu gpgpu data-transfer

我使用OpenCL 1.2(来自NVIDIA的SDK)进行实时光线跟踪。现在我遇到了GPU和CPU之间数据传输速度非常慢的问题。最关注的部分是在每帧执行时将输出数据从GPU传输回主机。我使用clEnqueueReadBuffer来读取数据。缓冲区创建为主机数据的副本。读取4 * 800 * 600字节(图像尺寸,RGBA 32位)需要大约8ms。这是不可接受的速度,我该如何解决?

我也尝试了clEnqueueMapBuffer但结果仍然相同。

编辑:添加了主机代码

if($result['Level'] > 1) {

1 个答案:

答案 0 :(得分:3)

正如我在评论中所说,你可能会测量内核执行和一起读取数据,并认为读取数据需要很长时间。以下是您应该如何正确衡量它:

void execute()
{
    /* Execute OpenCL Kernel */
    ret = clEnqueueNDRangeKernel(command_queue, kernel, dimSize, 0, &workGroups, &workItems, 0, NULL, NULL);
    clFinish(command_queue);
    double curTime = Timer::getTimeNanoSeconds();
    clEnqueueReadBuffer(command_queue, memobjOutput, CL_TRUE, 0, outputSize, bufferOut, 0, NULL, NULL);
    double curTime2 = Timer::getTimeNanoSeconds();
    println("delta kernel: "+ toString(curTime - curTime2));
    println("delta data read: "+ toString(Timer::getTimeNanoSeconds() - curTime2));
}

正常阻塞读取之前的clFinish是多余的,但它有助于获得正确的内核时序。