AIへ秒読み

人工知能、機械学習、自然言語処理のトレンドを追っかけるページ

C++ AMP の例外の処理

C++ AMP を通して GPU 上で計算をしていると、TDR という仕組みによる例外が発生することがあります。

TDR とその対応については以下のページに詳しく解説されています。

Handling TDRs in C++ AMP

TDR による例外が発生したときに自動的に計算サイズを調整して 復帰するコードを紹介します。

elemMul_sub_GPU と elemMul という関数は2つの行列の要素ごとの掛け算を行ないます。 (どちらもパラメターとして2つの行列をとるものと3つの行列をとるものがあります。)

matMul_sub_GPU と matMul は行列の掛け算を行ないます。GPU が利用できない時は cv::gemm を呼び出します。

これらのコードは以下のライブラリに依存しています。

  • OpenCV 2.4.3
    ここからダウンロードできます。

  • C++ AMP BLAS Library 1.0
    ここからダウンロードできます。

rowBlockSize がブロックサイズです。行列を rowBlockSize 行ごとに切り分けて計算しています。 例外が発生するとブロックサイズを 1/2 にしてリトライします。ブロックサイズが 100 未満になるとあきらめます。