【问题标题】:Cuda grid size limitationsCuda 网格大小限制
【发布时间】:2015-07-25 00:09:20
【问题描述】:

对于我可以设置 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 上。

【问题讨论】:

  • 你是指块大小而不是网格大小吗? 1024 是自 cc 2.0 以来每个块的最大线程数。
  • @void_ptr 可能。介绍性示例使用单个块并不少见(也许是为了简化blockIdx/threadIdx...-hassle?),当人们使用“模板”之类的示例时,他们很快就会达到 max-threads-per-block-limit 实际上想要增加grid的大小。
  • 不,我特别指的是网格大小。这是我今天遇到的一个非常奇怪的问题。
  • 是的,有限制。请参阅编程指南中的表 11 和 12 或运行 deviceQuery Cuda 示例代码。如果您想知道为什么特定代码不起作用,您应该提供 MCVE
  • 好吧,除了最大的最大块数吗?

标签: cuda


【解决方案1】:

您在调用内核时混淆了块大小和网格大小。

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 的块会失败。

【讨论】:

  • 该死的,我觉得自己很笨,谢谢你看到这个。这些实际上是我的代码中仅有的两个内核,我做了 facepalm。即使在我为证明我的问题而编写的代码中也没有这样做......
猜你喜欢
  • 1970-01-01
  • 2013-07-18
  • 2023-03-23
  • 2013-05-14
  • 1970-01-01
  • 2019-07-09
  • 1970-01-01
  • 2021-01-07
  • 1970-01-01
相关资源
最近更新 更多