そこで生み出されたのが、「マルチコア化」という技術でした。これは言うなれば、1つのCPUに2つ以上の脳みそ(コア)を乗せるようなものです。その後、従来と同じコアが1つだけのCPUはシングルコア、2つのCPUはデュアルコア、4つのものはクアッドコアと呼ばれるようになります。
「シェフ」が多すぎると効率が落ちる
マルチコアの何がすごいかというと、これまで1つの脳みそで処理していたことを2つ以上の脳みそで処理できるということです。これを「並列処理」といいます。
並列処理が大幅な性能の向上をもたらすことは、直感的にイメージできるのではないでしょうか。実際、一部のプログラム、ソフトウェアはその恩恵をこうむりました。
しかし、です。将棋プログラムについては、最近まで並列処理による効率化は思ったほど効果を発揮しませんでした。その理由の詳細はここでは説明しませんが、将棋の手の探索という作業においては、通常の「複数のコアが協力して1つの処理をする」という形での並列化が、あまりうまくいかなかったのです。
レストランの調理場にたとえれば、通常の並列化は、複数のシェフが協力して1つの料理を作ろうとするものです。これはたしかに速く料理ができそうですよね。
ただし、それもシェフの人数次第です。
1人前の料理を2人のシェフが協力して作るなら問題ありません。実際、将棋プログラムでも2コアでの並列処理のときは非常に効率よく探索できます。でもシェフが、8人、16人、あるいは64人になったらどうでしょうか? ここまでくると、むしろどんどん効率が悪くなりそうですよね。そもそもキッチンが人であふれかえってしまいます。
実際に将棋プログラムでも、ある程度のコア数以上での並列処理は、性能の向上が極端にしにくくなります。下手をすると、並列処理をしたせいで性能が劣化したりもしていたのです。
適当によい情報を共有し合う
ところが、ここ3年くらいで新しい探索方法が生まれました。正確には昔からあった方法が見直されたというのが正しいかもしれません。それが「怠惰な並列化」です。
この手法はとても単純で、ものすごく簡単にいえば「複数のコアがバラバラに1つの処理をする」形での並列化なのです。怠惰な並列化は、複数のシェフが別々に競い合って、1つの料理を作ろうとするものです。そしていちばん速くできた料理をお客様に提供します。
もちろんまったく独立で作るわけではありません。各コアは別々に作業するのですが、各コアがたまたま発見できたよい情報は全体で共有されます。このへんのゆるい協力関係を「怠惰」と表現しているのだと思います。
この「適当によい情報を共有し合う方法」がなぜうまくいくのか。いろいろな説明が考えられます。でも、その理由を完璧に説明することは専門家にも容易ではありません。あえて説明をするなら、「実験してみたらうまくいった」くらいでしょうか。まったく説明になってないともいえますが、ある意味ではこれ以上の真実はないのです!