相対的な予想タスク時間をスケジュールに組み込むビルドシステムはありますか?


13

これが私の質問の小さな図です:

ADという名前の4つの独立したタスクで構成されるビルドジョブを想定します。DはACよりも時間がかかります。

相対的なタスク時間を組み込むことができないビルドシステムは、次のようにタスクをスケジュールする場合があります。

---------------------------------------
CPU1: A  |    C   |
---------------------------------------
CPU2: B    | D                        |
---------------------------------------

対照的に、スケジューラがタスクの時間差を認識している場合、次のようなはるかに短いスケジュールが考えられます。

---------------------------------------
CPU1: A  |  B    |   C   |
---------------------------------------
CPU2: D                        |
---------------------------------------

私の質問:

  1. 相対的な予想タスク時間をスケジュールに組み込むビルドシステムはありますか?
  2. この種の構築システムに関する学術研究は何ですか?
  3. これらのビルドシステム(存在する場合)はどこから時間情報を取得しますか?ヒューリスティック、以前のビルド中に収集されたタイミング?
  4. そのようなビルドシステムが存在しない場合、なぜですか?一見しただけで価値がなくなるような落とし穴はありますか?

3
サードパーティのリソースまたはツールに関するほとんどの質問は、「オフトピック」としてすぐに締め切られますが、これはこのサイトの範囲にうまく収まると思われるエッジケースかもしれません。
Doc Brown

1
これは、タスクの「構築」が非並行であるという誤った仮定に基づいていると思います。
dagnelies

ほとんどの場合、タスクの構築は確かに非並列ですが、はい、たとえば、マルチスレッドアプリケーションでの単体テストは実際に並列になります。実際、私が働いているプロジェクトでは、単体テストの実行のために「-j1」を使用して「make」を呼び出す必要があります。そうしないと、パフォーマンス関連のマルチコア単体テストが失敗します。
juhist

@juhistより表現力豊かなビルドシステムに切り替えることに興味がある場合、shakeにリソースの概念があり、ユニットテスト用に予約するCPUコアの数を定義できます。
sjakobi

回答:


3

Microsoft Visual Studio Team System(以前のTFS)は、ビルドアクション時間と並列ビルドを考慮します。以前のビルド履歴からデータを取得します。必要な動作をすぐに使用できるとは思いませんが、カスタマイズできる場合があります。

パフォーマンスの最適化に取り組むカスタムタスクの例

https://veegens.wordpress.com/2013/03/26/tfs-2010-build-performance-report/


あなたの答えとリンクを正しく理解している場合、ビルドアクション時間が報告されます(これはかなり一般的な機能です)が、これらのタイミングを使用してビルドスケジュールを改善できるかどうかは明確ではありません。これは私の元の質問に答えているようには見えないので、あなたの答えに対する報奨金は授与しません。
-sjakobi

問題はありませんが、プログラミングでビルドアクションとビルドプロセスをカスタマイズできることです。サンプルはレポートを作成していましたが、前述のとおり、自動最適化の履歴が取得されます。また、並列ビルドを構成できることに注意してください。ただし、アルゴリズムに従って確実に並列化するには、コードでカスタマイズする必要がある場合があります。いくつかの追加参照: dotnetcurry.com/visualstudio/1177/...
ブルーノ・ガーディア

2
@BrunoGuardia:リンクのその記事で、ビルドアクションの予想されるタスク時間を活用するのに役立つカスタマイズオプションが記載されている場所を説明できますか?
Doc Brown

0

これは、タスクの「構築」が非並行であるという誤った仮定に基づいています。

多くのコンパイラはマルチスレッドで動作するため、1つのタスクAはすべてのCPUを使用します。したがって、順序は関係ありません。I / Oにバインドされたタスク、特にネットワークに関連するタスクの場合、最初からすべて並列に開始することをお勧めします。ほとんどの時間は回答を待つことに費やされます。

言い換えれば、個々のタスクは通常並列化されるため(たとえばコンパイルのように)順序は重要ではありません。


編集:

実際、「CPU 1のタスクA」というこの概念にも欠陥があります。シングルスレッドタスクの場合でも、プロセス/スレッドをスケジューリングするOSは、各コンテキストスイッチでCPUからCPUにホップする場合があります。ほとんどのビルドシステムはすべてのタスクを並行して実行し、OSにスケジューリングを行わせるだけだと思います。長いタスクには時間がかかりますが、それだけです。

I / Oバウンドはない長時間実行されるシングルスレッドタスクあると仮定すると、ビルドシステムが優先度/重要性を割り当てる方が簡単です。OSからのコンテキストスイッチを減らすために、より小さなタスクを遅延させようとするよりも。

実際には非常にまれそのような奇妙なタスクがあり、以前の実行に基づいてヒューリスティックに基づいて動作する派手なスケジューリングビルドシステムを持っている場合でも(知る唯一の方法)、そこから得られるメリットはかなり小さいかもしれません。しかし、維持するために追加の複雑さの束を取得します。


「タスク内」の並列処理は興味深い側面であり、確かに最適化の追加の可能性を提供しますが、特定のタスクが任意の数のCPUに効率的にスケーリングすると仮定することは、各タスクを実行する必要があると仮定するよりも良いとは思いませんシングルコア。
sjakobi

@sjakobi:実際には、コンパイラが効率的であることが非常に重要です。16コアのうち1つしか使用されていないため、コンパイルに長い時間がかかると想像できますか?それは禁止です。すべての理論で、あなたは現実を見落としているようです。スケジューリングは非常に興味深く、非常に意味のあるトピックです。ビルドシステムのコンテキストでは、私見は比較的役に立たない。繰り返しになりますが、今日のほとんどのコンパイラはとにかくマルチスレッド化されています...そうでない場合は、スケジューリングビルドシステムではなく、これにかなりの労力をかける必要があります。
dagnelies

2
C ++またはCまたはFortranまたはAda用のすべてのフリーソフトウェアコンパイラ(GCCClang ...)はモノスレッドです。ビルドシステム(make -j)は、複数のコンパイルプロセスを並行して起動できます。
バジルスタリンケビッチ

@BasileStarynkevitch:...確かに。基本的に、誰もが正気を使用します-j <nb-cores>が、悲しいことにデフォルトはまだ「1」です...私はそれが変わらないことにまだ驚いています。
dagnelies

@dagnelies:いくつかの重要な依存関係を見逃して、N> 1の-jNで動作しない(または動作しない可能性がある)Makefileが膨大にあります。
ジュスト
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.