![見出し画像](https://assets.st-note.com/production/uploads/images/148803549/rectangle_large_type_2_4a12d0468f274852365827a5540b40b4.jpeg?width=1200)
シングル性能を犠牲にして、スレッドを増やすと、マルチ性能が向上する
前置き
みなさんは、マルチスレッディングという技術をご存じでしょうか?
簡単に言えば、分身みたいな感じで、一度に処理できるプログラムを増やす技術です。
では、このマルチスレッドという技術は、果たして意味があるのか無いのか
それについて、語りたいと思います。
現実のマルチスレッド
現実のCPUだと、このマルチスレッドを使うことで、スレッド数をコア数の二倍にすることができます。
(Xeon Phiは例外です)
メリット
このマルチスレッディングを使うことで、同時に実行できるプログラムが増え、並列処理能力が向上します。
ですが、実際はいろんな関係で2倍ではなく、2割から3割くらいしか性能は伸びないと言われています。
デメリット
そんな素晴らしいマルチスレッディングという技術ですが、当然弱点があり、それがシングルスレッド性能が低下するというものです。
(シングルスレッド性能は一つのプログラムを実行する能力って感じです)
疑似的に二つのプログラムを同時に動かすので、片方を実行しているときはもう片方の実行が出来なくなります。
そのため、片方のプログラムの速度だけ見たら、低下する恐れがあります。
極度細粒化によるマルチスレッド
僕がレッドストーンCPUに搭載させているマルチスレッド技術は、僕が独学で考えたもので、「極度細粒化」と名付けています。
メリット
この極度細粒化のメリットは、なんといってもシングルスレッド性能が低下しない点です。
無限に性能を上げられるわけではありませんが、ある程度ならシングル性能を落とさずにスレッド数を増やすことが出来ます。
デメリット
やっぱり、実装するのは若干面倒です。
全ての回路を、マルチスレッドを考慮しながら設計しないといけなくなるので、その分難易度は増します。
本題
※ここから先は、僕が開発している赤石CPUの話になります。
現実のCPUは違う可能性があります。
犠牲になるシングルスレッド性能
僕のマルチスレッド技術の場合、ある程度まではシングルスレッド性能は落ちませんが、それでもスレッド数を増やしていくと、シングルスレッド性能が低下します。
つまり、スレッド数を増やせば、その分シングルスレッド性能が低下するわけです。
なので、シングルスレッド性能重視のCPUの場合は、あまりよろしくありませんが、マルチスレッド重視のCPUの場合はどうなんでしょう?
マルチスレッド性能も上がらない?
ところで、このような疑問がわいた方もいらっしゃると思います。
「シングルスレッド性能が低下するなら、マルチスレッド性能も上がらないのでは?」
実は、マルチスレッド性能はシングルスレッド性能×スレッド数で求められます。
つまり、スレッド数が上がっても、シングルスレッド性能が落ちるなら、マルチスレッド性能は上がらないのか
結論から言うと、ただ計算や演算をするだけなら、上がりません。
ですが、条件分岐の時は、話が変わってきます。
条件分岐の無駄が減る
なら、スレッド数を増やしすぎると、意味がなくなるのか?
僕の答えは、NOです。
まぁ、当然これ以上増やしても性能が上がらなくなるというラインはありますが、そのラインはこれまで上限だと思っていたスレッド数より上です。
この画像を見て下さい。
![](https://assets.st-note.com/img/1722165415003-EfSCY8Y4YA.jpg?width=1200)
この画像は、2スレッドで処理を動かした時の図です。
条件分岐を動かした時、次の処理を行うことができず、その時間が無駄になってしまっています。
それでは、次にこの画像を見て下さい。
![](https://assets.st-note.com/img/1722165430002-faodvifhg1.jpg?width=1200)
この画像は、他の条件は同じにして、4スレッドで動作させた場合の図です。
他の条件は同じですが、thread0の無駄になっている分が減っています。
条件分岐の時、他のスレッドの処理を行っているため、その分無駄になってしまう時間が減り、処理が高速化されたという訳です。
本来の限界?
実は、画像の場合はすでに限界である可能性があります。
これまでは、下の画像のようになっていました。
![](https://assets.st-note.com/img/1722165449746-8VpwWTT9ty.jpg?width=1200)
これは、明らかに無駄まみれですよね。
それで、この無駄な時間を有効活用するというのが、僕のマルチスレッディングになっています。
ですが、そうするとこの場合は前の演算結果を次の演算に使えるようになるまでにかかる時間をちょうど埋められるスレッド数が限界だと考えていました。
![](https://assets.st-note.com/img/1722165612522-ePaKo2A2LJ.jpg?width=1200)
なぜなら、それ以上やるとシングルスレッド性能が低下するからです。
僕の用途の場合、重要なのはシングルスレッド性能で、マルチスレッドを十分活かせるプログラムの方が少ないです。
なので、シングルスレッド性能を落とさずに済むスレッド数までが、高速化できる限界だと思っていました。
最後に
今回は、僕が得意な独自マルチスレッディングについて話してみました。
いかがでしたでしょうか
僕は、赤石CPUを開発する時、毎回このようなことを考えながら制作しています。
そんな中で、マルチスレッド性能がとにかく重要な場合、スレッド数を本来の限界よりさらに増やすというのが効果的である可能性を感じ、調べてみたら本当だったという感じです。
さらに、マルチスレッド性能を上げられるとはいえ、プログラムによっては誤差レベルの差になる可能性があるため、基本的にこの方法で限界までマルチスレッド性能を上げるのはやらないと思います。
それよりも、シングルスレッド性能が犠牲になる方が深刻な場合が多いので…
ですが、GPUなどの用途の場合は、もしかしたらありかもしれないと考えておきます。
ですが、この考え方を応用すれば、条件分岐の時の速度を通常演算と同等の速度にすることができ、クロックを固定にしながら、5Hzなども出せる可能性があります。
夢が広がりますね。
それでは、最後まで読んでいただき、ありがとうございました!
この記事が気に入ったらサポートをしてみませんか?