CUDA をフォローしている人は、おそらく私が関与しているプロジェクトに関する私の質問をいくつか見たことがあるでしょうが、まだ見ていない人のために要約します。(事前に長い質問で申し訳ありません)
3 つのカーネル、1 つの入力変数に基づいてデータ セットを生成し (ビットの組み合わせを扱うため、指数関数的に大きくなる可能性があります)、別のカーネルはこれらの生成された線形システムを解き、別のリダクション カーネルは最終結果を取得します。これら 3 つのカーネルは、特定のシステムの最適化アルゴリズムの一部として何度も実行されます。
私の開発マシン (Geforce 9800GT、CUDA 4.0 で動作) では、これは常に完璧に動作します。 、CUDA 3.1 の下で使用される 1 つだけ) まったく同じコード (Python ベース、CUDA カーネルへの PyCUDA インターフェイス) は、「小さな」ケースの正確な結果を生成しますが、中程度のケースでは、解決段階はランダムな反復で失敗します。
このコードで私が経験した以前の問題は、問題の数値的な不安定性に関係しており、本質的に決定論的でした (つまり、毎回まったく同じ段階で失敗する) が、これは率直に言って私を怒らせます。いつでも失敗します。
そのため、Python フレームワークから CUDA コードを切り離して適切なデバッグを行うための信頼できる方法がありません。
デバイスの空きメモリのカーネル呼び出し前のチェックなどの通常のことを確認しました。占有計算では、グリッドとブロックの割り当ては問題ないことがわかりました。クレイジーな 4.0 固有のことはしていません。各反復でデバイスに割り当てたものをすべて解放し、すべてのデータ型を float として修正しました。
TL;DR、CUDA 3.1 に関して、リリース ノートで見たことがない落とし穴や、呼び出しを繰り返すと断続的に起動に失敗する原因となる PyCUDA の autoinit メモリ管理環境の問題に遭遇した人はいますか?