EPIC上のWikipediaの記事はすでにVLIWとEPICに共通する多くの危険を概説しました。
誰かがその記事から運命論の感覚をつかまないならば、これを強調させてください:
CPUキャッシュとDRAMを含むメモリ階層からの負荷応答には、確定的な遅延はありません。
言い換えれば、メモリアクセスからの非決定的レイテンシに対処できないハードウェア設計は、すべて大きな障害になります。
(*)「cope with」では、かなり良好な実行パフォーマンス(つまり、「コスト競争力のある」)を達成する必要があります。これにより、CPUを数十から数百サイクルも頻繁にアイドル状態にしないことが必要になります。
EPICが採用している対処戦略(上記のWikipediaの記事に記載)が実際に問題を解決するわけではないことに注意してください。これは、データの依存関係を示す負担がコンパイラにかかっていると言っているだけです。それはいいです; コンパイラはすでにその情報を持っているため、コンパイラが準拠するのは簡単です。問題は、CPUがメモリアクセスで数十から数百サイクルもアイドル状態になることです。言い換えれば、それは二次責任を外部化する一方で、依然として一次責任に対処できない。
質問を言い換えると、「失敗する運命にあるハードウェアプラットフォームを考えると、なぜ(1)コンパイラーライターはそれを償うために英雄的な努力をすることができなかったのですか?」
言い換えることで、その質問に対する答えが明らかになることを願っています。
また、致命的な障害の2番目の側面があります。
対処方法(同じ記事で説明)は、ソフトウェアベースのプリフェッチを使用して、メモリアクセスからの非決定的なレイテンシによるパフォーマンスの低下の少なくとも一部を回復できると想定しています。
実際には、プリフェッチは、ストリーミング操作(メモリをシーケンシャルに、または高度に予測可能な方法で読み取る)を実行している場合にのみ有益です。
(つまり、コードがローカライズされたメモリ領域に頻繁にアクセスする場合、キャッシングが役立ちます。)
ただし、ほとんどの汎用ソフトウェアは、大量のランダムメモリアクセスを行う必要があります。次の手順を検討する場合:
- 住所を計算してから、
- 値を読んでから、
- いくつかの計算で使用する
ほとんどの汎用ソフトウェアでは、これらの3つをすばやく連続して実行する必要があります。つまり、(ソフトウェアロジックの範囲内で)事前にアドレスを計算したり、これら3つのステップの間のストールを埋めるのに十分な作業を見つけることが常に可能とは限りません。
なぜ屋台を埋めるのに十分な仕事を見つけることが常に可能とは限らないのかを説明するために、それを視覚化する方法を以下に示します。
- 失速を効果的に隠すために、メモリに依存しない100個の命令を埋める必要があるとしましょう(したがって、追加のレイテンシの影響を受けません)。
- さて、プログラマーとして、選択したソフトウェアを逆アセンブラーにロードしてください。分析用のランダム関数を選択します。
- メモリアクセスのみのない100命令(*)のシーケンスをどこでも識別できますか?
(*)NOP
役に立つ仕事をすることができたら...
現代のCPUは、動的な情報を使用して、パイプラインを循環する各命令の進行を同時に追跡することで、同じ問題に対処しようとします。上で述べたように、その動的情報の一部は、非決定論的なメモリレイテンシによるものであるため、コンパイラによって正確に予測することはできません。一般に、コンパイル時に利用可能な情報が十分にないため、これらのストールがいっぱいになる可能性があります。
AProgrammerの回答に応えて
「コンパイラー...並列化の抽出が難しい」ということではありません。
最新のコンパイラによるメモリおよび算術命令の並べ替えは、独立して、したがって同時に実行可能な操作を識別するのに問題がないという証拠です。
主な問題は、VLIW / EPICプロセッサ用にエンコードされた「命令ペアリング」がメモリアクセスによってストールされることを、非決定的メモリレイテンシが意味することです。
ストールしない命令(レジスタのみ、算術)を最適化しても、ストールする可能性が非常に高い命令(メモリアクセス)によって引き起こされるパフォーマンスの問題は解決しません。
80-20の最適化ルールを適用できない場合の例です。すでに高速なものを最適化しても、低速なものも最適化されない限り、全体的なパフォーマンスが大幅に向上することはありません。
Basile Starynkevitchの回答に応えて
「(どんなに)難しい」ということではなく、EPICはレイテンシの高いダイナミズムに対処しなければならないプラットフォームには適していないということです。
たとえば、プロセッサに次のすべてがある場合:
- 直接メモリアクセスなし;
- メモリアクセス(読み取りまたは書き込み)は、DMA転送によってスケジュールする必要があります。
- すべての命令の実行レイテンシは同じです。
- 順番実行;
- ワイド/ベクトル化された実行ユニット。
その場合、VLIW / EPICが最適です。
そのようなプロセッサはどこにありますか?DSP。そして、これはVLIWが栄えた場所です。
後から考えると、Itaniumの失敗(および明白な証拠にもかかわらず、R&Dの努力の継続的な失敗)は、組織の失敗の例であり、徹底的に研究する価値があります。
確かに、ハイパースレッディング、SIMDなど、ベンダーの他のベンチャーは非常に成功しているようです。Itaniumへの投資がエンジニアのスキルに豊かな影響を与えた可能性があり、それによって次世代の成功したテクノロジーを作成できるようになった可能性があります。