インテル® Hyperflex™ アーキテクチャー高性能デザイン・ハンドブック

ID 683353
日付 10/04/2021
Public
ドキュメント目次

6.1. ラウンド・ロビン・スケジュラー

ラウンド・ロビン・スケジュラーは基本機能ブロックです。次の例では、モジュラス演算子を使用して、サービスの次のクライアントを決定します。モジュラス演算子は、除算を実行するため、比較的遅く、領域が非効率的です。

ラウンド・ロビン・スケジュラーのソースコード

module round_robin_modulo # (
            parameter LOG2_CLIENTS  = 7,
            parameter CLIENTS       = 3)
  { 
    // previous client to be serviced
       input wire [LOG2_CLIENTS -1:0]  last,

    // Client requests:- 
       input wire [CLIENTS -1:0] requests,

    // Next client to be serviced: -
       output reg [LOG2_CLIENTS -1:0] next,

};

//Schedule the next client in a round robin fashion, based on the previous

always @*
begin
   integer J, K;

   begin : find_next
   next = last; // Default to staying with the previous
   for (J = 1; J < CLIENTS; J=J+1)
      begin
      K = (last + J) % CLIENTS;
      if (requests[K] == 1'b1)
         begin
         next = K[0 +: LOG2_CLIENTS];
         disable find_next;
       end
      end   // of 'find_next'
     end

 endmodule
図 123. ラウンド・ロビン・スケジュラーのFast Forward Compileレポート

Fast Forward Summaryレポートは、クリティカル・チェーン上のHyper-Retimingを制限するレジスターが不十分であることを示しています。チェーンは、LPM_DIVIDE IPコアで実装されたモジュラス演算子を介して、最後の入力に接続するレジスターから、次の出力に接続されているレジスターまでです。

図 124. ラウンド・ロビン・スケジュラーの基本パフォーマンスのクリティカル・チェーン

上のクリティカル・チェーンの44個のエレメントは、下の回路図に対応し、10レベルのロジックを備えています。モジュラス演算子は、低パフォーマンスに大きく貢献します。 10レベルのロジックのうち9つは、モジュラス演算子の実装の一部です。

図 125. クリティカル・チェーンの回路図

Fast Forwardコンパイルは、モジュール入力で2つのパイプライン・ステージを追加し、ロジッククラウドでリタイミングすることにより、140%のパフォーマンス向上を見積もります。この時点で、クリティカル・チェーンはショートパス/ロングパスであり、モジュラス演算子を含みます。

図 126. ラウンド・ロビン・スケジュラーのクリティカル・チェーンファストフォワードコンパイル

モジュラス演算の除算器は、RTL修正が必要なボトルネックです。 Fast Forwardコンパイルのすべてのステップでクリティカル・チェーンにディバイダのパスが存在します。サービスする次のクライアントを計算し、モジュラス演算子を回避するための代替実装を検討してください。クライアントの数を2の累乗として指定する実装に切り替えると、モジュラス演算子は、次に処理するクライアントを決定する必要はありません。 2 nより小さいクライアントでモジュールをインスタンス化するときは、未使用の要求入力をロジック0に関連付けます。

2 nクライアント入力によるパフォーマンスの向上したラウンド・ロビン・スケジュラーのソースコード

module round_robin # (
           parameter LOG2_CLIENTS = 3,
           parameter CLIENTS = 2**LOG2_CLIENTS)
        {
          // Previous client to be serviced:-
           input wire [LOG2_CLIENTS -1:0] last,
 
          // Client requests:- 
           input wire [CLIENTS -1:0] requests,
        
         // Next client to be serviced:- 
           output reg [LOG2_CLIENTS -1:0] next
        };

       //Schedule the next client in a round robin fashion, based on the previous
           always @(next or last or requests)
           begin
              integer J,K;
              
               begin : find_next
               next = last; // Default to staying with the previous
               for (J=1; J<CLIENTS; J = J+1)
                  begin
                   K = last + J;
                    if (requests[k]0 +: LOG2_CLIENTS]] == 1'b1)
                       begin
                       next = K[0 +: LOG2_CLIENTS];
                       disable find_next;
                       end
                     end
                  end// of 'find_next'
               end

           endmodule
図 127. 2nクライアント入力によるパフォーマンスの向上したラウンド・ロビン・スケジュラーのFast Forward Summaryレポート

Fast Forwardの最適化(基本パフォーマンスステップ)がなければ、このバージョンのクリティカル・チェーンでは、レジスターが不十分であるというパフォーマンス制限の理由もあります。両方のバージョンのクリティカル・チェーンには2つのレジスターのみが含まれていますが、2nバージョンのクリティカル・チェーンにはモジュラスバージョンの44個の要素と比較して26個の要素しか含まれていません。

図 128. 最高のパフォーマンスを持つラウンド・ロビン・スケジュラーのクリティカル・チェーン

上のクリティカル・チェーンの26個の要素は、次の回路図に対応し、論理レベルは4つのみです。

図 129. パフォーマンスが向上したクリティカル・チェーンの概略図

入力に2つのレジスター段を追加して、ロジッククラウドを介してリタイミングすることにより、Fast Forward Compileは回路性能を1 GHzにします。これは図 130デバイスのアーキテクチャーの限界です。モジュラス・バージョンと同様に、ファスト・フォワード最適化後の最終的なクリティカル・チェーンは、ショートパス/ロングパスという限定理由がありますが、パフォーマンスはモジュラス・バージョンの2倍です。

図 130. 最高のパフォーマンスを持つラウンド・ロビン・スケジュラーのクリティカル・チェーン

モジュラス演算子を削除し、2のべき乗累乗の実装に切り替えることは非常に小さなデザイン変更であり、劇的なパフォーマンスの向上を提供します。

  • 可能な限り、数学演算には2の自然乗を使用します。
  • 一見基本的な機能の代替実装を探索します。

この例では、ラウンドロビンロジックの実装を変更すると、パイプライン・ステージを追加するよりもパフォーマンスが向上します。