マルチスレッド版数独自動生成ソフトC++コードを題材とする超初心者のためのVisual Studio C++講義
第11章 マルチスレッドプログラミング
第1話 マルチスレッドプログラミングとは?
すでに第10章第10話で予告してしまったので、
皆さんはマルチスレッドプログラミングのイメージは掴んでいます。
マルチスレッドとは多数のスレッドという意味です。
ルートスレッド(今まではこのスレッドしかありませんでした)は多数のスレッドを派生させれば、
プログラミングの演算速度が何十倍化できるテーマが多数存在しています。
魔方陣自動全生成というテーマはまさにマルチスレッド向きのテーマで生成速度を著しく向上させることが可能です。
例えば、5次魔方陣なら25次スレッドプログラミングでほぼ25倍化が見込めます。
なぜか言うと部屋番号0の部屋に入る生徒の出席番号は1から25までありますので、
それぞれのスレッドにそのうちの1つを入れて専用で探索させればよいのです。
私のコンピュータは少し古いので、
6物理CPU・12論理CPUを積んでいるのみですが、
最新のものなら12物理CPU・24論理CPU搭載のものもあるでしょう。
物理CPUとは・・・
実際にパソコンの中に入っている「本物のコア(演算装置)」の数です。
6物理CPUなら、6個のコアが同時に処理できます。
論理CPUとは・・・
1つの物理コアを「2つの仮想コア」として扱う技術(ハイパースレッディング)によって、
OSからは 2倍の数のCPUがあるように見える 仕組みです。
私はこれも分身の術だと思っています。
論理CPUは次のような関係になります。
という関係になります。
なぜ論理CPUが重要か。
マルチスレッドプログラミングでは、
スレッド数を論理CPU数に合わせると最も効率が良くなる
という基本原則があるためです。
シングルスレッドプログラミング(今まで学んだプログラミングはすべてシングルスレッドプログラミングです)のとき、
CPU使用率何%ぐらいであるか知っていますか。
実際に試してみましょう。
CPU使用率やメモリ使用率などを調べたいときには、
タスクマネージャーというソフトを起動します。
起動するにはタスクバーにある
スタートのところで右クリックをします。
そしてタスクマネージャーをクリックします。

タスクマネージャーが起動しましたら
パフォーマンスをクリックします。

CPUを選びます。

なんとCPU使用率3%です。
皆さん驚かれたでしょう。
つまり、コンピュータの持っている能力の1/33程度しか使っていないのです。
では皆さん、エクスプローラーを起動して、

C:\Users\fmut1\source\repos\魔方陣自動生成\x64\Debugというフォルダに行ってください。
魔方陣自動生成というファイルがあります。
ただし、新しいプロジェクトの名称を『魔方陣自動生成』とした場合です。
異なるプロジェクト名にした場合には『魔方陣自動生成』を自分が設定したプロジェクト名に変更して読んでください。
『魔方陣自動生成』とは実行ファイルとかEXEファイルと呼ばれるもので、
Visual Studio 2026を起動しなくてもその実行ファイルをダブルクリックするだけで、
プログラムを実行することができるのです。
ですから、ダブルクリックしましょう。

プログラムを実行しても
6%から10%ぐらいです。
現代のパソコンの能力は思ったより高そうです。
CPU使用率を100%にすることは大変簡単です。
12スレッド程度にすれば100%は実現できます。
どのスレッドのときに最速になるかは実験してみないとわかりません。
今はシングルではコンピュータの能力の1/10も使っていないことはおわかりでしょう。
魔方陣自動生成以外にも高速化が期待できる分野はあります。
魔方陣自動生成と同程度かより高速化が期待できるテーマは数独自動生成です。
何度かお話ししたように、36スレッドを発生させて、
問題のタイプ(左右対称型・上下対称型・点対称型・線対称かつ点対称型・ハート型・非対称型)、
ヒントを置くスタート地点(81箇所可能)、
そこからいくつ飛ぶか
(3の倍数でないものなら偶数でも可、飛ぶというのはスタート地点が51だとしてそれにいくつ加えるかです。
例えば、10飛びなら次の地点は61となります)
という3つの個性を持たせることによってシングルスレッドの3000倍以上の高速化に成功している場合もあります。
逆に難しいテーマもあります。
A→B→C→・・・→Z
のように手順を踏まないと実現できないテーマです。
直列プログラミングと呼ばれるものです。
マルチスレッドプログラミングは並列プログラミングと呼ばれます。
囲碁や将棋もある程度の高速化が期待できます。
ですが、3スレッドから5スレッドぐらいが最も速いとされています。
囲碁や将棋が並列化が可能なのは、
次の一手で異なる世界を構成できるからです。
ただし、手順前後で結局同じ局面になってしまう場合もあり、
スレッド数を多くすればするほど速くなるわけではありません。
比較的向いているテーマとして素数生成もあります。
ですので、次話以降で素数生成のマルチスレッドプログラミングに挑戦しますが、
まず、シングルで組んでからマルチスレッドで組みなおします。
シングルで組む際の考え方を第2話で説明して第3話で答え合わせをします。