block size and grid size 设定时有什么讲究吗?

版主大大,俺又来麻烦您了:
我用deviceQuery查看了一下我的GPU, 报告显示: Maximum number of threads per block: 1024.
因此,我在程序中的设定为:
Kernel_A.ThreadBlockSize = [1024 1];
Kernel_A.GridSize = [92496 1];
92496是一帧图像的像素点(我把每个图素点作为一个block, 而每个block 里的 threads 进行针对该像素点的其它操作.)
不过调试时报错:
CUDA grid launch failed: CUcontext: 13987224 CUmodule: 14022424 Function: _Z16Kernel_APKiiiii
Stepper Failed: Trying to step invalid warp.
Stepper Failed: Trying to step invalid warp.
Cannot step because there is no current CUDA thread.

之前我测试时,Kernel_A.GridSize = [512 1]; 程序可以正常运行. 是不是grid size设定太大了呢?
我的computing capacity 是3.0的. 在设定grid size时有什么讲究么?
谢谢版主~~

楼主您好,

在3.0里面,如果只是从(512,1,1)改成了(1024,1,1)的block形状配置,则是总是能启动的。

我建立楼主您这样:
your_kernel<<<…>>>(…);
printf(“%s\n”, cudaGetErrorString(cudaDeviceSynchronize()));
然后看看输出的错误信息是什么,这样可以知道为何您会被报告cuda grid launch failed的原因。

请按提示操作。谢谢。

千军版主您好,我按您的提示:
MY_kernel<<<92496 , 1024>>>(…);
printf(“%s\n”, cudaGetErrorString(cudaDeviceSynchronize()));
现在情况是:
输出的信息为:no error;
不过用Nsight调试, 不能进入到Kernel函数内.
但如果改成:
MY_kernel<<<6000 , 1024>>>(…);
程序可以运行, 也能进入到Kernel函数内单步调试…
是否gridsize有什么限制呢?
我刚看了一下硬件信息:
Multiprocessor count: 7
maximum threads per multiprocessor: 2048
是否意思着同一时间只能加载 7*2048 threads 呢?
多谢啊, 刚接触GPU, 所以请版主见谅问题比较小白…:blush:

楼主您好,

如果描述属实,我没有见过您这种:
(1)直接运行是no error
(2)nsight下启动提示cuda grid launch failed

因此无法回答您的这个问题。
(话说我也没见过其他人遇到这种情况,真心奇葩了,要不楼主重新安装下最近的驱动,toolkit/nsight看下? 深刻怀疑是驱动版本的问题。建议升级下前者,以及后者)

谢谢。

版主,我现在前来汇报情况:
经过这两天分析, 原来是程序中的数据长度越界的问题…惭愧…
再次感谢版主大大~~:D

额。你说的对。

这是有可能的,在NSight下检查的更严格。

但是话说回来,此时应该提示你某某处Access Violation的,但是你的NSight却没有提示,真心奇怪了。

是啊,这点也没理解.另外,我做了下测试:
如果block形状配置成(1024,1,1), 那么最大的block数为: 65535.
但是deviceQuery查询显示可以 非常 大呀.

LZ您好:

如果您是计算能力3.0之前的GPU,然后仅仅使用一维grid,那么最多就是65535个blocks了。
但是grid可以上二维甚至三维的,每个维度都可以上到65535,所以一共可以上655356553565535个blocks。

以及如果您使用最新的kepler GPU,直接使用一维的grid也可以用到2^31-1个block,立即解决您的烦恼。

祝您好运~

多谢版主~~
另外,有个问题我没有搞清楚想再请教一下:
一个thread 有一个对应的物理 processor, 但三维是什么意思呢? 比如threadIdx.x, threadIdx.y, threadIdx.z 代表什么意思呢, 是指一个硬件处理器, 还是有三个硬件处理器呢?
:lol

楼主您好,您在理解中有几个错误,需要为您指出:

(1)一个thread不对应任何一个固定的SP(实际上,它可能同时在多个SP上,以及SFU上等单位上被执行着)。

(2)一个三维的标示只是用来索引的,而不是同时存在3个线程。
例如你站在人群里,人群有10行8列,你的位置是(5,7),请问此时你站立在这里,你是一个人或者两个人?这是显然的,你还是你自己,只是你的位置标识(5,7)是个2元素的向量而已。

感谢夜晚来访。

真心感激版主, 生动具体的解释. 多谢多谢:handshake