다음과 같은 계산이 필요합니다. A [x] [y] = sum {z = 0에서 z = n까지} {B [x] [y] [z] + C [x] y] [z]}의 행렬 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];
}
질문 2 : 계산을 더 빨리 할 수 있습니까?
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