2010-06-20 2 views
1

장치에 배열을 정의하고 (이 예제에서 "Hello"문자열로 초기화 됨) 이것을 호스트에 복사하려고하면 오류 코드 cudaErrorInvalidValue이 표시됩니다. 그러나 커널 내부에서 d_helloStr[]에 액세스 할 수 있습니다. CUDA 프로그래밍 가이드 장 B.2.1을 참조하면 런타임 라이브러리를 통해 이러한 변수에 액세스 할 수 있어야합니다. 이 예제 코드가 작동하지 않는 이유는 무엇입니까?CUDA : cudaMemcpy는 __device__ 배열에 대해 cudaErrorInvalidValue를 반환합니다.

#include <cuda.h> 
#include <stdio.h> 


__device__ char d_helloStr[] = {'H','e','l','l','o','\0'}; 

// Host function 
int 
main(int argc, char** argv) 
{ 
    cudaError_t err; 
    char h_helloStr [sizeof(d_helloStr)]; 

    // copy device string to host string: 
    err = cudaMemcpy(h_helloStr, d_helloStr, sizeof(d_helloStr), cudaMemcpyDeviceToHost); 
    printf("err = %d\n", err); 

    // result string: 
    printf("%s\n", h_helloStr); 

    return 0; 
} 
+0

cudaMalloc을 사용하여 장치의 문자 메모리를 확보하면 어떨까요? – InsertNickHere

+0

이것은 hello-world 데모에서 실제로 사용되는 메커니즘입니다 : http://forums.nvidia.com/index.php?showtopic=90044 또한 장치에 cudaMalloc을 사용하여 일부 메모리를 할당하고 복사했습니다. d_helloStr 변수의 문자열을이 메모리에 저장하고 cudaMemcpy를 사용하여이 메모리의 문자열을 호스트로 다시 복사합니다. 이것은 또한 작동합니다. 그러나 cudaMemcpy를 통해 직접 d_helloStr에 액세스 할 수없는 이유가 궁금합니다. – t6d

답변

1

cudaMemcpyFromSymbol을 사용해야합니다.

관련 문제