【发布时间】:2016-04-04 03:51:02
【问题描述】:
我了解#pragma unroll 的工作原理,但如果我有以下示例:
__global__ void
test_kernel( const float* B, const float* C, float* A_out)
{
int j = threadIdx.x + blockIdx.x * blockDim.x;
if (j < array_size) {
#pragma unroll
for (int i = 0; i < LIMIT; i++) {
A_out[i] = B[i] + C[i];
}
}
}
我想确定上面内核中LIMIT 的最佳值,它将以x 线程数和y 块数启动。 LIMIT 可以是从 2 到 1<<20 的任意位置。由于 100 万对于变量来说似乎是一个非常大的数字(展开的 100 万个循环会导致寄存器压力,我不确定编译器是否会这样做),如果有的话,什么是“公平”数字?我如何确定这个限制?
【问题讨论】:
-
什么是
A、B和C,它们存储在哪里?为什么循环是完全串行的?您希望从看起来是线程局部变量的完全串行循环中获得什么好处? -
A、B、C 是全局的,不是内核本地的。这可能是一个不好的例子,但我只是想弄清楚我能真正展开多少?
-
要么这是一个非常不好的例子,要么你从根本上误解了 CUDA 的工作原理。你能把它扩展成一个有人可以编译的实际内核吗?
-
我用一个内核编辑了它,可以用类似
test_kernel<<<1, 1>>>(d_idata_B, d_idataC, d_odataA);的东西调用
标签: cuda pragma loop-unrolling