A [x] [y] = sum {z = 0からz = n}まで{B [x] [y] [z] + C [x]行列Aは次元[高さ] [幅]、行列BはCは次元[高さ] [幅] [n]を有する。サム3D行列の合計
index = 0;
for (z = 0; z<n; ++z)
for(y = 0; y<width; ++y)
for(x = 0; x<height; ++x) {
matrix[index] = value;
index++;
}
Q1:
値は、のようなもので、メモリにマッピングされ、このクーダカーネルは大丈夫でしょうか?
idx = blockIdx.x*blockDim.x + threadIdx.x;
idy = blockIdx.y*blockDim.y + threadIdx.y;
for(z=0; z<n; z++){
A[idx*width+idy] += B[idx*width+idy+z*width*height] + C[idx*width+idy+z*width*height];
}
Q2:これは計算を高速化しますか?
idx = blockIdx.x*blockDim.x + threadIdx.x;
idy = blockIdx.y*blockDim.y + threadIdx.y;
idz = blockIdx.z*blockDim.z + threadIdx.z;
int stride_x = blockDim.x * gridDim.x;
int stride_y = blockDim.y * gridDim.y;
int stride_z = blockDim.z * gridDim.z;
while (idx < height && idy < width && idz < n) {
atomicAdd(&(A[idx*width+idy]), B[idx*width+idy+idz*width*height] + C[idx*width+idy+idz*width*height]);
idx += stride_x;
idy += stride_y;
idz += stride_z;
}
最大次元数= 2(CC用<2)= 3(CCため> = 2)。だから私は問題はないと思う。私は大きな行列を持っていますが、問題は見えません。 – user1281071
よかったです。私は自分の答えを更新しました。 – Azrael3000
あなたは次のようにします: 'if(idx> = height || idy> = width || idz> = n)return;'? – user1281071