block数量

请问大家,我的gpu参数如下图,它有多少个block啊?请问block的数量是如何计算的呢?非常感谢啊!

楼主好!

你不能说你的GPU有几个block,正如你不能说一个CPU含有几个进程一样。

block是一个kernel在运行时刻的构成部分,它驻留在SM上,占据着SM的资源,并在其上执行。

所以你可以说:对某个特定的kernel, 在运行的时候,一个SM上(或者整个GPU上), 可以同时上多少个blocks(这依赖于你的kernel的资源占用和block shape), 而不能直接的说,“GPU有几个blocks"。

希望你能理解。

再请问一下,gpu的8总存储器,可以映射block的有哪几种啊?谢谢!!

8总?8种?

block和存储器没啥映射关系的,不甚理解3#的问题。

您的“8种存储器”,和"映射blocks"之间不具有因果关系。

如同我问楼主,您的8个钱包,哪个游泳更快?

:D谢谢啊!

谢了哈,ice!

请问,从这图里可以看出在这个GPU里能同时运行多少个block么?谢谢!

图中无法直接看出。
事实上您的GPU可以同时运行/加载(resident)多少个blocks取决于您的GPU有多少个MP(SM/SMX)以及每个MP上有多少个blocks。

前者可以从您的图上直接看出,是2个MP。
后者取决于您block的大小和资源占用情况,但是kepler架构下,这一数值最大为16。

详情可以参考这个链接的内容
http://docs.nvidia.com/cuda/cuda-c-programming-guide/index.html

祝您编码愉快~

假如最大值是16个block,如果我用了50个block,那么在运行时,其余34个是不是就应该排队等候执行呢?

假如您的block大小合适,那么每个MP上最多可以加载16个blocks(fermi是8个)。

您的GPU有2个MP,所以最多可以加载32个blocks。

剩下的都在等待,前面有运行结束的block的话,后面的会补上去。

祝您编码愉快~

明白了。谢谢ice版主!

不客气,欢迎常来论坛转转~:3_48::3_48::3_48:

您再帮我看看这一小段代码啊,


if ( tid == Itmin )
{
ex[tid] = ex[tid] - FE*( hy[tid] - ( hy[tid-1] + Hin ) );
printf("\n ex[Itmin] = %f", ex[Itmin] );                                     (1)
}

 
 
if ( tid == ( Itmin - 1 ) )
{
hy[tid] = hy[tid] - FH*( ex[tid+1] - ex[tid] - Ein);
printf("\n hy[Itmin-1] = %f", hy[tid] );
printf( "\n ex[Itmin] = %f", ex[tid + 1] );                                     (2)

}

安道理来说,第1和第2个ex[Itmin]的值应该是一样的啊,可是输出的结果却不一样。我实在不知道毛病在哪里了,请您指教啊?

目测了一下,并不确定问题究竟在哪里,不过建议加上适当的线程同步,然后再看下。

if ( tid == Itmin )
{
ex[tid] = ex[tid] - FE*( hy[tid] - ( hy[tid-1] + Hin ) );
printf("\n::::::::::::::::::::::::::::::::::::ex[Itmin] = %f", ex[Itmin] );                                    1
__syncthreads();
}

 
if ( tid == 1 )
{
printf("\n______________________________ex[Itmin] = %f", ex[Itmin] );                     2
}



if ( tid == ( Itmin - 1 ) )
{
hy[tid] = hy[tid] - FH*( ex[tid+1] - ex[tid] - Ein);
printf("\n::::::::::::::::::::::::::::::::hy[Itmin-1] = %f ", hy[tid] );
printf( "\n///////////////////////////////ex[Itmin] = %f", ex[tid + 1] );                                              3
__syncthreads();

}

加上同步,还加上了一个测试代码2. 可是这三个的(1、2、3)ex[Itmin]值还是不一样啊。这是为什么呢?

我觉得如果将__syncthreads()放在数值更新之后,打印输出之前更合适一些。

另外如果您实现的是一维情况下两个点的源更新(一个e,一个h)的话,那么其实可以简单写为

if(tid==0)
{ ex[Itmin] upgrade;
hy[Itmin-1] upgrade;
__syncthreads();
printf ex,hy;
}

即让thread 0把这个活都干了。

而您如果是将源更新和场更新写到一起去了的话,其实还是建议分开的。
个人意见,仅供参考。

祝您编码愉快,早日修成“BUG退散,风轻云淡”成就。

问题解决了,谢谢ice版主!追加一个问题哈。为什么我的vs 代码有的部分会突然变灰呢?

但是能正常运行。

不客气,灰色的似乎表示这是一个变量。

不是啊,是一大段代码都变灰了。就像加了#if 0 ……#endif 一样。