如何使主机和设备之间的数据传输更快?

时间:2014-09-15 09:29:37

标签: opencl

我正在编写一些程序,我需要在主机和设备之间重复执行一些数据传输。我会尽量减少最好的,但有没有更快的方法来执行此操作?这里,复制到设备的数组在每次迭代时都在变化,因此需要使用新的数组值更新设备。任何建议/指示/帮助将不胜感激。

for (i = 0; i <= SEVERALCALLS; i++) {

    wrtBuffer = clCreateBuffer(context, CL_MEM_READ_WRITE | CL_MEM_ALLOC_HOST_PTR, sizeof(double) * num, NULL, &ret);
    if (ret != 0) {
        printf("clCreateBuffer wrtBuffer error: %d. couldn't load\n", ret);
        exit(1);
    }

    // update cti array

    ret = clEnqueueWriteBuffer(command_queue, wrtBuffer, CL_TRUE, 0, sizeof(double) * num, cti, 0, NULL, NULL);
    if (ret != 0) {
        printf("clEnqueueWriteBuffer wrtBuffer error: %d. couldn't load\n", ret);
        exit(1);
    }

    // NDRange Kernel call

    ret = clEnqueueReadBuffer(command_queue, readBuffer, CL_TRUE, 0, sizeof(double) * num, newcti, 0, NULL, NULL);
    if (ret != 0) {
        printf("clEnqueueReadBuffer readBuffer error: %d. couldn't load\n", ret);
        exit(1);
    }
}

1 个答案:

答案 0 :(得分:1)

优化此方法的三种方法:

  1. 在集成GPU(如Intel或AMD APU)上使用&#34;零拷贝&#34;缓冲,这样您就不会为任何转账支付费用。

  2. 在NVIDIA上使用固定主机内存作为clEnqueueWriteBuffer的主机端内存源或接收clEnqueueReadBuffer的缓冲区。这比使用普通的malloc内存更快,并且不会阻止。

  3. 重叠转移和计算。使用三个命令队列,一个用于上载,一个用于计算,一个用于下载,并使用事件来确保依赖性。请参阅NVIDIA的示例:oclCopyComputeOverlap(尽管它不是最理想的;它可能会比它们说的要快一些)。