2011-07-08 7 views
4

いくつかのディスクI/Oが必要なコードを書いており、計算やGPUの作業を行うライブラリを呼び出すと、結果を書き込むためのディスクI/Oが増えますファイルに。CUDAでのpthreadの使用 - 設計に関する質問

ファイルが非常に大きいので、私はマルチスレッドコードとしてこれを作成したいと思います。私は、ファイルの一部を読み込み、GPUライブラリに送信して、一部をファイルに書き戻したいと考えています。関係するディスクI/Oは非常に大きく(10GBなど)、GPUでの計算はかなり速いです。

私の質問は設計上の問題です。別のスレッドを使用してGPUライブラリに送られるデータをプリロードし、メインスレッドがGPUライブラリへの呼び出しを実際に実行し、結果データを他のスレッドに送信してディスクに書き戻すか、 GPUで実行し、ディスクに書き込んだ後、次のデータを取得しますか?

私は自分のGPUライブラリにCUDAを使用しています。クーダは、すぐにGPUで2つのカーネルを実行しようとしないほどスマートですか?私は、2つのスレッドがスペースを持つより多くのデータをGPUに追加しようとしないように手動で管理する必要があると思いますか?

マルチスレッドとCUDAを組み合わせて使用​​する上で、良いリソースがあれば幸いです。

+0

興味深いQ:一部のCUDA操作は非同期ですが、カーネルへの呼び出しはコード内を移動する前に常に終了するのを待っています。しかし、私はシングルスレッドCUDAを使用したことがあります。私は、各スレッドがそれ自身のCUDAコンテキストを必要としていることを推測します。それによって、それぞれがGPUを使用できるようになりますが、必ずしもデータを共有する必要はありません。これに関するいくつかの質問が[nVidiaフォーラム](http://forums.nvidia.com/index.php?showtopic=175716)にあります。 – Dan

+0

"GPUで2つのカーネルを同時に実行しようとしないほどスマートですか?"計算能力> 2.0のカードでは、複数のカーネルを同時に起動できますが、*同じストリームになければならないと思います。マルチスレッド実装を使用する場合は、2つのスレッドからデータを読み込む必要があるかもしれませんが、そのうちの1つだけからカーネルを起動する必要があります。 –

+0

いいえいいえいいえ、連続したカーネルを起動すると、異なるストリームにある場合にのみ同時に実行できます。同じストリームにある場合は、順次実行されます。複数のホストスレッドでの動作について私は決してそれを使用していないため、私は確かに分かりませんが、CUDAプログラミングガイドでは複数のコンテキストの使用方法とその動作方法について話しています。 – jmsu

答えて

1

私の研究では、大きなファイルでこのような状況に遭遇しました。

私が知る限り、 はGPUのI/Oに比べて非常に遅いため、ディスクI/Oの処理に大きなメリットはありません。

私が使用した戦略は、ディスクから同期して読み込み、データをロードしてGPUで非同期に実行することでした。

のような何か:

read from disk 
loop: 
async_load_to_gpu 
async_execute 
push_event 
read from disk 
check event complete or read more data from disk 
3

スレッドは、ディスクI/Oを助けにはなりません。一般的に、人々はスレッドをたくさん作成することでブロッキングの問題を解決する傾向があります。実際、それは物事を悪化させるだけです。あなたがしなければならないのは、asynchronous I/Oを使用し、書き込み(および読み取り)をブロックしないことです。 libeventまたはAsioのようないくつかの汎用ソリューションを使用して、ご使用のプラットフォームで使用可能な低レベルのAPIで動作させることができます。 Linuxでは、AIOがファイルに最適なようですが、まだ試していません。それが役に立てば幸い。

関連する問題