在CUB类之后使用cudaDeviceSynchronize

时间:2014-08-28 04:39:07

标签: cuda cub

在从CUDA内核调用CUB类之后是否需要调用cudaDeviceSynchronize?当一个人使用来自设备的DeviceReduce :: Sum()时,会有隐式内存副本阻止设备继续运行,但是在使用GPU上调用的以下代码遇到一些不稳定之后:

__device__ void calcMonomerFlux(double* fluxes, double* lengths, double* dt) //temp2 temp1
{

    void *d_temp_storage = NULL;
    size_t temp_storage_bytes = 0;

    arrInitToLengths<<< numBlocks, numThreads >>>(lengths); 
    cudaDeviceSynchronize();
    arrMult<<< numBlocks, numThreads >>>(fluxes, lengths, lengths);
    cudaDeviceSynchronize();
    double sum = 0;

    cub::DeviceReduce::Sum(d_temp_storage, temp_storage_bytes, lengths, lengths, maxlength);
    //cudaDeviceSynchronize();

    cudaMalloc(&d_temp_storage, temp_storage_bytes);
    //cudaDeviceSynchronize();

    cub::DeviceReduce::Sum(d_temp_storage, temp_storage_bytes, lengths, lengths, maxlength);
    //cudaDeviceSynchronize();

    cudaFree(d_temp_storage);

}

1 个答案:

答案 0 :(得分:0)

是的,每次CUB调用后都需要cudaDeviceSynchronize()。请注意评论同步调用在问题中的位置。我花了很多时间来追踪为什么我的总和没有正确计算甚至一致。最后,我发现在NSIGHT调试器中行进时,只有当我在每个CUB函数之后放置断点时,计算才是正确的。