2

問題

.netとうまく統合されたCUDAアプリケーションを作成しようとしています。設計目標は、マネージコードから呼び出すことができるいくつかのCUDA関数を持つことです。データは、複数のCUDA関数に渡すことができるように、関数呼び出しの合間にデバイス上に保持できる必要もあります。

個々のデータは、単一のOSスレッドによってのみアクセスされることが重要です(CUDAで要求される場合)。

私の戦略

CUDA機能とデバイスポインターをマネージC++コードでラップしています。CUDAデバイスポインターはDevicePointer、MC++で記述されたクラスでラップできます。クラスが使用しているスレッドを追跡する場合、単一のスレッドのみがCUDAデバイスポインターにアクセスできるようにすることができます。

次に、1つのスレッドだけが特定のデータにアクセスしようとするようにプログラムを設計します。

助けが必要なところ

私はいくつかの調査を行い、マネージスレッドとOSスレッドの違いについて読みました。一般的に、両者の間には多対多の関係があるようです。

これは、単一のマネージスレッドのみを使用している場合でも、OSスレッドを切り替える可能性があり、デバイスポインターへのアクセスが失われることを意味します。

CLRがOSスレッド間で管理対象スレッドを移動しないように強制する方法はありますか?

4

2 に答える 2

4

BeginThreadAffinityおよびEndThreadAffinityメソッドを使用します。

try
{
    Thread.BeginThreadAffinity(); // prevents OS thread switch

    // your code
    // ...
}
finally
{
    Thread.EndThreadAffinity();
}
于 2009-12-30T11:16:01.400 に答える
0

私はあなたが何かをする必要があるとは思わない。

IIRC、「OSスレッドスイッチ」とは、OSがスレッドをあるプロセッサコアから別のプロセッサコアに(またはマルチソケットシステムでは別のプロセッサに)移動できることを意味します。

しかし、Cudaは、どのプロセッサコア/「OSスレッド」がコードを実行しているかを実際には気にしません。一度に1つの管理対象スレッドのみがデータにアクセスできる限り、競合状態は発生しません。

スレッドアフィニティAPIは通常、さまざまなコアからCPUメモリの場所にアクセスする際のパフォーマンスの違いについて誰かが完全に分析した場合にのみ使用されます。しかし、永続データは(私が思うに)GPUテクスチャバッファにあり、CPUメモリにはないので、それでも関係ありません。

于 2009-12-30T19:25:28.870 に答える