17

奇妙に聞こえるかもしれませんが、これが私のシナリオです。

行列と行列の乗算 (A(n*k)*B(k*n)) を実行する必要がありますが、出力行列に対して評価される対角要素のみが必要です。cublas ライブラリを検索しましたが、それを実行できるレベル 2 または 3 の関数は見つかりませんでした。そこで、A の各行と B の各列を CUDA スレッドに分散することにしました。各スレッド (idx) について、内積 "A[idx,:]*B[:,idx]" を計算し、対応する対角出力として保存する必要があります。さて、この内積にも時間がかかるので、どうにかしてここで cublas 関数 (cublasSdot など) を呼び出してそれを達成できないかと考えています。

私の目標を直接達成できるいくつかの cublas 関数を逃した場合 (行列-行列乗算の対角要素のみを計算する)、この質問は破棄される可能性があります。

4

3 に答える 3

11

はい、できます(バージョンCUDA 10まで(および除く))。

「CUDA C/C++ で利用可能な言語インターフェイスとデバイス ランタイム API は、ホストで利用可能な CUDA ランタイム API のサブセットです。CUDA ランタイム API の構文とセマンティクスは、コードの再利用を容易にするためにデバイスで保持されています。ホスト環境またはデバイス環境のいずれかで実行できる API ルーチン用です。カーネルは、CPU に戻る必要なく、CUBLAS などの GPU ライブラリを直接呼び出すこともできます。」ソース

ここでは、cuda と CUBLAS ライブラリ関数 cublasSgemv を使用した行列ベクトル乗算を確認できます。

ただし、CUDA 10 にはデバイスの CUBLAS 機能がなくなったことに注意してください。Robert_Crovella から次のように引用できます。

現在の推奨事項は、 CUTLASS 2 が役立つかどうかを確認することです (主に GEMM 関連の活動に焦点を当てています)。そうでない場合は、独自のコードを記述して関数を実行するか、ホスト コードから cublas を呼び出します。

それにもかかわらず、現在、オンラインで行列ベクトル乗算の実装がいくつかあります。たとえば、12などです。

于 2012-11-14T01:32:13.260 に答える
4

デバイス ライブラリを使用して cublas を呼び出していることを確認してください。ホストから呼び出したのと同じライブラリを使用することはできません。cuda デバイス ライブラリの使用に関する詳細は、cuda ツールキットにあります: http://docs.nvidia.com/cuda/cublas/index.html#device-api

7_CUDALibraries/ の下の cuda 5 サンプルを見てください。

于 2013-09-17T15:38:07.713 に答える