【コラム】

セカンド・オピニオン

1 64bit Rhapsody 一人歩きする64bit(1)

    高梨遊  [2002/09/05]

    最近、妙に64bitプロセッサが盛り上がっている。理由は簡単、AMDのHammerプロセッサである。AMD AthlonとAMD Opteronという2つのブランドに分けて販売されるHammerプロセッサは、x86-64という新しい命令セットを搭載し、これが名前の通りx86に下位互換を保ちながら命令セットを64bit化したため、「デスクトップで64bitプロセッサ」とかいう話でいきなり盛り上がってしまったのである。しかし、64bitがそんなに素晴らしいのだろうか?

    ○そもそも、何が64bit?

    何をもって「64bit」と呼ぶかの定義が、割と混乱しているのがこの業界の常。例えばMotorolaの68000は、一般には16bitプロセッサとして認知されているが、Motorolaのサイトでは32bitだと主張している。要するにデータレジスタ、アドレスレジスタ共に32bitを取り扱えるから32bitプロセッサという論法だ。ちなみにMC68000の場合、アドレスバスは24bit、データバスは16bit幅でしかない。同様に、Intelは8088プロセッサを8086同様の16bitプロセッサとしているが、このプロセッサのデータバスは8bit幅しかないため、一般には8bitプロセッサとして認知されている。

    要するにデータバスなりアドレスバスの幅で決まるのか、というとそうでもない実例があったりするからややこしい。例えば同じIntelの80386SXの場合、データバスの幅は16bit、アドレスバスは24bitであり、MC68000と変わらないのに何故か32bitプロセッサとして扱われるのが普通だ。更に、Pentium Pro/Pentium II/Pentium III/Pentium 4やAthlon/Athlon XPの場合、アドレスバスは32bit幅だがデータバス幅は64bitである。にも関わらず、これらは32bitプロセッサとして取り扱われている。

    つまるところ、
    ・内部の命令セットやレジスタサイズ
    ・アドレスバス/データバスの幅
    の両方がマッチしていれば問題ないが、それ以外の場合にはそれを8/16/32/64bitのどれとして扱うかは割と恣意的だったりするのが実状だ。Hammerプロセッサの場合、幸いにもこの全てが64bitに対応しているため、完全無欠の64bitプロセッサとして安心して取り扱いできたというだけの話でしかない。

    ○それでは、64bitは何がいいの?

    というのが、次の問題である。答は2つあり、
    ・アドレス空間が大幅に増える
    ・64bitデータを取り扱う場合、演算速度が上がる
    となる。まずはアドレスの方から見てみよう。

    典型的なコンピュータのアーキテクチャでは、メモリを自由にランダムアクセスすることが望まれており、この結果、全てのメモリにアドレスを割り振り、このアドレスを使ってアクセスすることになる。まぁ、身近な例で言えば電話番号の様なものだ。ところが電話の利用者が増えると電話番号が足りなくなり、結果、携帯電話の番号が10桁から11桁に増えるように、メモリアドレスも必要に応じて増やす必要がある。で、実際にメモリアドレスが足りなくなりつつあるのである。

    現時点でのPC向けのコモディティメモリはDDR266という事になるが、現在は256Mbitから512Mbitに移行しつつある。この調子でいくと、来年中には1Gbit品が登場する筈である。この1Gbit品を使ってDIMMを作ると、1チップ構成で片面(1バンク)の製品でも4Gbit=512MB、両面(2バンク)で1GBに達する計算である。ましてや8チップ構成にした場合、片面1GB、両面2GBになる。現在のメモリアドレスは32bitを使っているため、最大でも4GBまでしかカウントできないから、つまりDIMM2枚で満杯になってしまうわけだ。メモリの容量増加は留まるところを知らず、2004年には2Gbit品、2005年には4Gbit品が登場すると言われているから、つまり2005年にはDIMM1枚でメモリ空間を使い切る計算になる。こうなると既存の32bitアドレスではお手上げになってしまうので、どうしても容量増加が必要という訳だ。ちなみに64bitアドレスの場合、そのアドレス空間は16384P(Peta:Teraの1000倍)バイトとなって、当分使い切る心配はない。

    次いで、演算速度の方を考えてみよう。今、64bitの変数AとBがあり、各々の上位32bitをa1・b1、下位32bitをa2・b2として表すとしよう。さて、ここでA+Bを計算してCにその結果を格納したい場合、64bitを取り扱えるのであれば、計算は

    C = A + B

    を1回行うだけで良い。ところが32bitデータを取り扱う場合

    c2 = a2 + b2 (下位32bit同士の足し算)
    c1 = a1 + b1 (上位32bit同士の足し算)
    c1 = c1 + carry

    ということで、3回の32bit加算が必要になる。最後のcarryというのは桁上がりの処理である。a2+b2の結果が32bitで溢れてしまった場合、その分をa1+a2に加えてやる必要があるからだ。

    もっと面倒なのは乗算である。A×Bの結果をCに入れる場合、64bitならば

    C = A × B

    で済むが、32bit同士だと

    c2 = a2 × b2
    c1 = a1 × b1 × 2^64
    c1 = c1 + ( a2 × b1 )
    c1 = c1 + ( a1 × b2 )
    c1 = c1 + carry

    というわけで、4回の乗算と3回の加算が必要になる。どちらがより高速か、言うまでもないだろう。(*)

    (*) 実はこの計算にはちょっとウソがある。というのは、a1×b1×2^64の計算は、仮にa1×b1=1だったとしても、その結果はCに収まらない桁数になってしまうので、やっても意味がないのである。従って実際には、単に符号の計算をするだけで済む事に注意。

    新着記事

    特設サイトの情報

      人気記事

      一覧

        新着記事

        特別企画

        マイナビニュースマガジン