https://jp.quora.com/%E3%81%AA%E3%81%9C%E3%82%82%E3%81%A3%E3%81%A8%E3%81%9F%E3%81%8F%E3%81%95%E3%82%93%E3%81%AE%E3%82%B3%E3%82%A2%E3%82%92%E6%90%AD%E8%BC%89%E3%81%97%E3%81%9FCPU%E3%82%92%E4%BD%9C%E3%82%89%E3%81%AA%E3%81%84%E3%81%AE
質問に間違いがありますね。
2000個のコアが入ったGPUなんかありません。企業の広報は違った(間違った)方法で計算して数字を大きく見せています。
Radion 6900XTの本当のコア数(DCU)は、5120個ではなく、40個です。こちらでダイの写真を確認でき、4*5のコアが2グループあります。
各コア(DCU)には32レーンのSIMDユニットが4つあり、各コアには並列に動作する32 bitの浮動小数点演算ユニット(FMA)が128個あり、チップ全体としては32 bitのFMAが5120個同時に動きます。
Zen2とZen3のCPUコアはどちらも256 bit(32bitの8レーン)のSIMDによるFMAが2つあり、各コアは32 bitのFMAが16個同時に並列動作する能力があり、3800Xや5800Xのような8コアのCPUですと、チップ全体で32 bitのFMAが128個同時に動作します。
従ってCPUとGPUのコア数の違いは実際には数百個などではなく、せいぜい10倍以下で、並列実行できる実行ユニットの違いは20~40倍程度であり、数百倍までにはなりません。
質問への回答
しかしなぜCPUとGPUには並列実行に違いがあるのでしょうか。
それは違うコードを実行する必要があるからです。
CPU - 順次実行
汎用のプログラミング言語で書かれた普通のプログラムを実行するためにCPUは設計されています。
普通のプログラムを書くのに使われるプログラミング言語のほとんどは、処理を順番に記述する構成になっており、順次処理というプログラミングのパラダイムを基本にしています。この順次処理の制御の流れは、前の処理の結果が次の処理に影響するため、普通は効率よく並列化できません。ごく一部に限りコンパイラがマルチコアに適した並列処理に自動変換できます。たとえコア数が少ない場合でも、コードの大半を並列化するために、プログラマは懸命にマルチスレッドのコードを書かないといけません(つまり、より大変で、時間がかかり、バグりやすくなります)。
順次処理のコードを可能な限り早く走らせるようにCPUは最適化されています。ほとんどのプログラムにとっては順次処理が本当の問題だからです。もしプログラムの半分を並列処理で書けたとして、100万コアがあり、並列処理が100万コアを活用できたとしても、もう半分の順次処理の実行速度に変わりはなく、全体としては元のコードの2倍の速さになりません。
CPUは順次処理のコードをなるべく早く走らせるために、高度な分岐予測やストール(停止時間)を最小にするための巨大なキャッシュを持つ巨大で複雑なコアを持っています。実際の演算ユニットはトランジスタの数的にもコアのスペース的にも非常にわずかです。
これはAMD Zenコアの写真です。整数演算器が入っているALUは非常に小さく、FPUは浮動小数点演算やSIMDを実行する演算器が入っています。L1D$、L1I$、L2$はキャッシュメモリ、BPUは分岐予測器で、次に実行する分岐先を予測してストールを最小にします。
GPU - 並列実行
一方GPUは並列処理に高度に特化しています。プログラム全体を実行する能力はありません。プログラムのごく一部にあたる高度に並列化された処理だけがGPUに送られて実行されます。そのためにプログラムはたくさん働いてGPUで実行するコードを生成します。
スクリーンにドットを描く処理はめちゃくちゃ並列化できる数少ない処理の1つです。もし1画面に800万ドットがある場合、1ドットを打つのにたくさんの計算をする必要があり、論理的にはその800万ドットの処理全てを並列化できます。
グラフィック処理は本質的に高度な並列処理で、ここ10年弱でグラフィックと全く関係のない計算を並列実行できるようになりましたが、並列処理ユニットは元々はグラフィック処理のためにGPUとして登場したのです。
GPUで言うコア数とはFMA(Floating Multiply-Add)と呼ばれる演算器の数です。FMAとはいわゆる一次式 y=ax+bを解くための回路で、式に浮動小数(Float)の掛け算(Multiply)と足し算(Add)があるのでFMAです。GPUがよく活用される3D演算では4x4の行列同士の掛け算や行列にベクトルを掛けるような処理を頻繁に使います。これはアフィン変換と言われるものですが、アフィン変換とは一次式を複数同時に行う計算の事です。例えば4x4行列同士の掛け算は64回の一次式(FMA)のセットです。また行列とはマトリクスとも呼び、4本(ないし3本)のベクトルを束ねることで3D空間として扱えます。余談ですが映画マトリクスの名前の由来になっています。
アフィン変換はピクセル単位のライティングにも応用されます。ピクセル単位にタンジェントスペースとも呼ばれる小さな空間(この場合は3x3行列)を作り光のベクトルを掛けることがライティングの基本ですが、1920x1080ドットの解像度なら200万個ものピクセル毎に更に複数回のライティングの為のアフィン変換がなされている事になり、膨大な計算量になります。計算量は物凄いですがピクセル単位の計算なので並列計算できそうだとも想像しやすいと思います。ですからGPUではFMA演算器を大量に詰め込むだけで性能を上げることが容易です。
CPUは事情が大きく違います。プログラムを少しでも書いた経験があれば、プログラムというものがFMA回路のような一次式だけでこなせるわけがないことはわかるでしょう。CPUでは計算結果をフィードバックして更に計算を繰り返す(それが本来のプログラムですが)ため、複数のCPUで並列に計算したとしても結果を得るためにどこかで各CPUの足並みをそろえてやる必要があります。要はCPUはコアが大量にあったとしてもGPUほど効率が上がりません。
Heikki Kultalaさんが答えている通り、さすがに2000コアのGPUはありませんね。(笑)
さて、CPUが扱うのはプロセスでありスレッドです。コンピュータの世界では単一の仕事をタスクやジョブとも呼びますが、多くのPCでは複数のアプリケーションソフト…例えば音楽再生やネットブラウザと、ファイルのバックアップやプリンター印刷などのアプリケーションも同時に実行できます。ネットブラウザだと、動画再生とネット通信と画面表示…そういう複数のタスクをOSへ渡すとOSは個別のプロセスとしてCPUへそれぞれの専用プログラムを起動させて演算させます。
今、私のPCを見ると、アプリは6つ、バックグランドプロセスは75個、Windowsプロセスが96個…動いています。それを4つの実コア上で時分割で常に8つのスレッドとして処理している訳です。これだけ動いていても、CPUの負荷はピークでも5%以下で全く働いてはいません。
負荷が軽いので自動的にクロックが落ちています。
たまに重い処理をさせる場合でも、CPUがネックになるよりもデータの読み書きを行うSSDやHDD、もしくはインターネットがボトルネックになるのです。
仮に1つの大きなダイの上に2000コアのCPUを作っても、メモリICやSSDなどとの通信が狭すぎます。これをバスネックと呼び、IntelやAMDなどのCPUメーカーが最も危惧するポイントです。つまり、CPU内部だけを高性能にしても、外部とのデータのやり取りも同様に高性能化しないと意味がないのです。
そして1つのCPUダイでそれを行うために巨大なプリント基板上に無数のメモリICを搭載する努力を始めるよりも、個別に必要なだけのPCを並べた方が安価で確実で扱いやすいし、確実に性能も出せるのです。
ぜんぜん違います。むしろ共通点は演算処理を行うと言うことだけだと思った方がいいかも知れません。
CPUは、複雑でさまざまな処理ができる高性能なコアが少数(1~16個ほど)入っています。対してGPUは、割合決まった処理しかできない単純なコアが多数(数百個)入っています。
単純なコアがどれほどのものか?かつてのGPUではプログラムが実行できなかったと言えば、イメージできるでしょうか。実はGPUでグラフィックの描画処理以外のことが処理できるようになったのは、ここ10年ほどのことで、それ以前はCPUから指示された描画のための演算をひたすら実行し、表示するのがGPUの仕事の全てでした。
単純なコアでどうして高速にできるか疑問に思うかも知れませんが、理由は案外簡単です。画面上には処理しなければいけないドットが多量にあるものの、それぞれに必要な処理というのはパターン化された演算処理が大半なので、処理するのにCPUのような高度なコアは必要ありません。単純化された小さいコアで間に合います。で、そうした小さいコアなら多量に準備してもチップ上に収まるし、そうした多量のコアを並列にして「せ~の!」で処理すれば高速にできるっていう。
GPU をどう定義するかといった前提が必要ですが、ご質問のGPUが現在市販されているアーキテクチャとした場合についてお答えしますと、CPUなしでOSを立ち上げることは無理です。
もし、GPUだけででOSを動かすコンピュータシステムなるものが市販されても、実はGPUにCPUが内蔵されたものだと思います。今のグラフィック機能内蔵CPUの逆転バージョンみたいな。
OS の役目は、コンピュータシステムにおいて、
(1)メインメモリやSSD,HDD等のストレージ、その他デバイスのリソースの管理
(2)データ、プログラムの入出力及びメインメモリへの配置、適切な初期化などの管理
(3)ユーザープログラムからの要求に対する、(1)(2)で管理したリソースについてサービスの提供
です。これらの管理機能は現行のGPUアーキテクチャにはほぼありません。あったとしても極めて限定的で、コンピュータシステム全体を管理できません。
理由は、他の方も回答されているとおりGPUが大量のデータを高速に処理する機能に特化しているためです。
その点最も基本的なCPUは、整数演算しかできませんが、チップセット或いは直接デバイスとやりとりして(1)〜(3)の機能を行うことができます。というかできるような「汎用性」を目的な作られたものがCPUです。OSという大規模なシステムがなくても、(1),(2)を実行するプログラムとセットで、ユーザープログラムを実行することさえできますし、処理時間を無視していいなら、ソフトウェアを使って小数点演算はもちろん、GPUがなくてもグラフィック処理もできます。
※もちろんCPU自体の扱える物理メモリ量や接続できるバスやデバイスとの物理的な限界(ピン数とか)、命令体系(ISA)などによる制限はあります。
ただ現実として整数演算だけのCPUでは、いろいろな処理に時間がかかりすぎて使い物にならないので、小数点演算ユニットを積んだり、大量だけど単純な演算を高速に実行するためのSIMDユニットを積んだりしています。※SIMDの前からグラフィックカードはありましたが話がさらにややこしくなるので省略します。
けれど、要求されるより大量・高速の小数点演算ユニットまでCPUに組み込むとただでさえ発熱の大きなものが更に熱い、大きい、価格が高くなってしまうので、それなら別のデバイスにやってもらってよくね?餅は餅屋で行きましょう。とCPUと並行にGPUも進化してきて、コア数だけならとっくの昔にCPUを追い越してました。
製造プロセスの微細化の恩恵を受けて、CPUの中に省電力なGPUを組み込めるようになりましたが、グラフィックカードのGPUに比べると処理能力は低くならざるを得ません。
CPUがチップとして行っている仕事はOSやアプリの処理だけではありません。
「たぶんできると思います」とかの回答はデタラメですよ。
まともに割り込み処理ができるかすら疑問です。GPUはCPUだけが相手でしたからね。MMUもそう。特権モードとユーザモードをどうするのでしょう? それがOSの仕事だと思ってるなら勘違いですよ。セグメント管理をソフトウェアでエミュレートするというなら、1回のアクセスごとに演算処理して100倍とかの時間が掛かるでしょうね。スクラッチパッドはキャッシュじゃないし、リザベーションステーション無しでたらたら処理してたら、キー入力すら受け付けられなくなります。
「コア数が4000とかあるんだから」…いや、そんな多くのコアを持ったアホなGPUなんてないです。(笑)グラフィック処理するのに、4000分割しちゃったら、命令ロードだけで待たされて画面が止まります。(笑)
CPUの真似してI/OやDRAMといったシガラミを接続したら、元の木阿弥になるだけです。
GPUは計算に特化した命令しか持っていないから、1コアのサイズをCPUよりも小さくできます。そしてDRAMみたいな糞重いメモリでなく、PCアーキテクチャでない独自バスの高速メモリにだけアクセスしていればいいから、キャッシュメモリはいらないし、多コアによる渋滞も起きにくくなっています。
Cerebras CS-1を紹介してもよろしいでしょうか? これは400,000ものコアをわずか一つのプロセッサに搭載しています。もちろんこのプロセッサもまた異常な大きさで、約20センチ四方のチップに1兆を超えるトランジスタが集積されています。アホみたいです。
そしてCPUのダイを野球のボールと比べると、以下のようなサイズ感になります。
このモンスターCPUはオンボードで18GBものメモリ(SRAM)を備えており……さらに驚くべきことに、この多くがL1キャッシュです。
このマシンは、極めて複雑な機械学習のために設計されました。このモンスターマシンを買うには実際にいくら掛かるのか私には想像もつきませんが、アルゴンヌ国立研究所が一台購入したということだけは知っています。
これは単なるジャンプ命令(割り込み復帰命令)です。
まず、なんとなく誤解されている雰囲気を感じるのでプロセスをあるCPUコアから別のCPUコアに移動させる時にどれだけの情報を移動させる必要があるかについて考えてみましょう。
CPUコアが離れている場合、例えばコンピュータAから別のコンピュータBに移動させる場合は一旦そのプロセスを停止させ、そのプロセスの停止時のレジスタ状態、メモリイメージ、プログラム本体とデータ、実行中に確保されたメモリやスタックなど一式を移動先の別のコンピュータのメモリに転送し、CPUにレジスタ状態を復帰して停止したところから実行を再開します。場合によっては関連するファイルなんかも移動させる必要があるでしょう。
上記でメモリイメージを全てコピーしなければならないのはコンピュータAと別のコンピュータBがCPUだけでなくメモリも別々だからですね。
では同じコンピュータ上でメモリが共通だった場合はどうでしょうか。マルチCPUでメモリが共有している場合などです。この場合、プロセスのメモリイメージを移動させる必要はありません。その代わりにCPU Aの物理メモリと仮想メモリのマッピング状態はCPU Bと同期させておく必要があるでしょう。そしてプロセス停止時のレジスタ状態をCPU AからBに移動させれば実行が再開できます。
同じCPUで共通したメモリ管理ユニットを使っている場合はメモリのマッピング状態を移動させる必要もありません。移動させる必要があるのはレジスタの状態だけです。
つまり、プロセスのコア間の移動は
1. コアAで実行していたプロセスXにタスクスイッチ(コンテキストスイッチ)の割り込みがかかり、OSに処理が移る
2. OSではプロセスXの停止時のCPUのレジスタの状態を保存する。
3. コアBがプロセスXのレジスタ状態をロードして割り込み復帰命令を実行する。
4. 停止したところから先をコアBが継続して実行する。
となります。これでプロセスXがコアAからコアBに移ります。
ちなみにLinuxではこのあたりの処理はkernel/sched.cのschedule()関数から先に書かれています。実際にプロセスの切り替えを行うのはcontext_switch()に書かれていて、レジスタの復帰などのローレベルな処理はアセンブラで記述されていますので、興味があれば解読してみてはいかがでしょうか。
現代(といっても90年代頃からですが)のプロセッサでは、内部的には機械語レベルで見えるレジスタ(architectural register)の数倍のレジスタ(physical register)を持っています。機械語レベルで見えるレジスタはそれぞれ対応する実体があるわけではなく、計算過程によって適宜どれかのphysical registerにつけられるラベルのようなものになっています。
プロセッサは機械語命令を書かれた通り順番に実行するのではなく、まとめて読んできて動的に依存関係を解析し、できる計算からどんどん先に進めてしまいます。
例えば機械語で、次のような命令の並びがあったとします:
- 命令1: r1 + r2 → r3
- 命令2: r4 + r5 → r2
レジスタr2は命令1で読まれて命令2で書き込まれるので、命令2を先に実行してしまうとr2が書き潰されてしまいそうですよね。でも、プロセッサは両方の命令をいっぺんに読んで、命令1が読み込むr2と命令2が書き込むr2に別の物理レジスタを割り当ててしまいます。すると、例えばr1に読んでくるデータがメモリ待ちになっていて、r4とr5に読んでくるデータが既にキャッシュに載っていたら、命令2の方を先に実行することができます(out-of-order execution)。
この命令順序の入れ替えは外からは観測できません。ばらばらに実行された結果は物理レジスタに保持されていますが、プログラムに書かれた順に命令が「完了」し、その都度レジスタの名前が振りなおされます。上の例では、命令1の実行が完了するまでは命令1が読んでいた物理レジスタにr2という名前をつけておき、命令2の実行が完了した時点で命令2が書き込んだレジスタにr2という名前をつけ直します(register renaming)。命令1完了と命令2完了の間に割り込みが入った場合、物理レジスタに保持されていた命令2の結果は捨てられます。
というわけで、「実はレジスタは増えているのだが、プロセッサが実行時にうまいことやってくれているので、表に出す必要がない」というのがひとつの理由です。
機械語レベルでのレジスタ数を抑えておくことは、プロセッサの世代が変わってもいちいち再コンパイルしなくて済むということでもあります。また、機械語レベルのレジスタ数が増えると、命令の中でレジスタを指定するビット数を増やさないとならないので、 命令セットの設計の制約が大きくなります。
おそらく機械語コードにおけるレジスタ指定を4ビット以内に抑えたいのではないでしょうか。
レジスタ指定というのは機械語命令につき最大4つ指定されます。その場合、機械語命令は命令指定+レジスタ1+レジスタ2+レジスタ3+レジスタ4なんていうビットの組み合わせで作られるわけです。そんな中で、レジスタ指定に何ビットまで割けるのでしょうか。
の「REXプレフィックス」の項を読むと答えが見えてきます。
IA-32アーキテクチャではEAX, EBX, ECX, EDX, ESP, EBP, ESI, EDIの8個のレジスタが使われていました。1個レジスタを指定するのに3ビット必要です。
簡単に2つのレジスタを指定するMOV命令で説明します。
MOV EBP,ESP
は8B ECですし、
MOV ESI, ESP
は、8B F4です。
後ろのバイトを2進数で書くと
11101100
11111100
となります。後ろから3ビットごとに切ると分かりますが、
11 101 100
11 111 100
と読み取れます。100がESPレジスタを101がEBPレジスタを111がESIレジスタを指しています。
AMD64アーキテクチャでは、レジスタを増やすためにREXプレフィックスというものを付与しています。
さて、プレフィックスが他の命令と読み間違えられてはいけません。というわけで、AMD64アーキテクチャではIA-32アーキテクチャに存在したinc reg16/dec reg16命令(op 0x40〜0x4f)を廃止してこのように使うことにしました。16ビットレジスタのインクリメント・デクリメント命令ですね。
これを廃止して0x4?の?の内容によって後ろに置かれる命令のレジスタが0~7なのか8~15なのかを識別します。命令レジスタ0~7は上記のもの、8~15は新たに追加されたr8-r15レジスタを指定することになっています。
さて、更に倍に増やすためにはどこを変えればいいでしょうかね。
やり方としては[40 ?? 後ろのコード]みたいにすれば、8ビット確保できます。4種類のレジスタ指定なので32個のレジスタが指定できます。
あとは、バランスの問題です。1バイト余分に命令を読まなければならない代わりにレジスタが多い。
もちろん、レジスタを増やせばそれだけ回路実装も大変になります。キャッシュが増えて、局所的なメモリとの頻繁なやり取りはそこまで負荷になっていないのではないのでしょうか。
CPUの命令セットに影響しますからね。CPUの命令セットは一度決めたらおいそれとは変えられません。ソフトウエア資産が水の泡になってしまうからです。
今でもまだ80386時代以降のソフトウエアは非常に資産価値を持っています。場合によっては8086時代の16bit資産も同じことです。
16bit当時や8bit当時の資産はエミュレーターで32bitや64bitマシン上で動かすということも普通に行われるようになったので、昔ほど命令セットの変更が難しいわけでもないですが、しかしながら、やはり命令セット自体が大きな資産ではあるので、やたらとメーカーは変えません。
下手に代えて非互換になると、そのすきを狙って別のチップを広げようとする他のメーカーが手ぐすね引いているからです。インテルですら64bitコード時に別のコードを持ち込もうとして失敗し、AMDが素直にx84コードを64bit化したものが今のx86の64bit版として生き残ってしまった形です。
一度覇者が出来てしまったら、大元のメーカーにすらそう簡単には入れ替え出来ないものなのです。
「パソ兄さん」に良い説明があったので転載しておきます。
同じシリコンウェハから切り出されたダイでも、製造ムラがあるので検査してクロック数ごとに振り分けます。高クロックなものほど取れる数が少なく、低クロックなものほどたくさん取れます。図解するとピラミッドの関係で、高クロックCPUの値段が高いのは希少価値によるものです。
例えばMIL規格(United States Military Standard)などのICは専用の製造ラインがあるわけではなく、検査した良品を選別しているので価格が高くなるのです。
高密度の半導体製造は農業と同じで作柄(歩留まり)があり、半導体のチップ面積を大きくすると失敗する確率も高くなり、指数関数的に高額になります。
高性能な多機能ICはウェハーの面積を広くするのではなく、Si貫通電極(TSV)によって垂直方向に積層します。256Gbyteのフラッシュメモリは16階建てになっています。
水平方向ではなく、垂直方向に回路を展開するのが現在の最適解です。ただし放熱の問題は今後の課題です。
ありますね。(^^;;
Cerebras、85万コアのウェハサイズプロセッサ「WSE-2」
85万コアらしいです。
2億円軽く超えるようです。
ウェハー全体を一つのプロセッサにする研究は50年以上の歴史があり、Wafer Scale Integration (WSI)と呼ばれています。実際に製造を目指したケースもいくつもあり、とりわけIBMのSystem/360のチーフアーキテクトだったGene Amdahl(その後、富士通のMシリーズの設計も行った)がトリロジーという会社を作りWSIに挑戦しましたが、エラーの問題をうまく解決できなかったので商用の製品には至らなかったようです。
最近では、他の回答者の皆様が書かれているように、CerebrasというDeep Learning用のアクセラレータを作る会社からCS-1, CS-2というWSIのシステムが発売され、何台か納入されているようです。
ここでは、ウェハー上に数多くのコアを配置し、不良コアがあるならば、それらをつなぐインターコネクトにより回避することにより欠陥コアがあっても正常に動作するようになっています。
しかしながら、これらのコアを切り離して良品だけを選別し、例えばChipletのようなパッケージ技術によりシステムを構成することに対する価格・性能的メリットが小さく、一方マルチコアのシステムアーキテクチャに強い制限がかかるため、今後この方向が伸びていくことは、さらなる技術革新がないと難しいのではないかと感じています。
なぜ他の皆さんが「GPUとは違う」というのかわかりませんが、当時の技術で言えば、今のGPUと同じです。
8ビットCPUである6809は、メモリ空間が64KBしかありません。
同世代のPC-8801では、この64KBのメモリの一部を画面上のドットに割り当てていましたが、CPUが管理するメモリの一部を用いる為、CPUを一瞬止めて画面表示を更新する といったやり方をしていました。(だいぶ略してますが)
正確には一つ前の機種であるFM-8からですが、FM-7ではPC-8801の方法では無く、6809をもう1個搭載して、画面表示用のメモリも専用に持たせるという方法を取りました。2つのCPUの間には共有メモリがあり、サイズは小さいですが、データ転送や命令実行することが出来ました。
もちろん、サブCPUだけ暴走するという事もあります。
当時のゲームに、「黄金の墓」というアドベンチャーゲームがありますが、このゲームの画面では、左右に映画のフィルムガイドの様な表示が動きます。FM-7版では、サブCPUにプログラムを転送して、マルチタスク処理で動かしてました。
サブCPUの役割としてはほぼグラフィック描画に特化していたようなので、役割分担的には今のGPUと同じような雰囲気はありますね。2つのプロセッサでRAM空間が違っていて、グラフィックVRAMはサブCPU側にしかなかったというのも今の独立にVRAMを持っているディスクリートGPUと似ています。
ただし、Soneさんが既に回答済のように、サブCPUもメインCPUもどちらも6809で同じ能力なので、サブCPUにグラフィック描画が高速にできるような機能があるわけではなく、そのあたりは特定の描画や演算性能に特化している今のGPUとはかけ離れています。
FM-7の2CPU構成は前身のFM-8から変わっていないのですが、このFM-8が2CPU構成をとった理由としては、下記が挙げられます。
(1) 当時の8ビットCPUのメモリ空間が64KBしかなく、48KBのVRAMを搭載するとそれだけで残りが16KBしか使えないという状況になること(これを避けるためにはメモリのバンク切り替えという機能が必要になり、少しトリッキーになります)
(2) 当時CPUの命令実行時の最大のボトルネックはRAMのアクセス速度であり、グラフィックVRAMをメインメモリと同列にCPUにつないでしまうと、VRAMにアクセスしている間にメインの処理が動けなくなってしまう
実際ライバル機のPC-8801は(2)が災いしてとても遅かったです。2CPU構成とすることでメモリ空間を128KBとし、グラフィック処理をサブCPUが行っている間メインCPUが自由に動けるFM-8/FM-7の構成はシンプルで非常に素敵なものだったと思います。
GPUとも2コアとも微妙に違う気がします。
まずGPUじゃないというのは、確かにサブ側CPUにVRAMがつながっていて今で言うグラボのようになってるんですが、メインとサブのCPUはどちらも全く同じMC6809です。つまり性能も機能も同じです。サブは特に描画に特化した性能を持っていません。
2コアとも…っていうのは、サブ側がプログラム用に使えるメモリエリアは1kBもないし、メインとサブの受け渡しのメモリに至っては128Bしかないし(以下にメモリマップの資料URLを貼ります)、またそもそもサブは描画処理で忙しいんで、メインの手伝いは自由にできないからですね。
普通に2コアと言えば、どっちのコアがどの仕事をしても構わないですけど、FM-7の場合はメインとサブのCPUの役割分担がきっちり決められてしまっている形です。
CPUの高速化には、やり方が3つあります。
- コア数を増やす
- クロック周波数を上げる
- 命令の処理効率を上げる
WindowsXPの頃までは、CPUはシングルコアが当たり前だったので、CPUの高速化と言えば上記の2または3の方法でやっていました。
クロック周波数を上げる方法は、CPUが仕事をする基準がCPUクロックであり、この周波数を上げるとそれに正比例して処理時間が短縮されます。どこまで上げられるかは、回路設計と製造技術次第になります。クロック周波数を上げれば消費電力と発熱も正比例で上昇するため、許せる大きさやコストで冷却できる限界というのもあります。
命令の処理効率を上げる方法は、回路の工夫で実現します。今まで1命令の処理にクロック1GHzだと100usかかっていたものを、50usで完了できるようになれば、同じCPUクロックでも速度は2倍になりますよね。
なのでこの2つを同時にやれば、速度はバンバン上がります。でも困ったことに…
- クロック周波数を上げやすい回路は、命令の処理効率が悪い
- 命令の処理効率が高い回路は、クロック周波数を上げにくい
という傾向があるんですよね。またポラックの法則という厄介な経験則が工夫の足を引っ張るようになってきました。これは、CPUのトランジスタ数を2倍にしても、性能は√2倍にしか向上しないというものです。
なので回路の工夫というのは主にトランジスタ数を増やすことでしたが、そうした工夫を頑張るよりも、コア数を増やせば√2倍を超えて性能が上がる、いや待て、旧世代(=より小型)のコアを複数積めば現世代を上回れるよねwwwという発想さえ出てきて、工夫するのも以前よりはずっと難しくなり…で、現代の多コアの時代になりました。
1コア1スレッドのCPUしか無かった時代、ハイエンドなPC(パソコン)ではCPUを2個以上載(CPUの搭載単位をソケットといて、2ソケット搭載ともいう)可能なものは珍しくありませんでした。これは、サーバーやワークステーションだけではなくデスクトップやラップトップでもありました。複数コア搭載が普通になった現在では、デスクトップやラップトップでは無くなり、サーバーやワークステーションの一部のみになっています。
マルチタスクOSにおいて複数の処理を公平に実行したい場合、PC全体でマルチコアマルチスレッドにことは重要です。シングルコアシングルスレッドでは重い処理がたった一つあるだけで、他の処理も遅くなってしまうことがあるからです。これはマルチスレッドだけでも効果があり、マルチコアでさらに効率が上がります。1コア1スレッドCPUの時代、マルチコアマルチスレッドにするには2ソケット以上付ける以外に方法はありませんでした。しかし、マルチコアマルチスレッドCPUが当たり前になった時代、1ソケットでも十分になったのです。そのため、デスクトップやラップトップではほぼ全滅しました。
それでもサーバーやワークステーションでは2ソケット以上搭載できるものが残っています。これらはビジネスにおいて「停止できないPC」として使用されます。部品一つ一つから信頼性の高い物を使っていますが、壊れない物は存在しないため、どんな部品でも故障が発生する可能性はあります。もし、CPUが故障したらどうなるでしょうか?そう、そのときCPUを2ソケット以上搭載する意味があります。
2ソケット以上搭載したサーバーやワークステーションでCPUの一つが壊れた場合どうなるかというと、取りあえず再移動します。そして、壊れたCPUを切り離して動き続けます。性能は落ちてしまいますが、ビジネスは継続可能です。もし、CPUが1個しかなかったら、PCは起動できません。サポートに入っていたとしても、故障部品交換まで早くて半日、部品取り寄せなどに時間がかかると翌日になってしまうことも珍しくありません。停止時間が長ければ長いほどビジネス機会を失うことに繋がり、少ない損失を与えますので、1回の再起動の時間程度の停止と半日以上の停止では比べる物でもありません。
ということで、家電量販店で売っているデスクトップやラップトップのPCでは見かけないかと思いますが、各メーカーのサーバーやワークステーションをラインナップを見れば、複数CPUがまだまだ珍しい物ではないことがわかることでしょう。
意味なくはないけど、あまり意味はないです(←おいどっちやねん!)
実は最近のCPUはマルチコアと言って、コア1個が伝統的CPUの1個分に相当し、それが複数個内蔵された構造になっています。コア数は最底辺のものでも2個、最強クラスだと64個あります。なのでPCの仕様が許す範囲内でコア数が多いCPUに交換できれば、見た目はCPUが1個だけど中のコア数を増やすことが可能、つまりCPUが増えたのと同じ効果があります。
なんですがなんですが、CPUを増やして上げられる性能は、複数の処理を同時にこなす性能だけです。1つの処理の速度を上げることはできないんですよね。なので1つの重い処理を相手にする場合は、CPUの数を増やしても性能改善につながりません。
そのためマルチコアで性能を上げる手法として、昨今ではマルチスレッドが採用されています。これは重い処理のソフトを作る時は内部で複数の処理に分割し、マルチコアで並行処理することで性能を上げるものです。
ただスレッド数を増やすのは限度があるし、そうしたソフトを書くのは大変です。それにマルチスレッド化されていないソフトではそもそもマルチコアは意味がないんで、いろんなソフトを動かした総合性能では、
処理能力2のコア1個>処理能力1のコアが2個
という結果になることの方が多いです。これが、冒頭で書いたような微妙な表現の真意です。
端的にいって全く不可能です。
GPUは”ほぼ行列演算に特化した計算器のかたまり”だといえます。ではそのほぼ行列演算用のデータや命令列をどこの誰が用意するのかと言えば、全てCPUが成形など事前準備しGPU専用のメモリ空間に置いてから演算指示を発行します。GPUに渡した命令列が最後まで実行されれば演算タスクが1つ終了ですから、次のデータや命令列を与えて、次々と処理させるのです。大抵はその処理結果が画面に反映されるのです。
このように完全なマスタースレーブ動作の仕組みですから、GPU側がCPUが行っている命令列を解釈実行することはできません。
GPUにはCPUがアクセスしているメモリ空間や、HDDやSSD、USBといった周辺機器が持つI/O空間にはアクセスできません。
我々が電卓を操作して計算するように、CPUがGPUを操作して行列演算を行っているのです。
なるほど。言われてみれば右脳と左脳で2コアですね。
人間って2つの事同時にできましたっけ? 呼吸しながら心臓ドキドキさせながら歩きながらスマホの音楽聴きながら通勤してますがこのとき4スレッド!? Yesのような気もするしNoのような気もする…。そもそもスレッドって何だっけ。
https://wa3.i-3-i.info/word12453.html
順次処理で1本道しかないプログラムの場合は1スレッド。2つの処理を並行して行うプログラムは2スレッド。なるほど。私の通勤は4スレッドです!
待て。シングルコア68000の旧Macintoshだってマルチタスクだったじゃないか。そうだ。擬似マルチタスクだ。時分割で複数のタスクを高速に切り替えながら処理していたんだ。人間の脳もその可能性がある。もうちょっと調べてみるか。
現在のCPU(インテルCore iファミリー)は同時マルチスレッディングなのか。Core2 Duoが2コアだったと。2コアCPUの場合1スレッド実行時1コア分しか使用されなければ使用されないもう一方のコアのCPUリソースは使われない。
脳は2コアだと仮定すると1コア分しか使わない簡単な処理の場合「左脳だけ使って右脳は使っていない」というような状況はありうるのだろうか…。
うちの母が脳卒中になったとき体の右半身が動かなくなったっけ。そうか。脳は左右で役割分担が決まっているんだった。首から下の右半身は左脳が担当し、首から下の左半身は右脳が担当している。だから左脳に障害が起きると右半身不随になるんだ。脳は2コアかもしれない。それぞれ体の半分ずつ制御している。脳についてもう少し詳しい情報は…
ペンフィールド ブロードマン 脳地図 - Akira Magazine
そうだった。脳は様々な部位によって役割が違うんだ。2コアどころじゃない。少なくとも 前頭葉、側頭葉、頭頂葉、後頭葉、島葉、辺縁葉 の6つの葉に分かれるから6コア。いやいや、葉もさらに機能ごとに細分化される。全部の機能で50くらいか? 人間は50、いやそれ以上の機能を同時に処理できる。
結論:脳はCPUというよりはグリッドコンピューターに近い。極めて多くの神経細胞が相互にネットワークで繋がって多くの処理を同時に実行することができる。従って2コアでも1スレッドでもない。CPUとは処理系が大きく異なるからそもそも「nコア」という概念がない。多くを一度に処理するのにスレッドを切り替えて実現しているわけでもない。だからスレッドという物もない。脳のそれぞれの部位がそれぞれの役割を担当している。右脳は左脳の代わりになれない。逆もまたしかり。だが自己修復機能及び学習機能により新機能を取得することができる。
なんかすごいですね。人間の脳の仕組みもすごいけど、コンピューターが人間にチェスを挑んで勝つこともある。仕組みはだいぶ違いますがどちらも同じようなことができて同じくらいすごいですね。
質問者様がパソコン初心者として簡単な例でお答えします。
一つのコアでは1つの仕事しか出来ません。 それが2つ、3つと増えて行くに従って同時に行えることが増えます。 たとえばゲームを動かしながら、裏でメールをチェックして、「新しいメールが来たよ!」と教えてくれたりします。 もし1つのコアしかなかったら、1つの仕事の内少しだけ実行して、次は2つ目の仕事を少しだけ行います。 さらにまた一つ目の仕事の残りを少しだけ行い2つ目の仕事にうつると動作を1秒間に数百回繰り返します。ある瞬間は1つの仕事しか行っていませんが、1秒の中では2つの仕事を同時に行っているように見えます。 ただ、これでは一つのコアの仕事量を複数の仕事でシャアしていますので、仕事が増えれば増えるだけ一つあたりの仕事は遅くなってしまいます。
そこでコアを増せばサクサクと動作するようになるので、最近のCPUはコア数を増やしてサクサクと動作するようにしているのです。 それでは無限にCPUコアを増やせば良いじゃん!って思いますが、コア数を増やすとそれだけ電気を喰います。 電気を喰うとそれに伴って熱が発生します。 熱を逃がすために強力なクーラーが必要になります。どんどん大きく重くなってしまうので、その世代でバランスをとったCPU数での商品が出てきているわけです。 今から30年以上前、私が初めて触ったCPUであるIntel 8080は1CPU(1コア)で1MHzで操作していましたがチップの放熱は不要でした。(プラスチックケースでした) 現在私がメインで使用しているパソコンはCore i7–6800Kは8コア16スレッドで4GHzで動いています。 これだと、CPUがフルパワーで動いている時、万が一クーラーが止まったら数十秒でCPUは100°Cを超えて壊れてしまします。
一方携帯電話のチップもマルチ化が進んでおり現在最新のiphoneだと6コア1.5GHzで動作しています。 6コア有りますのでサクサクと動きますね。
念のため最後に記しますが、実際のマシンのサクサク感は単純のコア数が増えれば良いだけでは無く、OSやアプリケーションがマルチコアに対応して有効に利用して、さらにメモリーの容量やディスクの速度などいろいろな要因が複雑に絡みます。 これらがバランス良く設計され、さらにコア数を増やすことでより使いやすいシステムが完成するのです。
マーケティング上の戦略です。
昔といってもかなり昔、Slot1とかの時代ですね。その頃はどんなCPUでもマルチCPUが組めました。
ある時から、ワークステーションとかエンタープライズ向けのCPUのみをマルチ化にして、一般向けの安いのはマルチ化できない、という差別化をしました。そして、マルチ化できるCPUは一般向けよりも遥かに高い価格設定をするようになりました。
現在ではXeonなどがそういった高価格帯のCPUになります。これによって、同程度の性能のCPUを、高価格なものと安価なものに差をつけて販売できるようになりました。半導体というのはシリコンウエハー上に回路を印刷した印刷物みたいなものなので、高いのも安いのも原価は同じです。この戦略はCPUメーカーの利益に大いに貢献しています。
一般向けにマルチCPU対応品を出すことは、この戦略を捨てることになりますので、新しい利益拡大方法を考え出さない限りあり得ないと思います。
実行するプログラムがそんなメニーコアに対応してないからです (゚∀゚) !
せいぜい4コア8スレッドあたりが普段使うにもオーバースペックなんですよ。私はもっと欲しいですけどね(えーw
普段の生活でも同時並行できるものと、どうしてもこれが終わらないと次に行けないって事、ありますよね? そして実際に同時並行できるものって案外少ないんですよ。
それでもCPUは、どうしてもこれが終わらないと次に進めないという作業があったとして、それを待っていては処理速度が遅いままです。ならば、どうしてもこれがのこれの結果をあらかじめ計算して予測して、あらかじめ準備しておくんですよ。これが終わった後が予測どおりであれば、あらかじめ計算しておいた結果を採用すれば時間短縮となります。もちろんその予測が間違っていたらそこから計算し直しですけどね。
その予測精度が上がれば時間短縮すなわち計算速度が早くなります。また予測が外れてもリカバリーが速ければそれほど問題になりません。これも計算速度が早くなる要因です。
そんなギャンブルみたいなえーい全部の馬単買っちゃえー的なやり方しながらですね、わずかつづですがCPUの計算速度って上がっているんですよ。
なのでコアだけ多くしても流石に2コア→4コアはかなり効果がでるでしょうが8コアになれば4コアの2倍の処理速度になるのかと言われれば…まったくそうじゃないですからね…_(:3 」∠)_
いまある複数のコアを無効にするだけですよね? (ニッコリ
ゲーム用途はマルチコアの性能よりもシングルコアの性能の方が重要とされていて、従来それはIntelが強くゲームならIntelという神話を築き上げてきました。たしかにどんなベンチマークでもIntelの方がシングルコアの性能は高く、いくらAMDがメニーコアだと言っても肝心のゲームはそんなにコアを必要としなかったからです。
ところがゲーム配信などマルチコアが活躍する場面というのも増えましたし、AMDもZen3コアになってからはシングルコア性能が向上して弱点だったゲーム用途でもIntelと遜色ない、むしろ値段からすれば安くて良いCPUだ、ということになって空前のAMDブームが巻き起こります。
…ところがですね、今現在どうなってるかってーと、IntelよりもAMDのCPUの方が(お排泄物)高いんですよ。それも発売日から日が経てばそれだけ値段が落ちるはずの半導体製品なのにまったく値が落ちない。それにくらべてIntelはかつての殿様商売もどこへやら、もうエブリディロープライスを地で行く販売戦略なのか、ほんと(お排泄物)安くなってます。できるだけ安くゲーミングパソコンを組む!なんて企画は数年前ならAMDしかないという状態でしたが、今はAMDは選ばれません。Intel一択です。それぐらい状況は変化してます。ほんとびっくりだよ…_(:3 」∠)_
Core i5-10400F 6コア12スレッドで1.5万円という破格の値段。第10世代なのでWindows11の条件にも合致します。
とても良い質問だと思います。多くの方々はシングルコア性能が頭打ちになり、マルチコア化によりCPUの性能向上を続けていると考えていると思いますが、じつは現実は結構違っています。同じクロック、同じ命令セット(例えばIntel IA32)のシングルコアの性能は現在も驚異的に向上し続けています。
その理由は、プロセッサで使うマイクロアーキテクチャ技術、例えば分岐予測、キャッシュメモリ最適化、メインメモリスケジューリングが現在も深化を続けている面が大きいと思います。
シングルコア性能を調べたいとき、とても有名な標準ベンチマークであるSPAC CPUのint と fltの数値を見ることでその進歩が判ります。Intelでも世代を追うごとに、かなり向上しています。
ということで、今の世代のシングルコアプロセッサチップを作れば、低価格で高性能のPCができますが、シリコンダイが小型化して低価格になるため、プロセッサを作るメーカーにとっては経営的に厳しいものになるとも思えます。
できますよ。世の中にシングルコアのCPUしかなかった頃から、マルチタスク・プロセスは存在していて、それはOSによる伝統の時分割処理(一発変換できない程に死語)によって実現されていました。マルチスレッドも同様です。OSのスケジューラが実行時間を区切っていて、それを各プロセスの優先順位に従って割り当て、順番に実行します。
今では4コア以上のCPUが当たり前になりましたけど、タスクマネージャを見れば、出てくるプロセスの数は余裕で数10個あってコア数よりもずっと多いじゃないですか。なんでそんな事が可能なのかと言えば、ここでも伝統の時分割処理が生きているからです。
物理コアが多ければ、その分だけリアルに同時進行できる処理が多くなって短時間で処理できる。それだけのことです。
CPUコアだと、条件分岐など複雑な処理をしています。無限ループでストールしている可能性があります。定期的にPINGして動作確認をする必要があります。CPUが256個以上となるとPINGでCPU時間の多くを浪費してしまい、非効率となる実験結果が出ています。
GPUだと、足し算と掛け算を繰り返すだけなので、ストールしません。割り算もしないので、Division by zeroの割り込みも発生しません。常に、予定時間には計算完了しています。PINGをする必要はありません。なので、GPUコアの数を1000個以上にしても効率は落ちません。
質問が古いせいか、今となっては意味がない質問になりましたね。
MacBookにはarmアーキテクチャのApple Siliconが使われることになります。
とはいえ、互換性を維持しつつCPUを移行していく作業は意外に大変です。(680x0->ppc->intelと移行してきた経験がありますが)
アプリケーションもサードパーティに対応してもらう必要があります。それに時間がかかったのでしょう。
Appleもそうだし、QualcommもSamsungもHUAWEIも最近ではMicrosoftもですが、スマホ向けのSoCはほぼ全て英ARM社が販売する基本設計をもとに各自カスタマイズを施す形で開発されています。
つまり、全ての根っこを握っているのは、ARMです。
そして、そのARMの買収に成功したのが、ソフトバンクです。
というのは蛇足ですが、AppleはAシリーズを0から開発している訳ではありません。iPhoneに求める仕様に沿って改良しているだけです。
ではMacの場合は?というと、IntelのCPUがとっても沢山種類があるのです。
この中から求める仕様に沿ったものを選べば良いだけです。以前は、MacBook Airに真っ先に搭載され、他社での採用は稀というCPUもあったりして、場合によってはApple向けに開発する事もあったのでは?と思います。
まもなくAppleがMacのCPUをIntelからARMへ移行させるという噂もあるし、MicrosoftもSurfaceXに同社オリジナルのARMベースのCPUを採用したりして、Intelは厳しい局面に立たされています。最近はプロセスの微細化に手間取ったりと良いとこなしでしたが、それでも同社が持つ技術力は頂点である事は間違いないので、頑張ってほしいところですね。
0 コメント:
コメントを投稿