マルチコアは皆さんが思っているようなマルチコアか?

コンピュータ将棋を理解する上で、大事なことの一つにマルチコアというのがあります。皆さんのお手元のPCや最近ではスマホも当たり前のようにマルチコアになってきています。ところで皆さんがマルチコアと言っているものはどんなものなんでしょうか?

CPUというのは、コンピュータにとって頭脳と言えるものです。下の画像はCPUの一種類インテルCorei7です。皆さんはこういうものが幾つか繋がってマルチコアとなっていると想像してませんか?

f:id:ponanza:20140407212302j:plain

CPU Corei7 画像のものは4コアCPU こちらより画像を引用

 

実はこの中にすべてのコアが含まれているます。中の画像を説明付きの画像を見てみましょう。中にCore(コア)と書かれた部分が4つ見られると思います。4コアと言われていても、別々に分かれているわけでもなく同じ基板上にプリントされているわけですね。

f:id:ponanza:20140407212817j:plain

 内部アーキテクチャ 共有メモリ(L3キャッシュ)が意外と大きい こちらより画像を引用

 

10年位前からCPUはマルチコアが進んでいて、その理由はここで述べられているように以下のものである。

ダイナミック電力も漏れ電流によるリーク電力もおおむねトランジスタ数に比例して増加する。前に述べたように、トランジスタの増加に対する性能改善効果は飽和してきており、トランジスタを多く必要とするアーキテクチャの複雑化は、電力が増える割には性能の改善が小さく効率が悪くなってきた。このため、プロセサコアを複雑化するより、その分のトランジスタでプロセサコアを複数個作ってしまおうという方向になってきた。

ちょっと何言っているかわからないと思いますが。大雑把にいうと1コアの性能向上が限界が近づいた来たなか、ハードウェアの業界の人達は複数コアにすることで限界を突破しようとしているという状態です。

しかしマルチコアでいいコトばかりではありません。俗に言うフリーランチの終焉です。

 ただし、ヘテロジニアスマルチコアへの変化には痛みが伴う。それはソフトウェア面だ。ヘテロジニアスマルチコア化によって、ソフトウェア開発の労力が激増する可能性があるからだ。ヘテロジニアスマルチコアは、ハードウェア側の痛みを、ソフトウェア側に持って来るアプローチと考えることもできる。 これまで、CPUはシングルコアの性能を高める方向で来た。そのことは、ソフトウェアにとってはタダ飯食いと同じことだったという。つまり、ソフトウェア側は何もしなくても、CPUが進化するにつれて同じコードがより速く走るようになったからだ。ソフトウェアは、増えるパフォーマンスをどんどん食べればよいだけだった。ころが、CPUベンダーがマルチコアにターンしたため、状況が変わってしまった。汎用CPUコアのシングルスレッド性能は、現状ではもはや急激には伸びてゆかない。その代わり、マルチコア化によりマルチスレッド性能が急激に上がって行く。そのため、ソフトウェア開発者はCPUのパフォーマンスを活かそうとすると、ソフトウェア側を根底から切り替えて行かなければならない。特に、ヘテロジニアスマルチコアになると、対応が非常に重要となる。CellやAMD CPU+GPUの場合は、演算コアであるSPEやShaderで走るコードを書けば非常に高いパフォーマンスが得られるが、そうしない限り大きな性能アップは得られない。これまでと違って、パフォーマンスアップはタダではなく、代価を払わなければならない。フリーランチは終わってしまったというわけだ。

今までは、CPU性能向上にともなって、プログラマは勝手にプログラムが高速化(フリーランチ)できたのですが、マルチコアはプログラマの負担を激増させます。とりわけ単純な並列化ができない(コンピュータ将棋含)問題でのプログラマの負担はかなり強烈です。はっきり言って、現在でもかなりの数のプログラマが多くの問題で上手に並列化をさせることができていません。

コンピュータ将棋プログラムでマルチコアやマルチプロセス、あるいはクラスタ化について議論をしている人が多数いますが、残念ながら並列化がどういうものか正確に認識している人が少ないと感じています。このエントリはその誤解を解く一助になれば幸いです。