请问大家,我的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 一样。