CUDA:网格中的最大块数!= CU_DEVICE_ATTRIBUTE_MAX_GRID_DIM_X?

Posted

技术标签:

【中文标题】CUDA:网格中的最大块数!= CU_DEVICE_ATTRIBUTE_MAX_GRID_DIM_X?【英文标题】:CUDA: Maximum number of blocks in a grid != CU_DEVICE_ATTRIBUTE_MAX_GRID_DIM_X? 【发布时间】:2013-11-07 05:47:14 【问题描述】:

我想以这种方式启动内核:

kernel_code<<<NUMBER_BLOCKS, NUMBER_THREADS_PER_BLOCK>>> (param1, param2, param3, param4);

因此,仅使用网格的 x 维度。我想用尽可能多的块来调用内核。我以为最大。一维网格中的块数为 65535。

但是,我探索了常量CU_DEVICE_ATTRIBUTE_MAX_GRID_DIM_X,这听起来与我想找出的数字完全相同。但是,这个常数在我的 GeForce 210 (CUDA 1.2) 上返回 1899336。我哪里错了?

【问题讨论】:

所以你怀疑什么是 CU_DEVICE_ATTRIBUTE_MAX_GRID_DIM_X ?还是别的什么? 我正在寻找最大值。当我以上面显示的方式调用它时,我可以分配给内核的块数(仅使用一个维度)。根据 API CU_DEVICE_ATTRIBUTE_MAX_BLOCK_DIM_X 是“块的最大 x 维度”,这似乎是指我可以分配给一个块的维度的最大线程数。因此,这可能不是我要找的号码。 所以 CU_DEVICE_ATTRIBUTE_MAX_BLOCK_DIM_X 是错误的常数是正确的。但是什么值才是正确的值呢? 【参考方案1】:

参考cuDeviceGetAttribute的驱动API文档,给出网格x方向最大块数的参数是:

•CU_DEVICE_ATTRIBUTE_MAX_GRID_DIM_X:网格的最大 x 维度;

正如您所猜测的,您指定的参数给出了一个块中的最大线程数(x 维度):

•CU_DEVICE_ATTRIBUTE_MAX_BLOCK_DIM_X:块的最大 x 维度;

在GeForce 210 上,MAX_GRID_DIM_X 参数应为 65535。(True for all cc 1.x devices.)

如果您收到其他号码,则您用于检索此数据的代码有问题(您没有显示),或者您的机器设置有问题。

尝试运行并检查 CUDA 驱动程序 API deviceQuery sample 的代码。

【讨论】:

以上是关于CUDA:网格中的最大块数!= CU_DEVICE_ATTRIBUTE_MAX_GRID_DIM_X?的主要内容,如果未能解决你的问题,请参考以下文章

CUDA 估计每个块的线程数和 2D 网格数据的块数

内核网格大小是不是决定块数,而块大小决定线程数?

为啥允许我运行块数超过 GPU 的 CUDA 核心数的 CUDA 内核?

CUDA 的 Mersenne Twister 用于任意数量的线程

你能以编程方式知道 GPU 中每个块的最大块数和线程数吗?

通过更改线程数更改 CUDA 代码输出的说明