节省cudaHostAlloc所需的时间

时间:2013-01-04 11:19:54

标签: cuda gpgpu nvidia

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

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,第二种方法也要慢得多)。

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

1 个答案:

答案 0 :(得分:3)

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

否则,我会测量程序的特定部分,以查看时间丢失的位置。 (alloc,memcpy,pcie-transfer)

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

无论如何,你展示的时间很短,所以我猜,传输尺寸也很小。您应该能够通过将多个小写入组合到更大的写入来获得速度。