【问题标题】:How make data transfer between host and device more faster?如何让主机和设备之间的数据传输更快?
【发布时间】:2014-09-15 09:29:36
【问题描述】:

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

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

【问题讨论】:

  • 您使用独立 GPU 吗?你现在的 IO 速度是多少?你的机器上的 PCI-E 总线速度是多少?
  • 是的,它是一个独立的 GPU。我正在使用 GEForce GTX 630 KEPLER geforce.com/hardware/desktop-gpus/geforce-gt-630/specifications
  • 将您的结果与不同传输量的 PCI-E 带宽进行比较。如果超过理论最大值的 75%,通常表示传输速度还可以。如果这还不够,请查看 Nvidia OpenCl 最佳实践中描述的固定内存技术。
  • 好的,谢谢。我会尝试分享结果..
  • 您需要交错复制和执行。这可以通过拥有 2 个缓冲区和 2 个队列来实现。这样您就可以在旧数据仍在运行时复制新数据。

标签: opencl


【解决方案1】:

三种优化方法:

  1. 在集成 GPU(如 Intel 或 AMD APU)上使用“零复制”缓冲区,因此您无需为任何传输付费。

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

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

【讨论】:

    猜你喜欢
    • 2012-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-11
    相关资源
    最近更新 更多