0

我运行了一些更新浮点数组的 CUDA 代码。我有一个包装函数,如如何编译 CUDA 代码然后将其链接到 C++ 项目?这个问题。

在我的 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“更新”函数,然后在该函数内部启动一百万的 for 循环?

4

1 回答 1

0

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

第二件事,执行时间更长的原因,是因为每次内核启动都有固定的开销时间。当您在内核中有循环时,您会经历一次这种开销并运行循环。现在你正在经历 X 次。开销相当小,但足够大,应该将尽可能多的循环放在内核中。

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

于 2012-03-26T06:01:59.760 回答