7

重複の可能性:
メモリアライメントの目的

ネット上のメモリアラインメントに関する記事をいくつか読んだところ、適切にアラインメントされたメモリ(2バイトアラインメントを取る)から、一度にデータを高速にフェッチできることが理解できました。

しかし、単一のハードウェアピースのようなメモリがあり、アドレスが与えられている場合、その位置から2バイトを直接読み取ることができないのはなぜですか。お気に入り:ここに画像の説明を入力してください

考えました。記憶が奇偶銀行のようなものであれば、理論が当てはまると思います。

ここに画像の説明を入力してください

私は何が欠けていますか?

4

3 に答える 3

14

あなたの写真は、私たち(人間)がコンピューターの記憶をどのように視覚化するかを説明しています。

実際には、メモリをビットの巨大なマトリックスと考えてください。各マトリックス列には、この列から任意のビットを読み書きできる「リーダー」が接続されています。各行列行には「セレクター」があり、リーダーが読み取り/書き込みする特定のビットを選択できます。

したがって、このリーダーは、選択したマトリックス行全体を一度に読み取ることができます。この行の長さ(行列列の数)は、一度に読み取ることができるデータの量を定義します。たとえば、64列の場合、メモリコントローラーは一度に8バイトを読み取ることができます(通常はそれ以上のこともできます)。

データを整列させておく限り、これらのメモリアクセスは少なくて済みます。2ビットだけを読み取る必要があるが、それらが異なる行に配置されている場合でも、メモリへのアクセスは1回ではなく2回必要になります。

また、書くことの全体的な側面がありますが、それは別の問題です。

行全体を読み取ることができるのと同じように、行全体を書き込むこともできます。データが整列されていない場合、行全体ではないものを書き込むときは、読み取り-変更-書き込みを実行する必要があります(行の古いコンテンツを読み取り、関連する部分を変更して、新しいコンテンツを書き込みます)。

于 2012-10-14T10:22:40.607 に答える
14

メモリからのデータは通常、バス幅に一致する一連のワイヤでプロセッサに配信されます。たとえば、バスの幅が32ビットの場合、バスからプロセッサに向かう32本のデータワイヤがあります(制御信号用の他のワイヤと一緒に)。

プロセッサ内部では、さまざまなワイヤとスイッチがこのデータを必要な場所に配信します。32個の整列されたビットをレジスタに読み込むと、ワイヤはデータをレジスタ(または他の保持場所)に直接配信できます。

8または16の整列されたビットをレジスタに読み込む場合、ワイヤは同じ方法でデータを配信でき、レジスタ内の他のビットはゼロに設定されます。

アラインされていない8ビットまたは16ビットをレジスタに読み込むと、ワイヤはデータを直接配信できません。代わりに、ビットをシフトする必要があります。レジスタに入るワイヤと整列するように「移動」できるように、ビットは異なるワイヤのセットを通過する必要があります。

一部のプロセッサでは、設計者はこの移動を行うために追加のワイヤとスイッチを配置しました。これは、必要なシリコンの量の点で非常に高価になる可能性があります。アラインされていない可能性のあるバイトを目的の場所に移動できるようにするには、多くの追加のワイヤとスイッチが必要です。これは非常に高価であるため、一部のプロセッサでは、すべてのシフトをすぐに実行できる完全なシフターがありません。代わりに、シフターはCPUサイクルごとに1バイト程度しかビットを移動できない可能性があり、数バイトずつシフトするには数サイクルかかります。一部のプロセッサでは、このためのワイヤがまったくないため、すべてのロードとストアを調整する必要があります。

于 2012-10-14T11:14:58.747 に答える
4

最初のケース(単一のハードウェア)では、2バイトを読み取る必要がある場合、プロセッサは2回の読み取りサイクルを発行する必要があります。これはメモリがバイトアドレス可能であるためです。つまり、各バイトに一意のアドレスが提供されます。

バンクとしてメモリを編成すると、CPUが1回の読み取りサイクルでより多くのデータをレジスタにフェッチするのに役立ちます。この手法は、読み取りサイクルの削減に役立ちます。これは、CPUの処理能力と比較して非常に遅いプロセスです。したがって、1回の読み取りサイクルで、より多くのデータを読み取ることができます。

于 2012-10-14T10:14:20.550 に答える