[CUDA-Samples] simpleCUBLASXT

CUDA Advent Calendar 2019 8日目の記事です.
ネタのつなぎのCUDA Samples読み回4回目です.
読んでいたもののバージョンが変わってしまうといけないのでこちらにforkしてあります.

何このサンプル?

cublasXt APIはcuBLASに含まれるマルチGPU用のAPIです.
gemm,hemm,syrkなどのBLAS LEVEL-3の線形代数演算が用意されています.
これはそのcublasXtの簡単なサンプルです.

cublasXtの使い方

はじめにhandleの作成を行います.

cublasXtHandle_t handle;
status = cublasXtCreate(&handle);
statusの方は普通のcuBLASと同じcublasStatus_tです.

次に使用するGPUの選択を行います.

const int num_of_devices = 4;
const int devices[numdevices] = {0, 1, 2, 3};
status = cublasXtDeviceSelect(handle, num_of_devices, devices);
cublasXtDeviceSelectは複数GPUに対するcuBLAS contextを作成する関数のようで,createXtCreateの後に呼んだ後,計算の途中などに再度呼んで設定を変更することは今の所不可能なようです.

次は実際の計算です.

status = cublasXtSgemm(handle, CUBLAS_OP_N, CUBLAS_OP_N, N, N, N, &alpha, h_A,
                         N, h_B, N, &beta, h_C, N);
引数は普通のcuBLASと同じ気持ちです.
複数GPUを使うとは言えどもMPI等によるマルチプロセスではないため,行列データはどれかのGPU上にあればいいようです.

最後はお行儀よくhandleの破壊です.

status = cublasXtDestroy(handle);

このサンプルの面白いところ

このサンプルでは仕様GPUの選択の際に

compute_perf =
          (uint64_t)deviceProp.multiProcessorCount * sm_per_multiproc *
          deviceProp.clockRate;
という指標に基づきdevices配列のソートを行っています.
ノードに性能の異なるGPUが刺さっていた場合などに良い性能を出すための工夫なんですかね?
今は亡きTSUBAME 2.0とか3つのGPUが非対称な接続の仕方をしていた気がしますが,接続の仕方も考慮したdevices配列のソートというのも面白そうです.
(別にTSUBAME 2.0でなくとも現在のGPUスパコンだとNVLINKの張り方的にすべてのGPU間通信が同等ではないことは多々ありますが)

おわり

8日目にして書き溜めがなくなってアドベントカレンダーしんどい

カテゴリー:CUDA
記事作成日:2019-12-08