2014-12-12 2 views
0

호스트에서 double 배열을 Device의 float 배열로 복사하는 방법이 있습니까? 나는 정밀도의 손실에 관심이 없다? 내가 다음 경우가 있습니다cudaMemcpy 배열을 부동 배열

double* host = new[N]; 
... // Perform some calculations on host array 

float* device; 

cudaMalloc((void**) &device, N * sizeof(float)); 
cudaMemcpy(device, host, N * sizeof(float), cudaMemcpyHostToDevice); 

것은 내가 오류 잘못된 인수를 얻고 있었다 작성된 코드 위에 시도. 호스트 배열을 float으로 변경하는 것 외에 다른 해결책이 있습니까?

+1

memcpy 또는 cudaMemcpy의 역할에 대해 잘 모릅니다. float 또는 double의 정밀도를 고려하지 않고 바이트 대 바이너리 복사를 수행합니다. 따라서 코드를 실행해도 오류가 발생하지 않더라도 장치 벡터에 쓰레기가 생깁니다. –

답변

2

float은 4 바이트, double은 8 바이트입니다. 호환되지 않는 유형 간에는 memcpy 만 간단히 입력 할 수 없으므로 먼저 doublefloat으로 변환해야합니다. 당신은 당신이 모든 double의 사용으로부터 혜택을 받고 확신합니다, 그러나

std::vector<double> host_double(N); 
// Perform some calculations on host array 

// Make a copy of the host vector, converting all doubles to floats 
std::vector<float> host_float(host_double.begin(), host_double.end()); 

// The rest is almost unchanged 
float* device; 

cudaMalloc((void**)&device, N * sizeof(float)); 
cudaMemcpy(device, host_float.data(), N * sizeof(float), cudaMemcpyHostToDevice); 

이 같은

뭔가 (I 표준 라이브러리 구조와 원시 배열을 대체하는 자유를했다)? 모든 계산 체인의 가장 높은 정밀도는 float 중 하나입니다.

+0

그게 더할 나위없는 일이지만, 유일한 방법 일 수 있습니다. 저는 아닙니다만, 프로젝트가 거대하고 float 정밀도가 좋더라도 복식을 사용하여 작성되었습니다. – Karpov