比较推力填充与内核启动速度

时间:2017-08-05 02:17:05

标签: cuda thrust

我观察到在内核中填充数组比使用thrust::fill要快得多。为了测试它,我写了一个简单的程序:

const uint N = 1e6; 

__device__ uint Val2[N];

__global__ void set0()
{
    uint index = __mul24(blockIdx.x, blockDim.x) + threadIdx.x;
    if (index < N)
    {
       Val2[index] = 0;
    }

}


int main()
{
    thrust::device_vector<uint> Val1(N);
    for (int i=0; i < 2; i++)
    {
       thrust::fill(Val1.begin(), Val1.end(),0);
       int numThreads = 512;
       uint numBlocks =  (uint)ceil( N / (double)numThreads);
       set0 << < numBlocks, numThreads >> >();
    }
    return 0;
}

现在有两个问题:

  1. 根据Nsight的数据,thrust::fill需要大约1200 us来填充数组,而set0内核在44 us中完成它。我的代码有什么问题thrust::fill如此慢,如果它真的比内核慢得多,为什么它应该被使用呢?

  2. 似乎set0内核没有在第一个循环中启动,即i=0(至少Nsight没有在CUDA启动列表中显示它)。但它确实在第二个循环中。有什么问题?

  3. 我在特斯拉K20X上运行程序。 CUDA版本是7.0。

    提前致谢。

    更新(基于@RobertCrovella评论)

    CUDA8.0 + GTX 1050TI的测试结果:

    Test results

0 个答案:

没有答案