C++ AMP を通して GPU 上で計算をしていると、TDR という仕組みによる例外が発生することがあります。
TDR とその対応については以下のページに詳しく解説されています。
TDR による例外が発生したときに自動的に計算サイズを調整して 復帰するコードを紹介します。
elemMul_sub_GPU と elemMul という関数は2つの行列の要素ごとの掛け算を行ないます。 (どちらもパラメターとして2つの行列をとるものと3つの行列をとるものがあります。)
matMul_sub_GPU と matMul は行列の掛け算を行ないます。GPU が利用できない時は cv::gemm を呼び出します。
これらのコードは以下のライブラリに依存しています。
rowBlockSize がブロックサイズです。行列を rowBlockSize 行ごとに切り分けて計算しています。 例外が発生するとブロックサイズを 1/2 にしてリトライします。ブロックサイズが 100 未満になるとあきらめます。