다음과 같은 계산을 수행해야합니다. A [x] [y] = 합계 (z = 0에서 z = n까지) {B [x] [y] [ 행렬 A는 차원 [높이] [너비]와 행렬 B를 가지며, C는 차원 [높이] [너비] [n]을 갖는다] [z] + C [x] [y] [z] 나는 각 블록은 공유 메모리를 자신이 있기 때문에 각 블록은 하나 개의 합계를 계산하고 싶은공유 메모리를 사용하는 3 차원 배열의 1 차원 이상의 합계
index = 0;
for (z = 0; z<n; ++z)
for(y = 0; y<width; ++y)
for(x = 0; x<height; ++x) {
matrix[index] = value;
index++;
}
:
값은 같은과 메모리에 매핑됩니다.
dim3 block (n, 1, 1);
dim grid (height, width, 1);
커널 : 글로벌 메모리의 코드
부 : 나는 atomicAdd,이 같은 것을 사용 데이터 경주을 방지하기 위해
atomicAdd(&(A[blockIdx.x + blockIdx.y*gridDim.y]),
B[blockIdx.x + blockIdx.y*gridDim.y+threadIdx.x*blockDim.x*blockDim.y]
+ C[blockIdx.x + blockIdx.y*gridDim.y+threadIdx.x*blockDim.x*blockDim.y]);
나는 합계를 계산하는 공유 메모리를 사용하고 싶습니다 이 결과를 전역 메모리로 복사하십시오.
공유 메모리로 작업하는 방법을 잘 모르겠습니다. 각 블록의 공유 메모리에는 하나의 숫자 (합계 결과) 만 저장됩니다. 이 숫자를 전역 메모리에있는 A 행렬의 올바른 위치에 어떻게 복사해야합니까?
그러나 각 스레드가 입력 행렬의 z 축을 통과 할 때 계산이 직렬화됩니다. 그렇지 않습니까? – user1281071
각 스레드는 z = 0에서 값을 계산 한 다음 z = 1로 이동합니다. 이것은 직렬화된다. 각 z에 대해 글로벌 메모리에 액세스해야합니다. 나는 그것을 좋아할 것이다. – user1281071
코드를 이해하는 방법 : 평면 z = 0에서 시작합니다. 평면 z = 0에있는 모든 요소는 전역에서 읽혀집니다. 그런 다음 결과가 계산되고 전역 메모리에 저장됩니다. z = 1로 이동합니다. 평면 z = 1에있는 모든 요소는 전역에서 읽혀집니다. 그런 다음 전역 메모리에서 이전 결과에 추가 된 결과 (전역 메모리 읽기 및 쓰기)가 계산됩니다. 그러면 z = 2로 이동합니다 ... 이것이 올바른 경우 모든 추가에서 전역 메모리에 대한 액세스와 직렬화가 있습니다. – user1281071