【发布时间】: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 的帖子很好,我相信这就是为什么......