【发布时间】:2016-02-22 01:43:03
【问题描述】:
我有以下功能:
代码示例 1:
__global__ void func(const int *input, int N){
extern __shared__int buffer[];
int temp = 0;
for(int i = blockIdx.x*blockDim.x + threadIdx.x; i < N; i += blockDim.x*gridDim.x; ){
temp += input[i];
}
buffer[threadIdx.x] = temp;
__syncthreads();
}
它是并行归约函数的一部分。据我了解,它从全局内存复制到共享内存。
我试图通过一个简单的例子来理解它。例如我有一个大小为 20 的一维数组 元素(N = 20)。我想象执行如下。纠正我如果我错了。对于 5 个块,每个块 4 个线程。
第一个块的所有线程执行:
blockIdx.x=0
threadIdx.x=0
for(i=0; i<18; i+= 4*5){ temp= in[0] /i wrote the sums intuitively/}
buffer[threadIdx.x] = temp
blockIdx.x=0
threadIdx.x=1
for(i=1; i<18; i+= 4*5){ temp= in[1] /i wrote the sums intuitively/}
buffer[threadIdx.x] = temp
blockIdx.x=0
threadIdx.x=2
for(i=2; i<18; i+= 4*5){ temp= in[2] /i wrote the sums intuitively/}
buffer[threadIdx.x] = temp
blockIdx.x=0
threadIdx.x=3
for(i=3; i<18; i+= 4*5){ temp= in[3] /i wrote the sums intuitively/}
buffer[threadIdx.x] = temp
执行第二块的所有线程:
blockIdx.x=1
threadIdx.x=0
for(i=1*4; i<18; i+= 4*5){ temp= in[4] /i wrote the sums intuitively/}
buffer[threadIdx.x] = temp
blockIdx.x=1
threadIdx.x=1
for(i=1*4+1; i<18; i+= 4*5){ temp = in[5] /i wrote the sums intuitively/}
buffer[threadIdx.x] = temp
blockIdx.x=1
threadIdx.x=2
for(i=1*4+2; i<18; i+= 4*5){ temp = in[6] /i wrote the sums intuitively/}
buffer[threadIdx.x] = temp
blockIdx.x=1
threadIdx.x=3
for(i=1*4+3; i<18; i+= 4*5){ temp = in[7] /i wrote the sums intuitively/}
buffer[threadIdx.x] = temp
等
为什么我们有一个for循环而不是写:
代码示例 2:
unsigned int i = blockIdx.x*blockDim.x + threadIdx.x;
buffer[threadIdx.x] = input[i];
谁能给出一个直观的例子或解释?
【问题讨论】: