問題
.netとうまく統合されたCUDAアプリケーションを作成しようとしています。設計目標は、マネージコードから呼び出すことができるいくつかのCUDA関数を持つことです。データは、複数のCUDA関数に渡すことができるように、関数呼び出しの合間にデバイス上に保持できる必要もあります。
個々のデータは、単一のOSスレッドによってのみアクセスされることが重要です(CUDAで要求される場合)。
私の戦略
CUDA機能とデバイスポインターをマネージC++コードでラップしています。CUDAデバイスポインターはDevicePointer
、MC++で記述されたクラスでラップできます。クラスが使用しているスレッドを追跡する場合、単一のスレッドのみがCUDAデバイスポインターにアクセスできるようにすることができます。
次に、1つのスレッドだけが特定のデータにアクセスしようとするようにプログラムを設計します。
助けが必要なところ
私はいくつかの調査を行い、マネージスレッドとOSスレッドの違いについて読みました。一般的に、両者の間には多対多の関係があるようです。
これは、単一のマネージスレッドのみを使用している場合でも、OSスレッドを切り替える可能性があり、デバイスポインターへのアクセスが失われることを意味します。
CLRがOSスレッド間で管理対象スレッドを移動しないように強制する方法はありますか?