【发布时间】:2022-07-12 00:07:02
【问题描述】:
我已经开始使用 CUDA 实现一个简单的一维数组计算。按照文档,我首先尝试定义最佳块数和块大小
...
int N_array = 1000000
...
int n_threads = 256;
int n_blocks = ceil(float(N_array / n_threads));
dim3 grid(n_blocks, 1, 1);
dim3 block(n_threads, 1, 1);
...
对于内核,我使用了 nvidia 博客中建议的网格步长方法
...
int global_idx = blockIdx.x * blockDim.x + threadIdx.x;
int stride = gridDim.x * blockDim.x;
int threadsInBlock = blockDim.x;
for (unsigned long long n = global_idx; n < N_array; n += stride) {
...
我的问题是:
-
可以像以前一样定义块数吗?还是应该将它们定义为请求的线程总数小于可用的 CUDA 内核数? (认为这种方式的块将通过进行更多计算来利用网格步长循环)。
-
由于对于这个大型数组,请求的线程数大于 CUDA 内核数,如果有许多块处于非活动状态,是否会受到惩罚?与请求更少的块并保持大部分活跃相比? (这与1有关。)
【问题讨论】:
标签: c++ multithreading cuda nvidia