26

アクセス効率を上げるためには、メモリ内でデータを適切に配置する必要があるとよく耳にします。CPU はワード境界でメモリにアクセスします。

したがって、次のシナリオでは、CPU は 1 つの単語を取得するために 2 つのメモリ アクセスを行う必要があります。

Supposing: 1 word = 4 bytes

("|" stands for word boundary. "o" stands for byte boundary)


|----o----o----o----|----o----o----o----|   (The word boundary in CPU's eye)
           ----o----o----o----              (What I want to read from memory)

なぜこれが起こる必要がありますか?CPU がワード境界でしか読み取れない根本的な原因は何ですか?

CPU が 4 バイト ワード境界でしかアクセスできない場合、アドレス ラインは 32 ビット幅ではなく 30 ビットだけでよいはずです。CPU の目には、最後の 2 ビットが常に 0 であることが原因です。

追加 1

さらに、CPU がワード境界で読み取らなければならないことを認めた場合、境界を読み取りたい場所から開始できないのはなぜでしょうか? CPUの目には境界が固定されているようです。

追加 2

AnTによると、バウンダリ設定はハードウェア化されており、メモリ アクセス ハードウェアによってハードウェア化されているようです。これに関する限り、CPUは無実です。

4

4 に答える 4

29

この場合の "can" ("...CPU can access...") の意味は、ハードウェア プラットフォームによって異なります。

x86 プラットフォームでは、CPU 命令は、「ワード境界」だけでなく、絶対に任意の境界に整列されたデータにアクセスできます。位置合わせされていないアクセスは、位置合わせされたアクセスよりも効率が悪いかもしれませんが、その理由は CPU とはまったく関係ありません。これは、基礎となる低レベルのメモリ アクセス ハードウェアがどのように機能するかに関係しています。この場合、メモリ関連のハードウェアが実際のメモリに 2 回アクセスしなければならない可能性は十分にありますが、それは CPU 命令が知らないことであり、知る必要もないことです。CPU に関する限り、任意の境界上の任意のデータにアクセスできます。残りは、CPU 命令に対して透過的に実装されます。

Sun SPARC のようなハードウェア プラットフォームでは、CPUは整列されていないデータにアクセスできません(簡単に言えば、アクセスしようとするとプログラムがクラッシュします)。つまり、何らかの理由でこの種の整列されていないアクセスを実行する必要がある場合は、手動で明示的に: 2 つ (またはそれ以上) の CPU 命令に分割し、明示的に 2 つ (またはそれ以上) のメモリ アクセスを実行します。

なぜそうなのかというと…まあ、それが現代のコンピューターのメモリハードウェアの仕組みです。データを整列する必要があります。アラインされていない場合、アクセスの効率が低下するか、まったく機能しません。

現代のメモリの非常に単純化されたモデルは、セル (行と列) のグリッドであり、各セルにはデータの単語が格納されます。プログラム可能なロボット アームは、特定のセルに単語を入れたり、特定のセルから単語を取得したりできます。一つずつ。データが複数のセルに分散している場合、そのロボット アームを何度か連続して移動する以外に選択肢はありません。一部のハードウェア プラットフォームでは、これらの連続したトリップを編成するタスクは CPU から隠されています (つまり、アーム自体が、複数の断片から必要なデータを組み立てるために何をすべきかを知っているということです)。他のプラットフォームでは、それは CPU から見えます (つまり、それがこれらの連続した腕のトリップを整理する責任がある CPU)。

于 2010-09-07T05:15:00.460 に答える
8

アドレスについて特定の仮定を行うことができれば、アドレス指定ロジックでシリコンを節約できます (「最下位nビットはゼロ」など)。一部の CPU (x86 およびその類似製品) は、位置合わせされていないデータを複数のフェッチに変換するロジックを配置し、一部を隠します。プログラマーからの厄介なパフォーマンス ヒット. その世界の外のほとんどの CPU は、代わりにハードウェア エラーを発生させ、これが気に入らないことを明確な言葉で説明します。

あなたがこれから耳にする「効率」についての議論はどれも馬鹿げたものであり、より正確には疑問を投げかけています。本当の理由は、操作のためにアドレス ビットの数を減らすことができれば、プロセッサ コアのシリコンを節約できるからです。(x86 の世界のように) アクセスのミスアラインメントから生じる非効率性は、ハードウェア設計の決定の結果であり、一般的なアドレス指定に固有のものではありません。

そうは言っても、ほとんどのユースケースでは、ハードウェア設計の決定は理にかなっています。2 バイト ワードでデータにアクセスしている場合、ほとんどの一般的なユース ケースでは、 、次にoffset、というようにアクセスします。2 バイト ワードにアクセスしている間にアドレスをバイト単位でインクリメントできることは、通常 (99.44% のように) やりたいことではありません。そのため、アドレス オフセットをワード境界に合わせることを要求しても害はありません (データ構造を設計するときに、1 回限りの軽度の不便です) が、シリコンの節約にはなります。offset+2offset+4

歴史的な話はさておき、私は Interdata Model 70 -- 16 ビットのミニコンピューター -- で働いたことがある。すべてのメモリ アクセスを 16 ビットに揃える必要がありました。また、当時の基準で作業していた頃には、メモリの量が非常に少なくなりました。(当時でも遺物でした。)ワイヤーラップされたCPUは簡単にハッキングされる可能性があるため、メモリ容量を2倍にするためにワードアライメントが使用されました。新しいアドレス デコード ロジックが追加されました。これは、アドレスの下位ビットに 1 を取り (以前は作成中のアラインメント エラーでした)、それを使用してメモリの 2 番目のバンクに切り替えました。アライメントロジックなしで試してみてください! :)

于 2010-09-07T05:21:55.253 に答える
3

その方が効率的だからです。

あなたの例では、CPU は 2 つの読み取りを行う必要があります。前半を読み取り、次に後半を個別に読み取り、それらを再構築して計算を行う必要があります。データが適切に配置されている場合、これは一度に読み取りを行うよりもはるかに複雑で時間がかかります。

x86 などの一部のプロセッサは、位置合わせされていないデータ アクセスを許容できます (そのため、32 ビットすべてが必要になります)。Itanium などのプロセッサは、位置合わせされていないデータ アクセスをまったく処理できず、非常に見事に文句を言います。

于 2010-09-07T05:11:03.917 に答える
3

ワード アライメントは CPU だけが備えているわけではありません

ハードウェア レベルでは、ほとんどの RAM モジュールには、読み取り/書き込みサイクルごとにアクセスできるビット数に関して、特定のワード サイズがあります。

組み込みデバイスに接続する必要があったモジュールでは、アドレス指定は 3 つのパラメーターで実装されていました。モジュールは、RW 操作の前に選択できる 4 つのバンクで構成されていました。このバンクのそれぞれは、本質的に行と列のインデックスを介してアドレス指定できる大きなテーブル 32 ビット ワードでした。

この設計では、アクセスはcell ごとにのみ可能であったため、すべての読み取り操作は 4 バイトを返し、すべての書き込み操作は 4 バイトを予期していました。

この RAM チップに接続されたメモリ コントローラは、次の 2 つの方法で設計できます。複数のサイクルを使用してメモリ チップへの無制限のアクセスを許可し、整列されていないデータを複数のセルとの間で分割/マージする (追加のロジックを使用)。複雑さを軽減してメモリにアクセスできます。

複雑さは保守性とパフォーマンスを妨げる可能性があるため、ほとんどの設計者は後者を選択しました [要出典]

于 2010-09-07T06:24:40.957 に答える