珍しく、プログラムの話しです。
あたしは、多コアPCのために、大量のスレッドを立ち上げて、処理が完了しだい次のデータを送り、すべてのスレッドが、順当に終わる。
そんなプログラムを作ることが多いです。
まぁ、大量のスレッドと言っても、CPUの最大スレッド数以上には立ち上げませんけれど、
例えばで言うなら?
100スレッドを超えるようなPCでも、8スレッド程度の個人向けPCでも、CPU使用率が100%近くなるようなプログラムを作ることが出来ます。
勿論100%にすることも可能ですが、色々とOSの方にも影響が出てくるので、99.9%くらいが良いですね。
簡単に言うと、最大スレッド数 -1 とか -2くらいの規模で作れば、100%行きます。
勿論、他のサービスに影響が出てはいけないので、その辺りは、設定で変更出来るようになっています。
サービスは、複数のPCから呼ばれ、タスクはどんどんと積み重なっていくので、
CPUの根本的な速度や、メモリの量、ストレージの量、速度、そう言った物を考慮しながら、作っていくわけですが?
使用するスレッドが64個有って、20のタスクを、実行する場合どうしたら良いでしょうか?
全部に均等にスレッドを割り当てる方法、古い方のスレッドを多めに実行する方法。
何も考えず、終わるのを待ってから次を実行する方法。
色々あります。
あたしが今行っているのは、すべてのタスクに均等にスレッドを割り振る方法です。
勿論割り切れなければ、古い方へ優先的に割り振ります。
64/20=3.2ですから、一つのタスクに3つか2つのスレッドになりますね?
マルチスレッドプログラムを組む上で、最低限注意しなければならないのは、スレッドの立ち上がりが以外と遅いことです。
スレッドを起動して、処理が完了したら終了して・・・それを永遠繰り返していると、スレッドの立ち上げと終了というオーバーヘッドは、タスク全体の処理を遅くします。
そこで、スレッドを立ち上げたまま、次のデータを送り込む方法というのもあります。
しかし、それはそれで、結果の保存、計算領域の初期化など、沢山の不要な処理が必要になり、結果的に不具合の温床になります。
ですので、手っ取り早く、1タスクのスレッドの最少数を設定しています。
まぁ、基本的には4か8か、その辺りです。
タスクの各データの、処理単位を小さくしすぎなければ、スレッドの起動と終了よりも、各スレッドの実行時間が長くなれば相対的に、オーバーヘッドが小さくなると言うことですね?
その当たり、タスクの種類によって、作るサービスの種類と言いましょうか?
それらによって、どの方法を選ぶかというのを決めたりします。
でもまぁ、データ毎にスレッドを起動した方が、GCも綺麗で早いと思うので、こっちを多用する傾向です。
スレッド処理をする時に、注意しなければならないのは、実処理をするスレッドと、スレッドにデータを割り振るスレッド、結果を保存したり、整理したりするスレッド。
PCを再起動した時などに、処理の中断や処理の再開をするための機能、色々と必要になります。
また、いつ新しいタスクが追加されるかも分からないので、
通信を常にリスニングしている必要もあります。
Windowsのサーバーには、クラスタリングの機能が元々あるのですが?
クラスタリング機能を有効的に使うには、DCクラスのサーバーと、複数台のサーバーが必要になります。
クラスタリングは、タスクをサーバー間で自動的に割り振ったり、結果を集約して、返してくれたり、いろいろな機能があるのですが?
まぁ、そもそも、サーバーの金額が高いこと、クラスタリングの機能を作るためには、専用のプログラムが必要なこと
そして何より、日本語でのまともな説明が何処にも無いこと(笑)
クラスタリングの機能を使うためだけに高価なサーバーとそのOSをそろえるくらいなら、自分で無理して頑張って、同等の機能をプログラムで作り上げた方が早いです。
昨今のPC事情としては、個人向けでもコアが64個くらいあってもおかしくない状況で、
ThreadRipperなんて256スレッドとか有りますしね?
Core Ultraでしたっけ?何でしたっけ? 新しく発表されたXeonも結構な数ありましたよね?
コアを遊ばせてないで、どんどん使っていきましょうよ?
|