2014-03-28 2 views
0

CUDA에서 작은 프로젝트를 구현하려고합니다. 초기 데이터 세트는 :CUDA : 배열에 저장된 전역 메모리의 주소

  • 주소 (부호없는 정수와 같은 위치)와 어레이 (pos)
  • 제 배열에 저장된 주소)
  • 에 기초하여 액세스 할 수있는 다른 배열 ( data)
  • 일부 계산 결과를 포함하는 배열 (res) (이 예에서는 데이터 일관성을 확인하기 위해 모든 요소에 값 1 만 기록합니다).

다음 프로그램 :

__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 이후

+0

몇 가지 누락 된 정보를 추가 할 수 있습니까? 'WIDTH' 값과 커널 호출 행. 그리고 N_SAMPLES. – Sigismondo

+0

요청한 정보를 추가했습니다. –

+0

코드에 쓸모없는 정보가 많이 있다는 것을 깨달았습니다. 나는 그것이 문제가되도록 문제를 줄이려고 노력할 것이다. –

답변

0

는 제외 당신의 코드에서 경우를 삽입해야 BLK_SIZE에 의해 divisable없는 아웃 오브 바운드 굴절률들 :

사실 idx에서
__global__ 
void testKernel (unsigned int *res, const unsigned int *data, unsigned int *pos) 
{ 
    int idx = blockIdx.x*blockDim.x + threadIdx.x; 
    if (idx < WIDTH) { 
     ... 
    } 
} 

가에서, 커널에서 512 0에서 것입니다 지정한 크기의 blockDim에 독립적으로 32 개 (워프 크기)의 블록이 있습니다 (이 경우 여러 개이므로 여기서 문제가되지 않습니다).

+0

네, 맞습니다. 일반적인 실수로 저장된 주소와 관련된 문제가 아닌 것 같습니다. 할당되지 않은 데이터 위치에 액세스하려고했습니다. 고맙습니다! –

관련 문제