GPUで実行されるいくつかのアルゴリズムをモデル化しています。さまざまな組み込み関数と計算が最新のハードウェアで何サイクルかかるかについての参照または何かがありますか?(nvidia 5xx +シリーズ、amd 6xxx +シリーズ)ドキュメント全体で正規化、平方根、その他の関数のコストの上昇について言及されているにもかかわらず、これに関する公式の言葉を見つけることができないようです。ありがとうございます。
3 に答える
残念ながら、探しているサイクルカウントのドキュメントが存在しないか、存在する場合は、おそらく期待したほど有用ではありません。確かに、より複雑なGPU命令の中には、単純な命令よりも実行に時間がかかるものがありますが、サイクルカウントは、命令の実行時間が主なパフォーマンスのボトルネックである場合にのみ重要です。GPUは、これが非常にまれに発生するように設計されています。
GPUシェーダープログラムがこのような高いパフォーマンスを実現する方法は、多数(場合によっては数千)のシェーダースレッドを並行して実行することです。通常、各シェーダースレッドは、別のスレッドにスワップアウトされる前に1つの命令しか実行しません。完璧な状態では、飛行中のスレッドが十分にあるため、一部のスレッドは常に次の命令を実行する準備ができているため、GPUがストールする必要はありません。これにより、単一のスレッドによって実行される操作の待ち時間が隠されます。GPUがサイクルごとに有用な作業を行っている場合は、すべてのシェーダー命令が1サイクルで実行されているかのようになります。この場合、プログラムを高速化する唯一の方法は、プログラムを短くすることです(命令が少ない=全体的な作業サイクルが少ない)。
より現実的な条件下では、GPUを完全にロードしたままにするのに十分な作業がない場合、ボトルネックはALU操作ではなくメモリアクセスであることが事実上保証されます。最悪の場合、単一のテクスチャフェッチが戻るまでに数千サイクルかかることがあります。このような予測できないストールがある場合、sqrt()がdot()よりも多くのサイクルを必要とするかどうかを心配する価値はありません。
したがって、GPUパフォーマンスを最大化するための鍵は、より高速な命令を使用することではありません。これは、占有率を最大化することです。つまり、GPUを十分にビジー状態に保ち、命令/メモリのレイテンシを隠すのに十分な作業があることを確認します。それは、DRAMへの苦痛なラウンドトリップを最小限に抑えるために、メモリアクセスを賢くすることです。そして時々、あなたが本当に幸運であるとき、それはより少ない命令を使うことについてです。
これは私がこれまでに見つけた中で最も近いものです。時代遅れです(sm3)が、何もないよりはましだと思います。
演算子/関数にはサイクルがありますか?アセンブリ命令にはサイクルがあり、それは低レベルの時間測定であり、ほとんどの場合CPUに依存します。演算子と関数はすべて高レベルのプログラミング要素であるためです。だから私は彼らがそのような測定をしているとは思わない。