2

私と同じ経験をしている人がいると思います。彼/彼女は、指定されたマルチコアハードウェアを使用して、プログラムをシーケンシャルからパラレルに移植する(推定)パフォーマンスレポートを、ごくわずかな時間で提出する必要があります。

たとえば、10KLoCシーケンシャルプログラムが与えられてInteli7-3770k(ベクトル化されていない)で100ミリ秒で実行される場合、すべての種類の場合、コードをNVIDIACUDAを使用してTeslaC2075に並列化すると実行にかかる時間並列化の最適化手法は実行されましたか?(ただし、パフォーマンスを報告するのに2〜4日しか与えられていませんか?アルゴリズムをまったく知らなかったと仮定します。または、ジョブを終了することが不可能な状況であると仮定した方が安全かもしれません)

したがって、私は疑問に思っています、そのようなパフォーマンスレポートを提供するための最も速い方法は何でしょうか?GFLOPのピークやメモリ帯域幅レートなどのハードウェアの機能だけで計算しても安全ですか?それを計算する数学的な方法はありますか?ある場合は、対応する問題の説明とアルゴリズム、およびターゲットハードウェアの仕様を使用してメソッドを証明してください。

あるいは、コードの移植を(大まかに)推定するためのそのようなツールがすでに存在するのでしょうか?

(答えはしないでください:「自分を殺すのが最速の方法です。」)

4

1 に答える 1

6

わかりました、噛んでみます。これが私が作成した経験則です。

最初に、現在のアーキテクチャとターゲット アーキテクチャが提供できる Gflops (1 秒あたりの G 浮動小数点演算) の数を計算します。次に、ベンチマーク コードに必要な Gflop (G 浮動小数点演算) の数を計算し、実行にかかる時間を測定します。ここで、コンピューターが提供した Gflops に対するコードが消費した Gflops の比率を計算します。長時間実行される数値集約型のコード (GPU に移植する価値がある種類のコード) の場合、おそらく約 10% です。次に、その比率をターゲット コンピューターの Gflops に適用し、新しいアーキテクチャでプログラムがどれだけ高速になるかを確認します。

次に、これが最も重要なステップです。計算に使用したすべての材料を捨てます。いかなる状況においても、経営陣、顧客、またはあなたの親しい関係者に対しても、仮想的なスピードアップの測定値を明らかにしてはなりません。その場合は、それらを TWEP する必要があります。

私はパフォーマンスのために多くのコードの最適化を行ってきました。現在、大規模な科学的コードのパフォーマンスを改善する並列計算の専門家のチームを管理しています。私がこれまでに管理者 (など) に対して行った唯一の約束であり、あなたができる唯一の約束は、プロジェクトの終了時にコードが開始時よりも遅くならないということです。そのため、常にプロジェクトに組み込みます。コードの新しいバージョンが実際に遅い場合は、最後に 1 日を計画して、加えられたすべての変更をロールバックします。

プログラムを別のプラットフォームに移動することによってプログラムのパフォーマンスを向上させることについて、サポート可能な予測を行うには、あまりにも多くの変数が関係しています。唯一の信頼できるガイドは、移植して測定することです。実行時間の 80% がコードの 20% によって消費される科学的コードの場合、その 20% のみを比較的簡単に移植して、そこから有用な測定値を導き出すことができる場合があります。

@BenC がすでに GPU への移植を指摘しているように、最高のパフォーマンスを得るにはコードを完全に書き直す必要があり、これが私の最終的なポイントにつながります。あなたの質問は移植のコストを無視しています。これらを推定できるようになって初めて、移植するかどうかについて情報に基づいた決定を下すことができます。ただし、どこかの段階で、コード (の一部) を新しいアーキテクチャに (たとえば) 移植する 3 か月の作業 (たとえば) は、作業の最後に利益が約束されていないことを誰かに納得させる必要があります。取る価値のある暗闇の中での飛躍。

于 2012-12-20T11:01:09.183 に答える