【问题标题】:Save Time needed for cudaHostAlloc节省 cudaHostAlloc 所需的时间
【发布时间】:2013-01-04 21:42:30
【问题描述】:

我试图找出在将数据传输到设备之前将数据复制到固定内存是否有意义,因为我对输入数据的分配没有影响(它是一个库)。

std::vector<int> idata(WORK_SIZE);
int *idata_aligned = NULL;
int *d1 = NULL;
int *d2 = NULL;

for (int i = 0; i < WORK_SIZE; ++i)
    idata[i] = i;
CUDA_CHECK_RETURN(cudaMalloc((void**) &d1, sizeof(int) * WORK_SIZE));
CUDA_CHECK_RETURN(cudaMalloc((void**) &d2, sizeof(int) * WORK_SIZE));

printf("unpinned:\n");
{
    boost::timer::auto_cpu_timer t;
    CUDA_CHECK_RETURN(cudaMemcpy(d1, &idata[0], sizeof(int) * WORK_SIZE, cudaMemcpyHostToDevice));
}

printf("copy to pinned:\n");
{
    boost::timer::auto_cpu_timer t;
    CUDA_CHECK_RETURN(cudaHostAlloc((void**) &idata_aligned, sizeof(int) * WORK_SIZE,cudaHostAllocDefault));
    memcpy(idata_aligned, &idata[0], sizeof(int) * WORK_SIZE);
    CUDA_CHECK_RETURN(cudaMemcpy(d2, idata_aligned, sizeof(int) * WORK_SIZE, cudaMemcpyHostToDevice));
}

10,000,000 个元素的输出:

unpinned:
 0.018919s wall, 0.020000s user + 0.000000s system = 0.020000s CPU (105.7%)
copy to pinned:
 0.045428s wall, 0.020000s user + 0.020000s system = 0.040000s CPU (88.1%)

主要问题似乎是 cudaHostAlloc(即使没有 memcpy,第二种方法也慢得多)。

我做错了吗?是否有另一种方法可以将固定内存用于已分配的内存?

【问题讨论】:

    标签: cuda gpgpu nvidia


    【解决方案1】:

    使用固定内存的速度增益还取决于传输的大小和您的系统。您可以先运行 CudaBandwidthTest 示例,看看它是否真的有意义。

    否则,我会测量程序的特定部分以查看时间浪费在哪里。 (alloc, memcpy, pcie-transfer)

    根据您分配页面锁定的内存大小,您的系统也可能需要将一些其他内存交换到磁盘,从而增加运行时间。

    无论如何,您显示的时间很短,所以我猜传输大小也很小。您还应该能够通过将多个小写合并到一个更大的写来提高速度。

    【讨论】:

    • cudaMemcpy 几乎是我系统上固定内存的两倍,memcpy 在上述情况下大约需要 0.010 秒。这是一个没有交换的系统(但有 24 GB 的 RAM)。我也尝试了更多元素:在这两种情况下,100,000,000 所需的时间几乎正好是 10 倍;我猜 640 MB 应该足够了。
    • 将固定内存添加到 CUDA 后,传输性能大约提高了 2 倍。 Nehalem(Intel i7)和其他集成内存控制器的CPU,传输的带宽差不多,所以pinned内存的主要优点是可以参与异步memcpy,可以映射到CUDA地址空间访问直接由内核。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-07
    • 2017-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多