4

cuda でプログラムを書いており、データ転送のオーバーヘッドを削減しようとしています。行列の乗算に cuBLAS ライブラリを使用しており、値の範囲が 0 ~ 255 の 30.000.000 の数値を送信する必要があります。

最終製品を float にしたいので、今は float として送信しています。これは、1 バイトに収まることを考えると、非常にコストがかかります。

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

4

1 に答える 1

3

ホストからデバイスへの の配列、および を使用してデバイス上の の配列を割り当てるcudaMemcpyこともできます。次に、バイト配列から float 配列にコピーするカスタム カーネルを作成します。unsigned charfloatcudaMalloc

__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];
}

ホスト上のデータがすでに float として保存されている場合、これは float をコピーするよりも遅くなる可能性があります。試してみてください。ただし、配列が既にunsigned char型の場合は、とにかくこの変換をどこかで行う必要があるため、上記は効率的である可能性があります。

最高のパフォーマンスを得るには、可能であればコピーと計算をオーバーラップするようにしてください (ただし、それは質問の範囲外です。詳細については、CUDA ベスト プラクティス ガイドとプログラミング ガイドを参照してcudaMemcpyAsyncください)。

于 2012-02-06T00:32:18.433 に答える