【问题标题】:Looping inside cuda code在 cuda 代码中循环
【发布时间】:2012-03-01 14:20:18
【问题描述】:

我运行了一些更新浮点数组的 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“更新”函数,然后在该函数中启动一百万次 for 循环?

【问题讨论】:

  • 当您使用较大的 X 值时,您的内核会执行吗?你在做任何错误检查吗?你应该。 X 是编译时常量还是#define?如果是这样,您是否使用适当的编译器标志检查共享和常量内存要求以及寄存器数量?然后,您是否正在使用 NVIDIA CUDA 占用计算器探索后果?很多事情都可能发生。
  • 谢谢帕特里克... X 只是本文中的一个变量。我通常用“1000000”之类的硬编码值替换“x”,Talonmies 的帖子很好,我相信这就是为什么......

标签: cuda nvcc


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 2014-03-30
    • 2020-12-28
    • 2022-07-24
    • 2017-07-20
    • 1970-01-01
    • 2019-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多