Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Opencl 如何使主机和设备之间的数据传输更快?_Opencl - Fatal编程技术网

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

Opencl 如何使主机和设备之间的数据传输更快?,opencl,Opencl,我正在编写一些程序,我需要在主机和设备之间重复执行一些数据传输。我会尽我所能尽量减少,但有没有更快的方法来执行这项任务?在这里,复制到设备的数组在每次迭代中都会发生变化,因此需要使用新的数组值更新设备。如有任何建议/建议/帮助,将不胜感激 for (i = 0; i <= SEVERALCALLS; i++) { wrtBuffer = clCreateBuffer(context, CL_MEM_READ_WRITE | CL_MEM_ALLOC_HOST_PTR, sizeo

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

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);
    }
}

for(i=0;i三种优化方法:

  • 在集成GPU(如Intel或AMD APU)上,使用“零拷贝”缓冲区,因此您不必支付任何传输费用

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

  • 重叠传输和计算。使用三个命令队列,一个用于上传,一个用于计算,一个用于下载,并使用事件来确保依赖性。请参阅NVIDIA的示例:(虽然这是次优的;它可以比他们说的稍微快一点)


  • 你使用离散GPU吗?你现在的IO速度是多少?你的机器上的PCI-E总线速度是多少?是的,它是一个离散GPU。我使用的是GEForce GTX 630开普勒,将你的结果与不同传输量的PCI-E带宽进行比较。如果你得到的结果超过理论最大值的75%,通常意味着传输速度是正常的。如果不是这样的话够了,看看Nvidia OpenCl最佳实践中描述的固定内存技术。好的,谢谢。我将尝试并分享结果。您需要交叉复制和执行。这可以通过拥有2个缓冲区和2个队列来实现。这样,您可以在旧数据仍在运行的情况下复制新数据。