我观察到在内核中填充数组比使用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;
}
现在有两个问题:
根据Nsight的数据,thrust::fill
需要大约1200 us来填充数组,而set0
内核在44 us中完成它。我的代码有什么问题thrust::fill
如此慢,如果它真的比内核慢得多,为什么它应该被使用呢?
似乎set0
内核没有在第一个循环中启动,即i=0
(至少Nsight没有在CUDA启动列表中显示它)。但它确实在第二个循环中。有什么问题?
我在特斯拉K20X上运行程序。 CUDA版本是7.0。
提前致谢。
更新(基于@RobertCrovella评论)
CUDA8.0 + GTX 1050TI的测试结果: