
ハードウェアを知る (2) CPU
今回は、CPU を取り扱います。
まー CPU には、いろいろあります。皆さんのスマホは ARMが殆どです。ここでは PC/Mac や Cloud で主流の Intel / AMD 系の CPU を題材に扱います。
CPU の構造
ざっくりと以下の図のような構造をしています。
Intel Core2 Duo は、2006年くらいに登場したCPUですから、ちょっと古いですよね。
ですが、PC向けに 1つの Socket に 2つの Core を搭載したという意味では、現在の主流となっている CPU のアーキテクチャのはしりかもしれません。
ここでもキャッシュがある点は注意したいですね。

用語ですが。
Socket は、CPU をマザーボードに挿入しているその場所そのものを指します。Serverになると、Socket は1つではなく複数持っているのが殆どですね。皆さんの PC/Mac は、殆どが1つです😊

Core は、CPUの論理的な単位です。Coreで1つのCPUとも言えますね。現在市場に出ているほとんどの CPU は複数のコアを持っているマルチコアです。
複数の Core
なぜ Core が複数なのでしょうか?
課題の一つは発熱問題です。
CPUのクロック数は、Intel の創業者の一人のゴードン・ムーアの経験則の通り、どんどん高速化していきました。その結果、あの小さな半導体の発熱を冷却するのが技術的に困難になってきたんです。
現在の殆どのCPUのクロック数は 3GHz 強です。10 Ghzになると、太陽のコアと同じになる、という話を聞いたことがあります。そこまでいかないかもしれませんが..

別の視点ではですが。
OSの登場以来、実に多くのアプリケーションが稼働するようになりました。これは、私の Windows 11 のタスクマネージャーのCPUでの表記です。

プロセス数は 284 あります。284個のアプリケーションが今同時に動いているのです! CPU のコアは 4 ですよね。つまり 4つ の CPU を 284 のアプリが奪いあっているのですよ!
OSの仕事の一つにタスク管理があるのですが、どのアプリが、いつどのCPUを使えるのか? 全てのアプリが「俺が先!」と言っているかもしれませんよねー。いやー、大変そうです。
アプリケーションからは、実はスレッドという単位が作られます。これは 1度に CPU に対して処理をさせたい論理的な単位なんです。1つのアプリが複数のスレッドを作って、CPUの処理が終わるまで待っているんです。
私の Window 11 では、3,280 ものスレッドが作られていますね!!!
いやー、更に大変。もう人の理解できる範囲を超えてますよね。
CPUのコア数が倍になれば、同時にこなせる処理量も倍になります。
そう、スケールアップのためなんです。
NUMA - Non-Uniform Memory Access もしくは Non-Uniform Memory Architecture
CPU が複数あるとして、それぞれがデータを読み込んで処理をします。データは RAM、つまり メモリー上にありますから、メモリーと通信を行うわけです。
SMP - Symmetric Multiprocessing というアーキテクチャが当初考えられました。

この場合は、複数のCPUから、メモリーにアクセスするためのバスは1つしかありません。Front Side Bus ですね。つまり、実際には、複数のCPUでバスを使うための取り合いが起こるわけですね。バスにもクロック数と帯域がありますね。CPU内部で処理をしている時間帯が多い場合はいいのですが。頻繁にメモリーとやり取りをするような処理。つまり、データを取り扱うデータベースのような処理の場合は、バスの利用頻度があがりますよね。ここがボトルネックになりえるわけです。
そこで、NUMA が登場します。

Numa は、CPUを Node という単位に分割します。Node単位で、メモリーへアクセスするための バスを持ちます。メモリーの場所もNode単位で論理的に分割したりします。
これによって、複数のCPUがある場合でのメモリーの効率的な利用ができるようになりました。クロック数は変わりませんが、スケーラビリティがあがったんですね。CPU数を増やしてもパフォーマンスが上がらないケースがあったんですね。
ちなみに、NUMAを活用するにはアプリケーションが NUMA に対応したコードを書く必要があります。
ちなみにデータベースで一番最初にNUMA対応したのは Microsoft SQL Server です。今は、殆どのデータベースはNUMA対応しているかと思います。
古い図を共有します。
サーバーのハードウェアはやはりすごくて。これは Windows Server 2008 R2 ですから、2010年くらいのIntel x64 CPUと Windows Serverの組み合わせです。256の CPU コア。

今なら、Azure で 416 CPUコアの仮想マシンを数分で作成して、削除できるんですよ…すごい時代ですよね。

Mv2 シリーズ - Azure Virtual Machines | Microsoft Docs
まとめ
今のCPUとメモリーのアーキテクチャもその歴史を追う事で理解が進みます。これは、現在の Cloud 上の分散システムのアーキテクチャにも通じますよね。そうなんです。単一のCPUの中でも複数の役割の部品があって。それらが分散通信をして処理をしています。
ハードウェアだから関係ないや、という事は全然ないですよね。
次回は 64-bit CPU を取り上げる予定です。