在cuda代码中循环

时间:2012-03-01 14:20:18

标签: cuda nvcc

我运行了一些更新了浮点数组的CUDA代码。我有一个像How can I compile CUDA code then link it to a C++ project?这个问题讨论的包装函数。

在我的CUDA函数中,我创建了一个这样的for循环......

int tid = threadIdx.x;
for(int i=0;i<X;i++)
{
     //code here
}

现在的问题是,如果X等于100的值,一切正常,但如果X等于1000000,我的向量不会更新(几乎就像for循环中的代码没有得到执行)

现在在包装器函数中,如果我在for循环中调用CUDA函数,它仍然可以正常工作(但由于某些原因,因为我只是在CPU上执行相同的处理,因此速度明显较慢)。 ..

for(int i=0;i<1000000;i++)
{
      update<<<NumObjects,1>>>(dev_a, NumObjects);
}

有谁知道为什么我可以在包装函数中循环一百万次而不是简单地调用CUDA“update”函数一次然后在该函数内部启动一个百万的for循环?

1 个答案:

答案 0 :(得分:0)

运行此命令后,您应该使用cudaThreadSynchronize和cudaGetLastError来查看是否存在错误。我想象第一次,它超时了。如果内核需要很长时间才能完成,就会发生这种情况。这张卡就放弃了。

第二件事,执行需要更长时间的原因是因为每次内核启动都有一个设定的开销时间。当您在内核中进行循环时,您会遇到此开销并运行循环。现在你正在经历X次。开销相当小,但足够大,以至于尽可能多的循环应该放在内核中。

如果X特别大,你可能会考虑在内核中运行尽可能多的循环,直到它在一段安全的时间内完成,然后遍历这些内核。