スカラー引数#
基本的な使い方#
DPC++ 対応の oneMKL BLAS ルーチンの USM バージョンは、単一の固定値 (ベクトルや行列ではない) を表すパラメーターとして、スカラー (float など) またはポインター (float*) のいずれかを受け入れます。これらのパラメーターは、BLAS では alpha または beta と呼ばれることがよくあります。
たとえば、ユーザーはポインターを使用して gemv を呼び出すことができます。
float *alpha_ptr = sycl::malloc_shared<float>(1, queue); float *beta_ptr = sycl::malloc_shared<float>(1, queue); // fill alpha_ptr and beta_ptr with desired values oneapi::mkl::blas::column_major::gemv(queue, trans, m, n, alpha_ptr, lda, x, incx, beta_ptr, y, incy).wait();
またはリテラル値で呼び出すことができます。
oneapi::mkl::blas::column_major::gemv(queue, trans, m, n, 2, lda, x, incx, 2.7, y, incy).wait();
ユーザーは、1 回の呼び出しでスカラー・パラメーターとポインター・パラメーターを混在させることもできます。
float *alpha_ptr = sycl::malloc_shared<float>(1, queue); oneapi::mkl::blas::column_major::gemv(queue, trans, m, n, alpha_ptr, lda, x, incx, 2.7, y, incy).wait();
スカラー・パラメーターに提供されるポインターは、デバイスまたはホストメモリーへの SYCL* 管理ポインター (たとえば、sycl::malloc_device、sycl::malloc_shared、または sycl::malloc_host で作成されたポインター) である場合もあれば、malloc または new で作成された生のポインターである場合もあります。
大部分のユーザーにとって、必要な情報はこれだけです。これがどのように実装されるか、その詳細は以下に記載されています。
スカラー・パラメーターのラッパータイプ#
oneMKL BLAS ルーチンの USM バージョンは、テンプレート化された value_or_pointer<T> ラッパーを使用して、スカラー・パラメーターを受け取るルーチンにポインターまたは値を渡すことができるようにします。このタイプは oneapi::mkl:: 名前空間にあり、oneapi/mkl/types.hpp ヘッダーファイルで定義されています。
一般に、ユーザーはコード内でこのタイプを明示的に使用すべきではありません。関数シグネチャーに value_or_pointer タイプが含まれる oneMKL 関数を使用するため、value_or_pointer タイプのオブジェクトを構築する必要はありません。代わりに、ユーザーが oneMKL 関数を呼び出すと、ユーザーコード内の値とポインターがこのタイプに暗黙的に変換されます。
value_or_pointer<T> ラッパーには 2 つのコンストラクターがあります。1 つは T タイプの値 (または T に変換可能なもの) を value_or_pointer<T> に変換し、もう 1 つは T へのポインターを value_or_pointer<T> に変換します。内部的に oneMKL 関数は、基になるデータが値またはポインターか、さらにホストメモリーかデバイスメモリーかによって動作が若干異なりますが、これらはユーザーにとって透過的である必要があります。
依存関係とポインターの逆参照#
oneMKL BLAS ルーチンにポインターとして渡されるスカラー・パラメーターの逆参照のタイミングは、それが USM 管理ポインターであるか、生のポインターであるかによって異なります。
USM の管理ポインターは、関数に渡された依存関係が解決された後、カーネルの起動時に逆参照されるため、ルーチンに依存関係として渡される別のイベントで値が非同期的に割り当てられる場合があります。
生のポインター (malloc または new で割り当てられた) は関数呼び出し時に逆参照されるため、関数が呼び出されるときに有効である必要があります。この場合、関数が呼び出されたときにデータが有効である必要があり、非同期に割り当てられない可能性があります。