CUDA에서 작은 프로젝트를 구현하려고합니다. 초기 데이터 세트는 :CUDA : 배열에 저장된 전역 메모리의 주소
- 주소 (부호없는 정수와 같은 위치)와 어레이 (
pos
) - 제 배열에 저장된 주소) 에 기초하여 액세스 할 수있는 다른 배열 (
- 일부 계산 결과를 포함하는 배열 (
res
) (이 예에서는 데이터 일관성을 확인하기 위해 모든 요소에 값 1 만 기록합니다).
data
)
다음 프로그램 :
__global__
void testKernel (unsigned int *res, const unsigned int *data, unsigned int *pos)
{
int idx = blockIdx.x*blockDim.x + threadIdx.x;
int x = pos[idx];
int foo = data[x]; // if I take out this line it works properly
res[idx] = 1;
}
이 (data
에 저장된 것과 유사) res
배열에 이상한 값을 서면 끝이 아닌 1
호출이나이 같이 보입니다 :
#define WIDTH = 500
#define BLK_SIZE = 64
void main() {
int blockSize = BLK_SIZE;
int nBlocks = (WIDTH + BLK_SIZE - 1)/blockSize;
// memory allocations: res[WIDTH]; data[DATA_WIDTH]; pos[WIDTH]
// sanity checks for positions
// H2D memory transfers
testKernel <<<nBlocks,blockSize>>>(res_d, data_d, pos_d);
// D2H memory transfers
// free memory
}
지금은 모든 항목에 대해 전역 메모리를 사용하고 있습니다. 나는 초기 구현에 도달하려고 노력하고있다. 메모리 할당, 전송 및 커널 호출이 정확합니다.
이 작업을 올바르게 해결할 다른 방법이 있습니까? 그렇다면 무엇이 이상한 결과를 초래 했습니까? WIDTH
이후
몇 가지 누락 된 정보를 추가 할 수 있습니까? 'WIDTH' 값과 커널 호출 행. 그리고 N_SAMPLES. – Sigismondo
요청한 정보를 추가했습니다. –
코드에 쓸모없는 정보가 많이 있다는 것을 깨달았습니다. 나는 그것이 문제가되도록 문제를 줄이려고 노력할 것이다. –