同じアーキテクチャの新しいプロセッサ用にエンジンを最適化する必要があるのはなぜですか?


39

新しいプロセッサ世代がリリースされると、ほとんどのWebサイトは、ゲームエンジンとプログラムを新しいハードウェア用に最適化する必要があると報告しています。理由はよくわかりません。通常、プロセッサには、使用する命令セットの種類を定義するアーキテクチャがあります。私たちが最近使用しているのはamd_x86_64です。すべてのプロセッサがこの同じアーキテクチャを使用している場合、プログラムまたはコンパイラを更新する必要があるのはなぜですか?マシンコードの実行を最適化する新しいプロセッサのパイプライン内には確かに機能がありますが、アーキテクチャがそうでない場合にマシンコード自体を変更する必要があるのはなぜですか?


コメントは詳細なディスカッション用ではありません。この会話はチャットに移動さました
ジョシュ

14
「必要」は間違った表現であり、真実よりもマーケティングです。たとえば、Windows 特定の新しいCPU世代をサポートする必要があるのとほぼ同じです(または、原則として完全に機能するWindows 7の場合はサポートしません)必要以上に3〜4%多い電力を使用することを除き、Ryzenなどで問題ありません。このチューニングは、CPUからもう少し絞って、最大値に近づこうとするだけです。現実的には、スケジュールが異なり、いくつかの新しい命令を使用することにより、不自然な例では全体で1-2%を獲得できる場合があります。
デイモン

2
2つのプロセッサが...操作は両方のプロセッサで同じ性能を持つという意味ではありません同じ操作を行うことができますからといって
Mehrdad

Stack Overflowで私の関連する質問をご覧ください:mtuneは実際にどのように機能しますか?
Marc.2377

回答:


54

同じアーキテクチャの異なる世代は異なる命令セットを持つことができるためです。

たとえば、ストリーミングSIMD拡張機能はおそらく最もよく知られているx86命令セットですが、x86アーキテクチャが1つしかないにもかかわらず、SSE、SSE2、SSE3、およびSSE4が存在します。

これらの各世代には、特定の操作をより高速に実行できる新しい命令を含めることができます。ゲームに関連する例としては、ドット製品の説明があります。

したがって、ゲームエンジンが前世代のアーキテクチャ用にコンパイルされている場合、これらの新しい命令はサポートされません。同様に、新しい命令のためにエンジンを最適化する必要があるかもしれません。たとえば、SSE4は、構造体配列データで機能するドット積命令をサポートしています。これらの新しい命令を活用できる最適化は、データレイアウトを構造体の配列に変更することです。


1
@Panzercrisis-編集の提案をありがとう。明確にするために、元の質問はあなた自身のコードに関するものではなく、エンジンコードに関するものであったため、「独自のコードを最適化する」ことは良い編集提案ではありません。しかし、「最適化」と言ったとき、「エンジンコードを最適化する」ことを意味することを明確にする必要があることを強調したので、それを編集して取り上げました。
マキシマスミニマス

37

Maximusの答えは正しいです、私は物語の別の部分を与えたいだけです:

ハードウェア自体は、新しく導入された命令に関係なく、コーディング方法を変更する必要がある方法で変更されます。

  • キャッシュの量を増やしたり減らしたりすると、キャッシュの最適化/キャッシュの無効化の問題について多少なりとも心配する必要があります。キャッシュが多いということは、小さなデータを使用すると、パフォーマンスの問題が発生することなく、データが連続していることを確認することに集中できなくなることを意味します。キャッシュが少ないということは、これが問題になる可能性があることを意味します。また、キャッシュが非常に少ないということは、大規模なデータ構造を使用することを意味します。

  • 新しいレベルのキャッシュを使用すると、さらに大きなデータセット(L1、L2、L3、L4)を整理する方法についてさらに考える必要があります。

  • コアが増えると、マルチスレッドアプリケーションをどのように改善するか、マルチプロセス環境でアプリケーションをどのように拡張するかを考える必要があります。

  • クロックが高速になると、CPUの計算速度をシステムのボトルネックとして考えるよりも、メモリレイテンシについて考える必要があります。

  • システム上のFPUの数は、コアあたりの整数ALUの数と一致しなくなる可能性があります(AMDには、このようなアーキテクチャがありました)。

  • 操作を計算するのにかかるクロックサイクルの数は、減少または増加しました。

  • 使用可能なレジスタの数が変更されました。

これらはすべて、正または負の同じISAを持つ以前のハードウェアの基礎となるアーキテクチャを想定したプログラムに非常に現実的なパフォーマンスの影響を与えます。


「キャッシュのレベルを上げたり下げたりすることで、キャッシュの一貫性について心配する必要がなくなります。」-ほとんどすべてのCPUがキャッシュの一貫性を保っています。偽共有を意味しますか?事実上すべてのCPU $行は、ほとんどの場合、64 B ...であってもより
マチェイPiechotka

1
Maciejは、キャッシュの一貫性についてのあなたの声明をただ受け取っていました:)「キャッシュの最適化」または何かを意味したのでしょう。キャッシュの一貫性とは、N個の独立したキャッシュが存在する場合でも、システムがメモリの一貫したビューをソフトウェアに対して透過的に保持する機能です。これはサイズに完全に直交しています。TBHステートメントは実際には関係ありませんが、あなたの答え(特にポイント5と6)は、受け入れられたIMOよりもよく質問に対処します:)アーキテクチャとu-architectureの違いを強調すると、それがより際立つでしょう。
マーガレットブルーム

4
「足し算よりも時間がかかる掛け算のように、今日のIntelとAMD CPUSでは今日と同じ時間がかかります」それはすべて真実ではありません。パイプラインアーキテクチャでは、レイテンシ(結果の準備ができているとき)とスループット(サイクルごとに実行できる回数)を区別する必要があります。さらに、最新のIntelプロセッサのIntのスループットは4、レイテンシは1です。Multiplyのスループットは1、レイテンシは3(または4)です。これらは、各アーキテクチャで変化し、最適化が必要なものです。例えばpdep、Intelでは1サイクルかかりますが、Ryzenでは6サイクルかかるため、Ryzenでは使用しません。
クリストフ

2
@ClearerここでCPUについて話しているのは知っていますが、GPU用にプログラミングしたことはありませんか?同じコードでパフォーマンスが大幅に異なるため、多くの場合、実際にCUDAのハードウェア機能を考慮する必要があります。それが私がこれに由来したところです。CUDAで何かをコーディングする方法では、キャッシュサイズ(共有メモリ、管理されたL1キャッシュ)を実際に考慮する必要があります。
whn

2
@Christophは正しいです。リンクするベンチマークは、アレイ上のループc[i] = a[i] OP b[i](つまり、操作ごとに2つのロードと1つのストア)であるため、計算強度が非常に低いため、時間はメモリ帯域幅に支配されます。配列サイズは表示されないため、L1Dに収まる場合はIDKです。(gcc4.9 -Ofastこれらのループを自動ベクトル化する可​​能性が非常に高いため、通常のスカラー演算のコストを複素整数コードの一部として測定することすらありません)。そのページの最初の行は重要です:有用なフィードバックにより、これらの対策のいくつかに重大な欠陥があることが明らかになりました。メジャーアップデートが進行中です。
ピーターコーデス

2

新しい命令のサポートなどの大幅な変更を超えて、マイクロプロセッサメーカーはパフォーマンスを向上させるために絶えず設計を変更しており、すべての新しい設計は命令または手法ごとに異なる相対性能を持つことができます。モデルX向けに慎重に最適化されたブランチレスコードをいくつか書いたのかもしれませんが、モデルYには、ブランチレスバージョン以外のコードの予測ミスのペナルティを減らす改善されたブランチ予測機能があります。モデルYは特定のレイテンシの高い命令の並列処理をサポートしているため、その命令の展開されたループによりスループットが向上し、モデルXではシーケンスが短くなりました。

あらゆる問題は多くの方法で解決でき、最適化の観点から見れば、すべてのプログラムはトレードオフとリソース割り当ての連動コレクションです。これらのリソースの可用性またはそれらのリソースに関する特定のコードのコストのわずかな変更でさえ、コードの一部に大幅なパフォーマンスの利点を与えるカスケード効果を持つことができます。アップグレードされたチップは、「より多くのすべての」持っていても、どのくらいより、各事のバランスを振ることができます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.