2

特定の計算を実行する 3 つの異なる推力ベースの実装があります。1 つ目は最も遅く、必要な GPU メモリが最も少なく、2 つ目は最も速く、ほとんどの GPU メモリを必要とし、3 つ目はその中間です。それらのそれぞれについて、使用される各デバイスベクトルのサイズとデータ型を知っているので、 vector.size()*sizeof(type) を使用して、ストレージに必要なメモリを概算します。

したがって、特定の入力に対して、そのサイズに基づいて、どの実装を使用するかを決定したいと思います。つまり、使用可能な GPU メモリに収まる最速の実装を決定します。

私が扱っている非常に長いベクトルの場合、計算している vector.data() のサイズはかなり適切な見積もりであり、残りのオーバーヘッド (ある場合) は無視できると思います。

しかし、推力アルゴリズムの実装に関連するメモリ使用量のオーバーヘッド (ある場合) をどのように見積もればよいでしょうか? 具体的には、transform、copy、reduce、reduce_by_key、gather の見積もりを探しています。静的であり、アルゴリズムの入力および出力パラメーターのサイズの関数ではないオーバーヘッドは、非常に重要でない限り、あまり気にしません。

GPU メモリの断片化などの意味は理解していますが、これはしばらく脇に置きましょう。

この度はご検討いただき誠にありがとうございました。

4

1 に答える 1

2

Thrust はブラック ボックスのように使用することを意図しており、私が認識しているさまざまなアルゴリズムのメモリ オーバーヘッドに関するドキュメントはありません。しかし、いくつかの数値実験を実行して経験的に推測することは、それほど難しい問題ではないように思えます。特定のアルゴリズムのメモリ消費量は、次のように概算できると予想される場合があります。

total number of words of memory consumed = a + (1 + b)*N

N入力単語の問題について。aこれは、アルゴリズムの固定オーバーヘッドと、最適1+bなメモリ対Nラインの傾きです。bは、入力ワードごとのアルゴリズムのオーバーヘッドの量です。

したがって、問題は、特定のアルゴリズムのメモリ使用量を監視する方法になります。Thrust は、内部ヘルパー関数を使用してget_temporary_buffer内部メモリを割り当てます。最良のアイデアは、呼び出されたときのサイズを出力する独自の実装を作成get_temporary_bufferし、(おそらく) への呼び出しを使用してcudaGetMemInfo、関数が呼び出された時点でコンテキスト メモリ統計を取得することです。ここでget_temporary_buffer、通話を傍受する方法の具体的な例をいくつか見ることができます。

b適切に計測されたアロケータといくつかの異なる問題サイズでのいくつかの実行により、上記のモデルに適合し、特定のアルゴリズムの値を推定できるはずです。このモデルをコードで使用して、特定のメモリ量に対して安全な最大問題サイズを決定できます。

これがあなたが求めていたものであることを願っています...

于 2012-06-11T12:05:52.720 に答える