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