【发布时间】:2021-02-18 09:32:32
【问题描述】:
我编写了简单的代码来使用 GPU 对数组求和。我使用一维网格和块。每个块计算数组的“2 倍块大小”元素并将这些元素减少到 1 个值。然后主机代码将对这些块的减少值求和。代码如下:
__global__ void reduceBlksKernel1(int * in, int n, int * out) {
int i = blockIdx.x * blockDim.x * 2 + threadIdx.x * 2;
for (int stride = 1; stride < 2 * blockDim.x; stride *= 2) {
if (threadIdx.x % stride == 0) {
if (i + stride < n) {
in[i] += in[i + stride];
}
}
__syncthreads();
}
// use 1 thread to write the reduced value to out array
if (threadIdx.x == 0) {
out[blockIdx.x] = in[blockIdx.x * blockDim.x * 2];
}
}
我使用 Google colab,这里是 GPU 的信息:
我已经用不同的块大小运行了一些测试:
有人可以帮我解释为什么执行时间会随着每个 SM 的更多块而减少,尽管事实上所有情况下的占用数都是 100%?谢谢!
【问题讨论】:
标签: c++ architecture cuda gpu nvidia