マルチスレッド版数独自動生成ソフトC++コードを題材とする超初心者のためのVisual Studio C++講義
第11章 マルチスレッドプログラミング
第17話 5次魔方陣シングルスレッド版対マルチスレッド版実験結果
シングルスレッド版

(
13 22 2 7 21
4 20 17 19 5
16 10 8 6 25
19 22 13 8 3
10 1 24 23 7
15 16 2 11 21
4 20 14 18 9
17 6 12 5 25
20 12 22 8 3
10 1 19 24 11
18 15 2 9 21
4 23 16 17 5
13 14 6 7 25
21 11 14 15 4
10 1 22 19 13
12 24 2 7 20
5 23 18 16 3
17 6 9 8 25
22 14 19 7 3
8 1 21 23 12
18 16 2 9 20
4 24 17 15 5
13 10 6 11 25
23 13 17 8 4
3 1 22 20 19
11 24 2 16 12
10 21 15 14 5
18 6 9 7 25
24 19 14 5 3
10 1 20 22 12
9 16 2 17 21
7 23 18 13 4
15 6 11 8 25
25 17 11 9 3
4 1 22 23 15
14 19 2 12 18
6 21 20 13 5
16 7 10 8 24
魔方陣生成時間は8907.84秒です。
生成された魔方陣個数は2500個です。
マルチスレッド版全過程修了
)
マルチスレッド版

(
13 22 2 7 21
4 20 17 19 5
16 10 8 6 25
19 22 13 8 3
10 1 24 23 7
15 16 2 11 21
4 20 14 18 9
17 6 12 5 25
20 12 22 8 3
10 1 19 24 11
18 15 2 9 21
4 23 16 17 5
13 14 6 7 25
21 11 14 15 4
10 1 22 19 13
12 24 2 7 20
5 23 18 16 3
17 6 9 8 25
22 14 19 7 3
8 1 21 23 12
18 16 2 9 20
4 24 17 15 5
13 10 6 11 25
23 13 17 8 4
3 1 22 20 19
11 24 2 16 12
10 21 15 14 5
18 6 9 7 25
24 19 14 5 3
10 1 20 22 12
9 16 2 17 21
7 23 18 13 4
15 6 11 8 25
25 17 11 9 3
4 1 22 23 15
14 19 2 12 18
6 21 20 13 5
16 7 10 8 24
魔方陣生成時間は800.565秒です。
生成された魔方陣個数は2500個です。
マルチスレッド版全過程修了
)
マルチスレッド
対シングルスレッド![]()
速度比は
8907.84÷800.565 = 11.12694159749677
約11.1倍です。
25スレッドで20倍はいくかと思いましたが、
私のパソコンは6物理CPU・12論理CPUですから、理想的なスレッド数は12です。
対象によっても異なりますが、
論理CPUの個数とスレッド数が一致するときが最大とされるからです。
読者のパソコンはおそらく12物理CPU・24論理CPUでしょうから、
おそらく20倍近い実験結果が出ていると思います。
物理CPUと論理CPUの個数は、スタートを右クリックして
→タスクマネージャー→
パフォーマンスの順
に進んで


赤い囲いを見ると確認できます。コアが物理CPU個数で論理プロセッサ数が論理CPU個数です。
ですから、私のパソコンは6物理CPU・12論理CPUです。
尚私が論理CPU12個なのに20倍を期待した理由は、
扱っている数字が25以下の数字で小さいからです。
対象となる数字が小さい場合は、
最適スレッド数は論理CPUの個数を上回ることが経験則からわかっているからです。
6つの物理コアは常に協力し合っていて、自分の仕事が終わると苦戦している物理コアの応援に行くからです。
念のためにCPU使用率も見ておきましょう。
シングルスレッド版

マルチスレッド版

両者の差は歴然としております。
ほぼ10%対100%です。
シングルスレッドの場合は90%近くを遊ばせていることになります。
さて、第18話では6次魔方陣シングルスレッド版対6次魔方陣36スレッド版
の結果を報告する予定でしたが、
第13章で様々な魔方陣自動生成や作成を扱います。
第18話は第13章に移動することにしました。
第13章は魔方陣で扱う数字を商と余りに分解して高速化を図ります。
どれだけ高速化を果たすかと言いますと、
6次魔方陣なら1個当たりの生成時間は0.06秒で生成できるようになります。
商と余りに分解するとはどういうことかと具体的に申し上げますと、
まずすべての数字から1を引きます。
つまり、6次魔方陣であれば0,1,2,・・・,35にします。
それを6で割った商と余りに分解します。
例えば、34 = 6 × 5 + 4 とします。
そうすると扱う数字は0,1.2.3.4.5になります。
数字を小さくすると12CPUであっても36スレッドにしても高速を維持できます。
先に述べた通り物理CPU(コア)は苦戦しているコアの応援に行くからです。
商と余りに分析してから合体させるつまり総合させると高速化が図れるのです。
分析と総合という科学の方法をプログラミングに導入すると、
予想以上の高速化を果たすことができるのです。
通常の魔方陣にするにはすべてに1を加えるだけです。
プログラミングとは人の数×工夫した数に比例して高速化が図れる課題なのです。
数学も全く同じです。
ですから、数学は答えが一つであるというのは間違いです。
高校数学以上では結論を出すことことではなく結論を論証することが問われます。
論証も人の数×工夫の数に比例して存在します。
さて、以上で第11章は終了します。
第12章ではwhile文を扱います。