1

例えば、

cublasStatus_t cublasSgemm(cublasHandle_t handle,
                       cublasOperation_t transa, cublasOperation_t transb,
                       int m, int n, int k,
                       const float           *alpha,
                       const float           *A, int lda,
                       const float           *B, int ldb,
                       const float           *beta,
                       float           *C, int ldc)

これは、多くの混乱点に関連しています。

  • は何constを達成しますか?
  • スカラー パラメータに対してもポインタを提供する必要があるのはなぜですか?
  • これは何と関係がありCUBLAS_POINTER_MODE_HOSTますか?
  • constそれらを渡すために一時変数を明示的に作成する必要がありますか、それとも通常のポインターで行いますか?

CUBLAS ライブラリ

4

3 に答える 3

8
  1. const呼び出し元とコンパイラの両方に対して入力引数を読み取り専用として示します (最適化に影響を与える可能性があります)。
  2. 値ではなくポインターを使用すると、CUBLAS v2 ルーチンがホストまたはデバイスのメモリから読み取ることができるためです (これは CUBLAS v1 API とは異なります)。
  3. 上記を参照。CUBLAS v2 呼び出しで GPU メモリからスカラー パラメーターを読み取ることができるようになりました。つまり、ホストからデバイスへの中間メモリ転送をなくすことができ、一部の種類の操作のパフォーマンスが向上します。CUBLAS_POINTER_MODE_HOSTCUBLAS v2 API が使用できる 2 つの可能なポインター モードの 1 つCUBLAS_POINTER_MODE_DEVICEcublasSetPointerModev2 API のポインターの動作を制御するために使用でき、数値の入力値と戻り値がホストまたはデバイスのメモリに書き込まれる場所を定義します。
  4. いいえ。C で暗黙的にキャストすることは合法ですがconst、constness をキャストすることは合法ではありません。C++ は、const_castこのためのキャスト メカニズムを提供します。
于 2013-05-04T06:36:05.063 に答える
1

4 番目の質問については、talonmies が正しいので、const にキャストする必要があります。cublas< t>gemmBatched の const にキャストする方法の良い例は、CUDA サンプル: batchCUBLAS にあります。

たとえば、次の行を指定します。

 status1 = cublasXgemmBatched(handle, params.transa, params.transb, params.m, params.n,
                                     params.k, &params.alpha, (const T_ELEM **) devPtrA_dev, rowsA,
                                     (const T_ELEM **) devPtrB_dev, rowsB, &params.beta, devPtrC_dev, rowsC, opts.N);

CUDA の例では、T_ELEM は float です。8 番目の入力に注目してください。

(const T_ELEM **) devPtrA_dev

これは const にキャストします。devPtrA は通常の方法で CUDA メモリに設定されており、この CUDA サンプルでも確認できます。

CUDA サンプルの詳細については、https ://developer.nvidia.com/cuda-code-samples をご覧ください。

于 2014-09-15T20:20:03.980 に答える