2

FPGAプログラミングは初めてですが、全体的な実行時間の観点からパフォーマンスについて質問があります。

レイテンシーはサイクルタイムで計算されることを読みました。したがって、全体的な実行時間=レイテンシー*サイクル時間。

データの処理に必要な時間を最適化したいので、全体の実行時間を測定します。

a = b * c*dの計算があるとしましょう。

2サイクル(result1 = b * c)&(a = result1 * d)で計算すると、全体の実行時間は2 *サイクル時間のレイテンシーになります(これは、乗算演算の遅延によって決定されます。 X)= 2X

1サイクルで計算すると(a = b * c * d)。全体的な実行時間は、1 *サイクル時間のレイテンシーになります(1つではなく2つの乗算のために2倍の遅延があるため、値2Xと言います)= 2X

したがって、実行時間の観点からパフォーマンスを最適化するために、レイテンシーの短縮のみに焦点を当てると、サイクル時間が増加し、その逆も同様であるように思われます。レイテンシーとサイクルタイムの両方が減少し、実行時間が減少する可能性はありますか?レイテンシーの最適化にいつ焦点を合わせる必要があり、サイクルタイムにいつ焦点を合わせる必要がありますか?

また、C ++でプログラミングしているとき、コードを最適化したいときは、レイテンシー(実行に必要なサイクル)を最適化したいようです。ただし、FPGAプログラミングの場合、サイクル時間が長くなるため、レイテンシの最適化は適切ではないようです。したがって、実行時間(レイテンシー*サイクル時間)の最適化に焦点を当てる必要があります。プログラムの速度を上げたい場合、これは正しいですか?

誰かがこれを手伝ってくれることを願っています。前もって感謝します。

4

3 に答える 3

2

私はレイテンシーを最初の入力から最初の出力までの時間と考える傾向があります。通常は一連のデータがあるため、複数の入力を次々に処理するのにかかる時間を調べると便利です。

あなたの例では、1サイクル(1サイクル= 2t)でa = bxcxdを実行する10個のアイテムを処理するには、20tかかります。ただし、2つの1tサイクルで実行すると、10個のアイテムを処理するには11tかかります。

お役に立てば幸いです。

編集追加タイミング。

1つの2tサイクルでの計算。10回の計算。

Time   0  2  2  2  2  2  2  2  2  2  2  = 20t

Input  1  2  3  4  5  6  7  8  9 10
Output    1  2  3  4  5  6  7  8  9 10

2つの1tサイクルでの計算、パイプライン化、10回の計算

Time   0  1  1  1  1  1  1  1  1  1  1  1  = 11t

Input  1  2  3  4  5  6  7  8  9 10
Stage1    1  2  3  4  5  6  7  8  9 10
Output       1  2  3  4  5  6  7  8  9 10

両方のソリューションのレイテンシーは2t、最初のソリューションでは1 2tサイクル、2番目のソリューションでは2つの1tサイクルです。ただし、2番目のソリューションのスループットは2倍高速です。レイテンシーが考慮されると、1tサイクルごとに新しい回答が得られます。

したがって、たとえば5 1tサイクルを必要とする複雑な計算がある場合、レイテンシは5tになりますが、スループットは1tのままになります。

于 2011-04-04T09:10:22.480 に答える
2

レイテンシとサイクルタイムに加えて、スループットという別の言葉が必要です。答えを得るのに 2 サイクルかかるとしても、新しいデータをすべてのサイクルに入れ、すべてのサイクルで取り出すことができれば、「1 つのサイクルですべてを行う」よりもスループットを 2 倍にすることができます。

計算に 1 サイクルで 40 ns かかるとすると、スループットは 2500 万データ項目/秒になります。

それをパイプライン処理する場合 (これは、計算を複数のサイクルに分割するための専門用語です)、20ns の 2 ロット + 1 ビットで実行できます (入れなければならない余分なレジスターでビットを失います)。ビットが 10 ns だとしましょう (これはかなり大きいですが、合計を簡単に計算できます)。したがって、2x25+10=50 ns => 20M アイテム/秒かかります。悪い!

ただし、2 つのステージを互いに独立させることができる場合 (この場合、乗数を共有しない場合)、新しいデータを 25+a ビット ns ごとにパイプラインにプッシュできます。この「少し」は前のものよりも小さくなりますが、全体が 10 ns であっても、35 ns 倍またはほぼ 30M アイテム/秒でデータをプッシュできます。これ、最初よりも優れています。

実際には、10ns ははるかに小さく、多くの場合数百 ps であるため、ゲインははるかに大きくなります。

于 2011-04-04T12:39:43.690 に答える
1

ジョージは意味する待ち時間を正確に説明しました (これは必ずしも計算時間とは関係ありません)。スピードのためにデザインを最適化したいようです。これは非常に複雑で、多くの経験が必要です。総実行時間は

execution_time = (latency + (N * computation_cycles) ) * cycle_time

ここで、N は実行する計算の数です。高速化のために開発する場合は、大規模なデータ セットでのみ計算する必要があります。つまり、N は大きいです。通常、レイテンシの要件はありません (リアルタイム アプリケーションでは異なる可能性があります)。決定要因はcycle_timecomputation_cyclesです。ここでは関係があるため、最適化は非常に困難です。これcycle_timeは、デザインのクリティカル パスによって決定され、その上にあるレジスタが少ないほど長くなります。長くなるほど大きくなりcycle_timeます。しかし、レジスタが多ければ多いほど、より高いものになりますcomputation_cycles(レジスタごとに、必要なサイクル数が 1 ずつ増えます)。

レイテンシーは通常、computer_cycles (レイテンシーを作成する最初の計算) の数ですが、理論的には異なる可能性があることを追加する必要があります。

于 2011-04-04T11:56:30.860 に答える