1

趣味の通訳プロジェクトで、タスクの同期に関するパフォーマンス関連の質問についてアドバイスを求めています。スケジューラは、新しいグリーン タスクを実際のタスクにマップする必要があります。各タスクは、グリーン タスクの独自のリンク リストを保持します。

問題: グリーン タスクの追加を、実行中の実際のタスクに可能な限り最小限のオーバーヘッドで同期するにはどうすればよいですか? 以前のテストで、リンクされたリストを保護されたオブジェクトにすると、それ自体の実際のタスク内からのアクセスが非常に遅くなることがわかりました。現在、単一タスク バージョンでインタープリター ループがどの程度タイトであるかを把握するには、次のようにします。

while not Is_Empty (Global_State.GTasks) loop
   Current_Task := Next (Global_State.GTasks);
   Global_State.Pram (Current_Task.PC).all (Global_State, Current_Task);
   Current_Task.PC := Current_Task.PC + 1;
   Update (Global_State.GTasks, Current_Task);
end loop;

(更新はまだコピーされますが、後で削除できます。)

私のテストでは、このループに最小限の変更を加えるだけでも、解釈が大幅に遅くなる可能性があることが示されています。Global_State ではなく、GTasks がこのループを実行するタスクのローカル変数として存在すると想像してください。スケジューラーがこのループを実行するタスクの外部から新しい GTask を追加するときにのみ、GTask へのアクセスを同期する必要があります。

この状況であなたは何をお勧めしますか?

4

1 に答える 1

2

(以下は、私が質問を合理的に理解していることを条件としています。)

「GTasksはタスク内のローカル変数として存在する」という推測を進めることができれば、おそらく条件付き受け入れを組み込むことが機能する可能性があります。パフォーマンスへの影響がどうなるかはわかりません。単なるアイデアです。

while not Is_Empty (GTasks) loop
   Current_Task := Next (GTasks);
   Global_State.Pram (Current_Task.PC).all (Global_State, Current_Task);
   Current_Task.PC := Current_Task.PC + 1;
   Update (GTasks, Current_Task);

   select
      accept Accept_New_Task(Green_Task : Green_Task_Type) do
         Append(GTasks, Green_Task);
      end Accept_New_Task;
   else
      null;
   end select;
end loop;

または、おそらく定期的に新しいタスクをチェックするだけですか?たとえば、PCが非常に多く増加するたびにチェックしますか?(繰り返しになりますが、パフォーマンスヒットについての約束はありません。)

while not Is_Empty (GTasks) loop
   Current_Task := Next (GTasks);
   Global_State.Pram (Current_Task.PC).all (Global_State, Current_Task);
   Current_Task.PC := Current_Task.PC + 1;
   Update (GTasks, Current_Task);

   if PC_Increments = Check_For_New_Tasks then
      select
         accept Accept_New_Task(Green_Task : Green_Task_Type) do
            Append(GTasks, Green_Task);
         end Accept_New_Task;
      else
         null;
      end select;
      PC_Increments := 0;
   else
      PC_Increments := PC_Increments + 1;
   end if;
end loop;
于 2013-03-11T19:56:03.507 に答える