2012-02-05 2 views
4

나는 cuda에서 프로그램을 작성 중이며 데이터 전송의 오버 헤드를 줄이려고합니다. 행렬 곱셈을 위해 cuBLAS 라이브러리를 사용하고 값이 0-255 인 30.000.000 숫자를 보내야합니다.CUDA 및 cuBLAS에서의 typecasting

지금 나는 최종 제품을 바이트로 맞출 수 있다고 생각하면 꽤 비싸게되는 부유물이되기를 바란다.

cuBLAS 라이브러리 또는 다른 고속 수학 라이브러리를 사용하는 동안이를 바이트로 보내고 수 동으로 타입 변환하는 방법이 있습니까? 아니면 gpu에 어떻게 든 플로트로 정렬하도록 지시할까요?

답변

3

당신 cudaMemcpy 수있는 장치로 호스트에서 unsigned char의 배열, 또한 cudaMalloc를 사용하여 장치에 float의 배열을 할당합니다. 다음 float 배열에 바이트 배열의 복사본을 사용자 정의 커널 쓰기 :

__global__ void byteToFloat(float *out, unsigned char* in, int n) 
{ 
    int i = threadIdx.x + blockIdx.x * blockDim.x; 

    for (; i < n; i += gridDim.x * blockDim.x) 
     out[i] = in[i]; 
} 

호스트에 데이터가 이미 수레로 저장되어있는 경우를, 다음이 수레를 복사하는 것보다 느려질 수 있습니다. 그것을 시도하고 볼 수 있습니다. 그러나 배열이 이미 unsigned char 유형 인 경우이 변환을 어딘가에서 수행해야하므로 위의 내용이 효율적일 수 있습니다. 최적의 성능을 위해

주 당신은 아마 사본을 중복 가능하면 계산하려고한다 (하지만 질문의 범위 밖이다 : cudaMemcpyAsync에 대한 정보는 CUDA 모범 사례 가이드 및 프로그램 설명서를 참조하십시오.)