2014-11-13 1 views
0

cudaMemcpy를 실행하기 위해 .cpp 파일에서 호출되는 메소드를 작성했습니다. 방법은 다음과 같습니다 :cudaMemCpy returned cudaInvalidData

void copy_to_device(uint32_t *host, uint32_t *device, int size) 
{ 
    cudaError_t ret; 
    ret = cudaMemcpy(device, host, size*sizeof(uint32_t), cudaMemcpyHostToDevice); 

    if(ret == cudaErrorInvalidValue) 
     printf("1!\n"); 
    else if(ret == cudaErrorInvalidDevicePointer) 
     printf("2!\n"); 
    else if(ret == cudaErrorInvalidMemcpyDirection) 
     printf("3!\n"); 
} 

내 .cpp 파일은 다음과 같이 그것을 호출

uint32_t *input_device; 
device_malloc(input_device, INPUT_HEIGHT*INPUT_WIDTH); 
uint32_t *oneDinput = TwoDtoOneD(input, INPUT_HEIGHT, INPUT_WIDTH); 
copy_to_device(oneDinput, input_device, INPUT_HEIGHT*INPUT_WIDTH); 

TwoDtoOneD가하는 모든 것은 2 차원 배열에 걸릴 및 1 차원 배열로 변환하고 그것을 돌려. 시도 할 때마다 copy_to_device 메서드를 사용하면 cudaErrorInvalidValue을 반환하며 이는 NVIDIA 웹 사이트에 잘 설명되어 있지 않습니다. 여러분은이 오류의 원인이되는 함수에 전달할 매개 변수에 무엇이 잘못되었는지 알 수 있습니까? 커널 실행 중에 문제가 발생합니다. 더 자세한 내용이 필요하면 질문하십시오.

void device_malloc(uint32_t *buffer, int size) 
{ 
    cudaMalloc((void **) &buffer, size*sizeof(uint32_t)); 
} 
+0

@ Tae-SungShin 나는 싫지만, 나의 쿠다 코드에서, 나는 #을 포함하여 uint32_t를 정의한다. –

답변

2

문제는 여기에 있습니다 : :

uint32_t *input_device; 
device_malloc(input_device, INPUT_HEIGHT*INPUT_WIDTH); 

, 그것은 input_device 값을 수정하지 않는 무엇이든 device_malloc

여기 방법 device_malloc입니다. 즉, 첫 번째 인수가 포인터에 대한 참조가 아니라면 내기가 준비되어 있지 않다면 그렇지 않습니다.

당신은 포인터에 대한 포인터에 device_malloc의 첫 번째 인수를 변경하고 다음과 같이 호출해야합니다

device_malloc(&input_device, INPUT_HEIGHT*INPUT_WIDTH); 

하거나 device_malloc 반환 할당 된 메모리에 대한 포인터를 가지고있다.

cudaMemcpy은 첫 번째 인수 인 device이 올바른 장치 포인터가 아니기 때문에 오류를 반환합니다. CUDA 런타임에는 검사 방법이 있습니다. 위의 문제로 인해 초기화하지 않으므로 가비지 값을 보유하고있을 가능성이 높습니다.

보조 노트로 문제와 관련이없는 경우 상태를 더 편리하게 인쇄하려면 cudaGetErrorString 기능을 사용하는 것이 좋습니다.

+0

도움 주셔서 감사합니다! 나는 원래의 게시물에'device_malloc' 메소드의 정의를 추가했다. 나는'cudaMalloc'의 첫 번째 인수에서 포인터에 대한 참조를 제공합니다. 그게 네가 언급 한 것인가? –

+1

이것은 포인터에 대한 참조가 아닙니다. 이것은 포인터 자체입니다. 'cudaMalloc'에 의해'buffer'에 할당 된 값은 호출 코드의'input_device'에 할당되지 않습니다. –

+0

그래, 그게 다야. 감사! –