32/64 ビット マシン (プロセッサ) の RAM のワード サイズはどれくらいですか?

32/64 ビット マシン (プロセッサ) の RAM のワード サイズはどれくらいですか?

32/64 ビット マシン (プロセッサ) の RAM のワード サイズはどれくらいですか?

この質問は私を困惑させています。Intel Core i5 マイクロプロセッサのような 64 ビット マシンの RAM 自体にデータを保存するワードのサイズは正確にはどれくらいですか?

また、データを保持するワード サイズは 32 ビットから 64 ビットに変わりますか?

答え1

従来、コンピュータ アーキテクチャにおける「ワード」は、一般に、アドレス指定可能な最小のメモリ単位でした。また、従来、これはマシンの汎用レジスタ サイズと同じでした。

しかし、バイト アドレス指定が普及して以来、この概念は薄れてきました。(おそらく、IBM System/360 とミニコンピュータ側の PDP-11 がその原因でしょう。)

CPU アーキテクチャによって定義されるメモリ アドレス指定 (つまり、プログラマがマシンをどのように見ているか) に関して言えば、x86/x64 には「ワード」という概念は存在しません (ただし、これをバイトと同義語として考えた場合を除く)。メモリの各バイトには独自のアドレスがあり、バイトのアドレスは、そのバイトから始まる (より大きな番号のアドレスに拡張される) 任意のより大きな領域のアドレスでもあります。もちろん、レジスタと RAM の間で 1、2、4、または (x64 では) 8 バイトを一度に移動できます (または、REP 命令を使用して、メモリ間ではそれ以上の移動が可能です)。ただし、アサートするアドレスは依然としてバイトのアドレスです。これらすべてのサイズのワードに対して演算を実行できます (その他のサイズも)。

レジスタの観点から考えると、マシンの「ワード サイズ」は通常、汎用レジスタのワード サイズと同じであると想定されます。これは、x86 では 32 ビット、x64 では 64 ビットになります。ほとんどのアーキテクチャでは、GPR サイズは、CPU が 1 つの命令で単純な演算を実行できる最大の整数のサイズです。

さあ、さらに混乱を招きましょう...!

プラットフォーム (マザーボード、RAM モジュール、チップなど) に関して言えば、Intel および AMD の「コモディティ」CPU およびチップセットを使用しているすべてのマシンでは、RAM は 64 ビットのチャンクでアドレス指定されます。これはワードと呼べると思います。アドレスとデータに別々のピンがあった以前のプロセッサでは、このことが非常に明確にわかります。最下位のアドレス ピンは A0 ではなく A3 と呼ばれます。物理アドレス ビット A0、A1、および A2 はプロセッサから出ることはありません。しかし、プログラマーはそのようなアドレスを見ることはありません。

そして最後に、「キャッシュライン」という概念があります。キャッシュラインは、L1/L2/L3 キャッシュの 1 つのエントリを占める、物理的に連続した RAM のチャンクです。Intel/AMD の世界では、キャッシュラインは以前から 64 バイト幅でした。そのため、現在キャッシュにないメモリアドレスにアクセスすると、CPU はフェッチします。言い換えれば、キャッシュに格納されるアドレスは下位6ビットを省略します。つまり、1ワードはキャッシュ内実際には 64 バイトまたは 512 ビットです。(ただし、キャッシュをバイパスするメモリ アクセスでは、一度に 8 バイトしか読み書きできません。メモリ マップ I/O デバイスによってデコードされる物理アドレス範囲では、個々のバイトをアドレス指定できる場合があります。これはバスによって異なります。もちろん、512 ビットの整数で演算を行うことはできません。)

Microsoft C 由来のプログラミング環境では、「ワード」は 16 ビットです。これは Microsoft よりずっと前からのことで、互換性を保つために、データ型の名前と定義は 32 ビット環境と 64 ビット環境に引き継がれています。「ダブル ワード」(または DWORD または LONG、つまり「ロングワード」の略で、VAX では一般的な用語) は 32 ビットです。64 ビット整数はアーキテクチャでは「クワッドワード」と呼ばれますが、C では通常、UINT64 (64 ビット整数、符号なし) などのより具体的な名前が付けられています。

したがって、システム内のどこにいるか、何を見ているかによって異なります。最近では、「ワード サイズ」についてはまったく考えず、「GPR サイズ」について考えることが多いです。

答え2

最近の Intel CPU では、キャッシュ コヒーレンシや NUMA などの新しい機能が導入されているため、RAM がどのように動作するかという詳細な点についてはよく知りませんが、RAM の観点からは、RAM は依然として 8 ビット バイトであると考えています。ただし、RAM は現在、複数のスロットに同時にアクセスできるチャネルに配置されるのが一般的です。したがって、一度に 4 バイト (4 つのスロットを想定) を取得するには、このようなシステムで 1 バイトを取得するのと同じ時間がかかります。それでも、私の知る限り、RAM はメモリ コントローラからアドレスを入力として受け取り、8 ビットを出力として返します。

「ワード」サイズはさまざまな意味を持ちます。私がこの用語に初めて出会ったのは、68000 アセンブリ言語を勉強していたときでした。私が読んでいたテキストでは、「バイト」は 8 ビット、「ワード」は 16 ビット、「ワード アライン」は 16 ビット境界にあるアドレスを意味していました。「ワード」という用語は 68000 の導入以前 (1980 年頃?) に使用されていたこと、またそれより以前は「バイト」と同義だった可能性があることは知っています。

CPU が「優先的に」処理する「ネイティブ」データは、そのアーキテクチャの「ビット数」と、CPU が実行しているモードと一致します。32 ビット CPU (または「ロング モード」ではない 64 ビット CPU) には、32 ビット レジスタ、RAM (4 バイト) からそれらのレジスタに値をロードする一連の命令、およびその他のものが含まれます。ただし、Intel では、EAX などの 32 ビット レジスタは、2 つのレジスタ AH (EAX の上位 16 ビット) と AL (下位 16 ビット) としてアドレス指定することもできます。また、RAM から EAX、AH、AL にデータをロードし、そこから RAM に戻す MOV 命令が無数にあります。現時点では Intel プログラマーズ リファレンス ガイドを見るのが面倒ですが、AH または AL の上位または下位 8 ビットに 1 バイトをロードする命令があると思います (MIPS にはそのような命令があることは知っています)。しかし、32 ビットすべてで動作する命令は他にもあると思います。より少ないビットで動作させたい場合は、まず一時レジスタなどにデータを移動する必要があるため、効率が低下します。

したがって、Intel や 16 ビット時代以降に製造された他のほとんどの汎用 CPU では、メモリのアドレス指定方法が非常に柔軟です。ただし、命令はアーキテクチャの「ビット数」に合わせて最適化されている可能性があります。

関連情報