2012-02-05 14 views
4

私はcudaでプログラムを書いていますが、データ転送のオーバーヘッドを減らそうとしています。私は行列乗算のためにcuBLASライブラリを使用しています。値が0〜255の30,000,000の数値を送信する必要があります。CUDAとcuBLASでの型キャスト

私は最終製品をフロートにして1桁に収まると思ってしまうほどコストがかかることを望んでいるので、今はフロートとして送信しています。

cuBLASライブラリやその他の高速数学ライブラリを使用しているときに、それらをバイトとして送信して浮動小数点数として型変換する方法はありますか?または、何らかの形でフロートとしてそれらを整列させるようにGPUに指示しますか?

答えて

3

ホストからデバイスへのunsigned charの配列とfloatの配列をcudaMallocを使用して割り当てることもできます。その後、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のベストプラクティスガイドとプログラミングガイドを参照してください。)