Cuda 网格大小限制
Cuda grid size limitations
我可以将 CUDA 内核的网格大小设置为多少有限制吗?我 运行 遇到了一个问题,即内核无法以 33 x 33 的网格大小启动,但能够在网格大小为 32 x 32 时启动。是否有任何原因会发生这种情况?或者将块数从 32 x 32 更改为 33 x 33 是否可能打破了其他一些限制?
dim3 blockSize(8, 8);
dim3 gridSize(32, 32);
cudaDeviceSynchronize();
set_start<<<gridSize, blockSize>>>(some_params);
以上有效。
dim3 blockSize(8, 8);
dim3 gridSize(33, 33);
cudaDeviceSynchronize();
set_start<<<gridSize, blockSize>>>(some_params);
上面的不行。
内核和主要:
__global__
void set_start(double * const H , double * const HU , double * const HV ,
double * const E , const int Na)
{
int j = threadIdx.x + blockIdx.x*blockDim.x + 1;
int i = threadIdx.y + blockIdx.y*blockDim.y + 1;
if(i >= Na-1 || j >= Na-1)
return;
H[i*Na+j] = 1.0 + exp(-100.0*((E[j-1]-0.75)*(E[j-1]-0.75)+(E[i-1]-0.75)*(E[i-1]-0.75))) + 0.5*exp(-100.0*((E[j-1]-0.75)*(E[j-1]-0.75)+(E[i-1]-0.25)*(E[i-1]-0.25)));
HU[i*Na+j] = 0;
HV[i*Na+j] = 0;
}
int main(int argc, char** argv){
double* E_d;
cudaMalloc(&E_d, sizeof(double) * (Nh+1));
set_E<<<64, (Nh/64) + 1>>>(E_d, dx, Nh);
int Na = 259;
double *H_d, *HU_d, *HV_d, *Ht_d, *HUt_d, *HVt_d;
cudaMalloc(&H_d , sizeof(double) * Na * Na);
cudaMalloc(&HU_d, sizeof(double) * Na * Na);
cudaMalloc(&HV_d, sizeof(double) * Na * Na);
dim3 blockSize(8, 8);
//dim3 gridSize(((Na-1)/blockSize.x) + 1, ((Na-1)/blockSize.y) + 1);
//dim3 gridSize(33, 33);
dim3 gridSize(32, 32);
cudaDeviceSynchronize();
set_start<<<blockSize, gridSize>>>(H_d, HU_d, HV_d, E_d, Na);
}
这是在 CUDA 7.0 上进行的。
调用内核时混淆了块大小和网格大小。
set_start<<<blockSize, gridSize>>>(H_d, HU_d, HV_d, E_d, Na);
应改为:
set_start<<<gridSize, blockSize>>>(H_d, HU_d, HV_d, E_d, Na);
由于这个错误,您实际上是在尝试启动大小为 blockSize 的网格和大小为 gridSize 的块。您的 GPU 上块的最大大小似乎是 1024 个线程,因此启动 33x33 块失败。
我可以将 CUDA 内核的网格大小设置为多少有限制吗?我 运行 遇到了一个问题,即内核无法以 33 x 33 的网格大小启动,但能够在网格大小为 32 x 32 时启动。是否有任何原因会发生这种情况?或者将块数从 32 x 32 更改为 33 x 33 是否可能打破了其他一些限制?
dim3 blockSize(8, 8);
dim3 gridSize(32, 32);
cudaDeviceSynchronize();
set_start<<<gridSize, blockSize>>>(some_params);
以上有效。
dim3 blockSize(8, 8);
dim3 gridSize(33, 33);
cudaDeviceSynchronize();
set_start<<<gridSize, blockSize>>>(some_params);
上面的不行。
内核和主要:
__global__
void set_start(double * const H , double * const HU , double * const HV ,
double * const E , const int Na)
{
int j = threadIdx.x + blockIdx.x*blockDim.x + 1;
int i = threadIdx.y + blockIdx.y*blockDim.y + 1;
if(i >= Na-1 || j >= Na-1)
return;
H[i*Na+j] = 1.0 + exp(-100.0*((E[j-1]-0.75)*(E[j-1]-0.75)+(E[i-1]-0.75)*(E[i-1]-0.75))) + 0.5*exp(-100.0*((E[j-1]-0.75)*(E[j-1]-0.75)+(E[i-1]-0.25)*(E[i-1]-0.25)));
HU[i*Na+j] = 0;
HV[i*Na+j] = 0;
}
int main(int argc, char** argv){
double* E_d;
cudaMalloc(&E_d, sizeof(double) * (Nh+1));
set_E<<<64, (Nh/64) + 1>>>(E_d, dx, Nh);
int Na = 259;
double *H_d, *HU_d, *HV_d, *Ht_d, *HUt_d, *HVt_d;
cudaMalloc(&H_d , sizeof(double) * Na * Na);
cudaMalloc(&HU_d, sizeof(double) * Na * Na);
cudaMalloc(&HV_d, sizeof(double) * Na * Na);
dim3 blockSize(8, 8);
//dim3 gridSize(((Na-1)/blockSize.x) + 1, ((Na-1)/blockSize.y) + 1);
//dim3 gridSize(33, 33);
dim3 gridSize(32, 32);
cudaDeviceSynchronize();
set_start<<<blockSize, gridSize>>>(H_d, HU_d, HV_d, E_d, Na);
}
这是在 CUDA 7.0 上进行的。
调用内核时混淆了块大小和网格大小。
set_start<<<blockSize, gridSize>>>(H_d, HU_d, HV_d, E_d, Na);
应改为:
set_start<<<gridSize, blockSize>>>(H_d, HU_d, HV_d, E_d, Na);
由于这个错误,您实际上是在尝试启动大小为 blockSize 的网格和大小为 gridSize 的块。您的 GPU 上块的最大大小似乎是 1024 个线程,因此启动 33x33 块失败。