パフォーマンスが低下したり、回路が複雑になることはありません。
さらなる理解を本当に妨げているのは、私たちが事実として受け入れる誤った仮定です。
他の質問でのあなたのコメントは、はるかに適切な表現を使用していました(「劣化するとは思わない」...)
メモリ アーキテクチャでは、帯域幅を最大化するために多くのメモリ チップを並列に使用していると考えましたか? また、特定のデータ項目が 1 つのチップにしか含まれていないため、たまたま最も便利なチップを読み取って、必要なデータが含まれていると期待することはできません。
現在、CPU とメモリは、ビット 0 ~ 7 がチップ 0 のみに、8 ~ 15 がチップ 1 に、16 ~ 23 がチップ 2 に、24 ~ 31 がチップ 3 に、それぞれ配線されるように配線できます。すべての整数 N について、メモリ位置 4N はチップ 0 に格納され、4N+1 はチップ 1 に格納されます。これは、これらの各チップの N 番目のバイトです。
各メモリチップの各オフセットに格納されているメモリアドレスを見てみましょう
メモリチップ 0 1 2 3
オフセット
0 0 1 2 3
1 4 5 6 7
2 8 9 10 11
N 4N 4N+1 4N+2 4N+3
したがって、メモリ バイト 0 ~ 3、N=0 からロードすると、各チップはその内部バイト 0 を報告し、ビットはすべて適切な場所に配置され、すべてがうまくいきます。
では、メモリ位置 1 から単語を読み込もうとするとどうなるでしょうか?
まず、その方法を見てみましょう。メモリ チップ 1 ~ 3 のオフセット 0 に格納されている最初のメモリ バイト 1 ~ 3 は、最終的にビット 8 ~ 31 になります。これは、ビット 0 ~ 23 に配置するように要求したにもかかわらず、これらのメモリ チップが接続されている場所だからです。CPU は、論理左シフトに使用されるのと同じ回路を使用して、それらを内部でスウィズルできるため、これは大したことではありません。次に、オフセット 1 でメモリ チップ 0 に格納されている次のトランザクション メモリ バイト 4 がビット 0 ~ 7 に読み込まれ、必要な場所にビット 24 ~ 31 にスウィズルされます。
ここで何かに注意してください。要求した単語はオフセットに分割され、最初のメモリ トランザクションは 3 つのチップのオフセット 0 から読み取られ、2 番目のメモリ トランザクションは他のチップのオフセット 1 から読み取られます。ここに問題があります。メモリ チップにオフセットを伝えて正しいデータを送り返す必要があります。オフセットは最大 40 ビット幅で、信号は非常に高速です。現在、すべてのメモリ チップに接続するオフセット信号のセットは 1 つしかありません。アライメントされていないメモリ アクセスに対して 1 つのトランザクションを実行するには、各メモリ チップに対して実行する独立したオフセット (アドレス バス BTW と呼ばれます) が必要です。64 ビット プロセッサの場合、アドレス バスを 1 つから 8 つに変更すると、ほぼ 300 本のピンが増加します。CPU が 700 ピンから 1300 ピンを使用する世界では、これはほとんどとは言えません」
わかりました。それほど悪くはありません。一度にアドレス バスに出力できるオフセットは最大で 2 つまでであり、一方は常に他方に 1 を加えた値になるからです。したがって、各メモリ チップへの 1 本の余分なワイヤを使用して、実際には (アドレス バスにリストされているオフセットを読み取る) または (次のオフセットを読み取る) のいずれかを実行できます。これは 2 つの状態です。しかし今では、各メモリ チップに追加の加算器があるため、実際にメモリ アクセスを行う前にオフセットを計算する必要があり、メモリの最大クロック レートが遅くなります。つまり、アライメントされていないアクセスを高速化するには、アライメントされたアクセスが遅くなります。アクセスの 99.99% を揃えることができるため、これは純損失です。
そのため、アライメントされていないアクセスは 2 つのステップに分割されます。アドレス バスは関連するすべてのバイトで共有されるためです。これは実際には単純化したものです。オフセットが異なると、関連するキャッシュ ラインも異なるため、CPU コア間の 2 倍の通信を処理するには、すべてのキャッシュ コヒーレンシ ロジックを 2 倍にする必要があります。