2014-10-29 2 views
1

큰 응용 프로그램을 디버깅하려고합니다. 호스트에서 장치로 값을 복사 할 수없는 문제가 있습니다. 나는 최소한 의 예를 제공한다.6을 장치에 복사 한 다음 다시 복사해야한다고 생각한다.Cuda cudaMemcpy "invalid argument"

#include <stdio.h> 
__device__ float a_d; 

main(){ 
    float a = 6.0; 
    float b; 
    puts(cudaGetErrorString(cudaMemcpy(&a_d,&a,sizeof(float),cudaMemcpyHostToDevice))); 
    puts(cudaGetErrorString(cudaMemcpy(&b,&a_d,sizeof(float),cudaMemcpyDeviceToHost))); 
    printf("%e",b); 
} 

64 비트 Linux에서 CUDA 5.5를 사용하면 다음과 같은 결과가 나타납니다.

$ nvcc test.cu -run 
invalid argument 
invalid argument 
0.000000e+00 

내가 cudaSuccess6.000000e+00을 기대할 수있는 반면.

답변

2

cudaMemcpy__device__ 변수와 함께 직접 사용할 수 없습니다. correct API to usecudaMemcpyTo/FromSymbol입니다.

다음은 작동합니다 : 당신이 0.000000e+00을 기대하는 이유

#include <stdio.h> 
__device__ float a_d; 

main(){ 
    float a = 6.0; 
    float b; 
    puts(cudaGetErrorString(cudaMemcpyToSymbol(a_d,&a,sizeof(float))); 
    puts(cudaGetErrorString(cudaMemcpyFromSymbol(&b,a_d,sizeof(float))); 
    printf("%e",b); 
} 

그것은 분명하지 않다. 귀하의 코드를 기반으로 나는 6.000000e+00, 또는 이와 비슷한 것을 기대합니다.

+0

환상적입니다. 감사합니다. 나는 실제로 그것을 사용하려했지만 말도 안되는 유형 (nvidia의 docs에서) 때문에 다른 문제가있었습니다. (http://developer.download.nvidia.com/compute/cuda/4_1/rel/toolkit/docs/online/group__CUDART__MEMORY_gf268fa2004636b6926fdcd3189152a14 .html # gf268fa2004636b6926fdcd3189152a14). –

+0

은 매우 오래된 문서 (CUDA 4.1 2010 년경)에 대한 링크입니다. 현재 문서는 [여기]입니다 (http://docs.nvidia.com/cuda/index.html#). –

관련 문제