小白提个问题,grid里的block数
cuda吧
全部回复
仅看楼主
level 2
VX186743879 楼主
就把一个一维数组每个元素做个计算,每个block里放256个thread,blockDim输出出来是(256,1,1);然后block的数量是
blocksPerGrid = (N - 1) / threadsPerBlock + 1;
比如他是16384的时候gridDim输出出来就是(16384,1,1)
然后。。。。每当block数到32768的时候返回的计算结果就全变成0了,,连gridDim和blockDim都无法输出了。改变threadsPerBlock,比如取512,也是到32768就出错。
随后我把blocksPerGrid改成二维的,x方向512个,y方向根据数组长度定,结果试到512*512都没有再出错,这时gridDim输出出来是(512,512,1)。
问题是,为什么gridDim.x不能到32768?blocksPerGrid定义成了int,dim3的定义也是uint3,不存在溢出问题。
2016年06月10日 01点06分 1
level 7
grid中的block数量是有限制的,虽然类型是uint
2016年06月10日 13点06分 2
为什么会分开限制x,而不是限制x*y*z呢?这是GPU体系结构的考虑吗? 后来改成512*512已经远超32768了也没事。
2016年06月10日 16点06分
@VX186743879 是的,不同计算能力的显卡,对x,y,z限制不同
2016年06月11日 03点06分
level 1
通过下列代码测试一下你的GPU的性能
————————————————————
#include "../common/book.h"
int main( void ) {
cudaDeviceProp prop;
int count;
HANDLE_ERROR( cudaGetDeviceCount( &count ) );
for (int i=0; i< count; i++) {
HANDLE_ERROR( cudaGetDeviceProperties( &prop, i ) );
printf( " --- General Information for device %d ---\n", i );
printf( "Name: %s\n", prop.name );
printf( "Compute capability: %d.%d\n", prop.major, prop.minor );
printf( "Clock rate: %d\n", prop.clockRate );
printf( "Device copy overlap: " );
if (prop.deviceOverlap)
printf( "Enabled\n" );
else
printf( "Disabled\n");
printf( "Kernel execution timeout : " );
if (prop.kernelExecTimeoutEnabled)
printf( "Enabled\n" );
else
printf( "Disabled\n" );
printf( " --- Memory Information for device %d ---\n", i );
printf( "Total global mem: %ld\n", prop.totalGlobalMem );
printf( "Total constant Mem: %ld\n", prop.totalConstMem );
printf( "Max mem pitch: %ld\n", prop.memPitch );
printf( "Texture Alignment: %ld\n", prop.textureAlignment );
printf( " --- MP Information for device %d ---\n", i );
printf( "Multiprocessor count: %d\n",
prop.multiProcessorCount );
printf( "Shared mem per mp: %ld\n", prop.sharedMemPerBlock );
printf( "Registers per mp: %d\n", prop.regsPerBlock );
printf( "Threads in warp: %d\n", prop.warpSize );
printf( "Max threads per block: %d\n",
prop.maxThreadsPerBlock );
printf( "Max thread dimensions: (%d, %d, %d)\n",
prop.maxThreadsDim[0], prop.maxThreadsDim[1],
prop.maxThreadsDim[2] );
printf( "Max grid dimensions: (%d, %d, %d)\n",
prop.maxGridSize[0], prop.maxGridSize[1],
prop.maxGridSize[2] );
printf( "\n" );
}
}
——————————————————————————————
本人GeForce GTX 850M
Max grid dimensions :(2147483647, 65535, 65535);
2016年06月12日 14点06分 3
level 6
我记得cuda高性能运算提到过,block数量写成(x,y,z)形式x的最大值比单写x的大。
2016年06月23日 08点06分 4
1