したがって、BLAS (Basic Linear Algebra Subprograms) は、名前が示すように、基本的な線形代数ルーチンに対する API です。これには、ベクトル - ベクトル操作 (レベル 1 blas ルーチン)、行列 - ベクトル操作 (レベル 2)、および行列 - 行列操作 (レベル 3) が含まれます。すべてを正しく実装する「リファレンス」BLASがありますが、ほとんどの場合、アーキテクチャに最適化された実装を使用します。cuBLAS は CUDA の実装です。
BLAS API は、基本的な操作を記述する API として非常に成功したため、広く採用されるようになりました。ただし、(a) 当時のアーキテクチャ上の制限により、名前は信じられないほど不可解であり (これは 1979 年のことであり、API は広くコンパイルできるように 8 文字以下の名前を使用して定義されていました)、(b) 成功した理由は次のとおりです。これは非常に一般的であるため、最も単純な関数呼び出しでさえ多くの無関係な引数が必要です。
非常に広く普及しているため、数値線形代数を行っている場合は、API の一般的な要点を既に知っていると想定されることが多いため、実装マニュアルでは重要な詳細が省略されていることがよくあります。
レベル 2 と 3 のルーチンは一般にTMMOO..
、T
は行列/ベクトルの数値型 ( S
/D
は単精度/倍精度実数、C
/Z
は単精度/倍精度複素数)、MM
は行列型 (GE
一般 - 例、他に何も言うことができない単なる密な行列;GB
一般的なバンド行列、SY
対称行列など)、およびOO
操作です。
これはすべて少しばかげているように見えますが、うまくいき、比較的うまく機能します.SGEMVが単精度の一般行列とベクトルの乗算になるように、これらをスキャンして使い慣れた操作をすぐに学びます(これはおそらくSGBMVではなく、あなたが望むものです)。 、DGEMM は倍精度の行列 - 行列乗算などですが、ある程度の練習が必要です。
したがって、cublas sgemv の指示、または元の のドキュメントを見ると、引数リストをステップ実行できます。まず、基本操作は
この関数は行列とベクトルの乗算を実行します
y = a op(A)x + b y
。ここで、A は列優先形式で格納された amxn 行列、x と y はベクトル、および はスカラーです。
ここで、op(A) は A、ATまたはA Hです。したがって、一般的なケースのように、 だけが必要y = Ax
な場合はa = 1
、b = 0
. とtransa == CUBLAS_OP_N
。
incx
の異なる要素間のストライドx
です。これが役立つ状況はたくさんありますが、 がx
ベクトルを含む単純な 1 次元配列である場合、ストライドは 1 になります。
SGEMV に必要なのはこれでほぼすべてです。