为什么第一个cudaMalloc是唯一的瓶颈?

时间:2014-08-17 04:51:31

标签: cuda

我定义了这个功能:

void cuda_entering_function(...)
{
    StructA *host_input, *dev_input;
    StructB *host_output, *dev_output;

    host_input = (StructA*)malloc(sizeof(StructA));
    host_output = (StructB*)malloc(sizeof(StructB));
    cudaMalloc(&dev_input, sizeof(StructA));
    cudaMalloc(&dev_output, sizeof(StructB));

    ... some more other cudaMalloc()s and cudaMemcpy()s ...

    cudaKernel<< ... >>(dev_input, dev_output);

    ...
}

在我的程序中多次调用此函数(约5~15次),并使用gettimeofday()测量了该程序的性能。

然后我发现cuda_entering_function()的瓶颈是第一个cudaMalloc() - 我整个计划中的第一个cudaMalloc()。第cuda_entering_function()消耗了cudaMalloc()总执行时间的95%以上,当我更改了第一个cudaMalloc()分配内存的大小或者我更改了内存时,也会发生这种情况。执行cudaMalloc() s。

的顺序

原因是什么,有没有办法减少第一个cuda分配时间?

1 个答案:

答案 0 :(得分:6)

第一个cudaMalloc也负责设备的初始化,因为它是首次调用涉及设备的任何功能。这就是为什么你会受到这样的打击:由于使用了CUDA和你的GPU而导致开销。您应该确保您的应用程序可以获得足够的加速以补偿开销。

通常,人们使用初始化函数调用来设置他们的设备。在this回答中,您可以看到显然是对cudaFree(0)的调用是规范的方式。 This sample显示了cudaSetDevice的使用,如果您曾在使用多个支持CUDA的设备上工作,这可能是一个好习惯。