我在循環展開CUDA時遇到了一些問題。CUDA循環展開
在正常的串行代碼:
//serial basic:
for(int i = 0; i < n; i++){
c[i] = a[i] + b[i];}
//serial loop unroll:
for(int i = 0; i < n/4; i++){
c[i] = a[i] + b[i];
c[i+1] = a[i+1] + b[i+1];
c[i+2] = a[i+2] + b[i+2];
c[i+3] = a[i+3] + b[i+3];}
所以我認爲CUDA循環展開如下:
int i = 2*(threadIdx.x + blockIdx.x * gridDim.x);
a[i+0] = b[i+0] + c[i+0];
a[i+1] = b[i+1] + c[i+1];
但在CUDA手簿中展開的例子我能不明白
這是一個普通的GlobalWrite內核:
__global__ void GlobalWrites(T *out, T value, size_t N)
{
for(size_t i = blockIdx.x*blockDim.x+threadIdx.x;
i < N;
i += blockDim.x*gridDim.x) {
out[i] = value;
}
}
展開內核:
template<class T, const int n> __global__ void Global_write(T* out, T value, size_t N){
size_t i;
for(i = n*blockDim.x*blockIdx.x + threadIdx.x;
i < N - n*blockDim.x*blockIdx.x;
i += n*gridDim.x*blockDim.x;)
for(int j = 0; j < n; i++){
size_t index = i + j * blockDim.x;
outp[index] = value;
}
for (int j = 0; j < n; j++) {
size_t index = i+j*blockDim.x;
if (index<N) out[index] = value;
}}
我知道這個內核使用較少的街區,但有人可以解釋爲什麼它工作得更好(N = 4,10%的速度向上)。
提出新問題。在您收到答案後不要更改這個。您有一個小時來保存您的編輯文本。之後,我將回復您的問題。 – talonmies