Previous Page | Next Page

マルチスレッド&アセンブラプログラミングをしてみる(コラッツ予想のプログラム)

 多コアCPUのコアを使い切るにはどうするか?とここ数年考えていたのですが、そういえばコラッツ予想(3n+1問題)を確認するプログラムはちょうどよい例だと思いプログラムを作成してみました。


CollatzAsmについて


 せっかくなので64ビットアセンブラで作成し、128ビット(2の128乗)までの数を扱えるようにしました。ちなみに64ビットだと入力が数百億程度(35ビット程度)で内部の計算が桁あふれを起こします。
Visual Studio 2022(C++/Asm)で作成しています。ここからプロジェクトファイル一式をダウンロードできます。


 Visual C++ですが32ビットバージョンはインラインアセンブラが使えるので、お手軽にアセンブラを使えたのですが、64ビットになりなぜかインラインアセンブラをサポートしなくなりました。ということで約30年ぶりにアセンブラのソースコードを書きました。
ちなみに、16ビット時代はアセンブラプログラミングの参考書が豊富にあったのですが、64ビットになりあまり見当たらなくなりました。昔はミックスドランゲージといって、Cからアセンブラを呼び出す方法もよく解説をされていたのですが、今では、ここに資料があるくらいで、基本的なことが分かっている人じゃないと意味不明かと思われます。
詳しい解説はご希望があればやりますが、このプロジェクトをサンプルとしてもらえればと思います。


 また、このサンプルはC++14のマルチスレッドのサンプルにもなっています。長い間マルチスレッドプログラムと言えばOSのAPIかランタイム関数を使って作っていたのですが、C++14からプログラミング言語にサポートされたということで作成してみました。


実行例は以下のとおりとなります。



最初の引数で何処までの数を確認するかを入れ、2つ目の数は並列度(スレッド数)になります。
サンプルでは10になっていますが、当然コア数以上の値をいれます。32論理コアに対して100とかにしてもパフォーマンスが上がります(後述)。


CollatzAsmBenchについて


 アセンブラでのプログラミングに限った話ではないのですが、プログラムの最適化の過程で試行錯誤を行うことがあります。特にアセンブラでプログラムすると様々な命令を使うことができるのでそのバリエーションが増えるかと思います。
ということで試行錯誤の記録として10個程アセンブラのコードのパフォーマンスを比較するプログラムを書いてみました
以下、実行結果になります。




ChatGPTの出力コードとの比較


 いわゆるバイブコーディングということで専用のツールも出てきていますが、コラッツ問題を扱うプログラムに関していうと、どこにでもあるのでChatGPTでも簡単なプロンプトでかなりいい感じのコードを出力しています。ということでChatGPTでプログラムを出力させてみました。、実際に試してみたところ可能でしたがあまり速度が変わらなかったので、今回はアセンブラでの出力はしていません。ChatGPTが作成したマルチスレッドのものを掲載します

 私が作ったコードと比較するとマルチスレッドの初期化の取り扱いがうまいです(emplace_backを使っている)。一方で、データ長は64ビット止まりで、並列性も論理コア数に従ってスレッドを作成していますが(hardware_concurrencyメソッドを呼んでコア数を取得している)、このプログラムの場合、各スレッドの実行時間が必ずしも同じではないので、スレッド数をより多くして各スレッドのタスクを細かくした方が、実行時間のばらつきの減少が期待できます。一方で、一般論になるのですが、論理コア数以上のスレッドを実行させると各スレッドがCPUのリソースを食い合いすることになるので、実行スレッド数を論理コア数に合わせるのも一つの手になります。


 今回はアセンブラでは比較をしませんでしたが、CやC++のコードを単純にアセンブラにしてもあまり早くならないということもあります。一方で128ビットのような桁数の多い計算をさせる場合、アセンブラには桁あふれを処理する命令があり、CやC++で組むよりはるかに効率的なプログラムが記述できます。機会があればChatGPTでアセンブラプログラムの最適化を行いたいですが、↑の例にあるようにAIに任せるより、自分で工夫をした方が手っ取り早い面があります。もちろんですがアイデア出しをAIに頼ることもできますので、こういうことではあまりAIと人間の比較は意味がない(人間からしたらAIも利用する)ということになりますが、2025年9月現在、このあたりのチューニングはまだ人間の方に一日の長があるかと思います。(追記)この記事の公開後、1週間でClaudebotと名乗るロボットからZipファイルがダウンロードされたのでひょっとしたらClaudeにコードがパクられるかもしれません。


 最後に実行結果を



ということで、倍以上のパフォーマンスを示しています。逆にいうと倍程度にしかならないのですが、ある処理時間が半分になるということは2020年代のCPUの進化でいうとほぼ10年に相当します(この場合シングルスレッド性能の比較になる)。つまり上手くアセンブラでプログラムを書き直すことができればCPUの進化を10年先取りできるとも言えます。CPUのシングルスレッド性能の向上が顕著だった90年代ですと概ね1,2年でパフォーマンスが倍になっていました。
余談ですが、アセンブラでのプログラミングは8ビットや16ビットの時代は割と一般的でした。90年代以降ではCPU自体の進化が早かった為、アセンブラでのプログラミングがエンコードなど、いわゆるSIMD命令を使うためとか、ニッチになった感がありました。CPUのシングルスレッド性の向上が見込めなくなった昨今、アセンブラでのプログラミングが見直されるかもしれません。
話を戻すと、コラッツ予想の確認プログラムの場合、スレッド数を100にしても性能が伸びていることを確認できます。これは、前述のとおり値により処理ステップにばらつきがあるためで、区間を細かくした方が(スレッド数を多くし多方が)、CPUから見た場合のトータル処理時間が平均化される為です。

2025-09-08 | コメント:0件

マイナ保険証(2025年7月)資格確認証を入手しました

 Youtubeの方ではマイナンバー問題ということでちょいちょい動画をアップいましたが(こちらが再生リストになります)、ここ数か月動画の更新をさぼっていましたが、この度資格確認証を入手しましたのでそれについての記事になります。


資格確認証を取得するメリット(ほぼ今までどおり保険診療が受けられる)


 マイナ保険証については過去にトラブルが発生しその検証・対策もまるで素人がやっているようで(詳しくはマイナンバー問題)、今後もきちんと運用がされるかどうか怪しいところがあります。
こういう状況で安心して保険診療を受けられるようにするには『資格確認証を取得する』ことが選択肢になるでしょう。具体的には、マイナ保険証の利用登録解除(および場合により多少の追加手続き)を行うと「資格確認証」が送られてくるようになります。これは従来の保険証とほぼ同じものであり、今後も従来どおりの保険診療が受けられるようになります。政府は「デジタルだ!」といいながら、不完全な(ベータ版としか言いようのない)システムを導入しているが、そんな不完全なシステムが引き起こすトラブルにいちいち付き合う必要はないでしょう。
ちなみに、2025年7月時点での利用登録解除は数万件程度であり、今の段階では比較的スムースに登録解除ができるようです。今年は私のマイナンバーカードの更新年で、新しいカードを取得するのに2か月半かかったが、利用登録解除はそれよりはるかい迅速に手続きができるようです。一度登録解除を行い、二度と登録しないようにすれば、今までどおり安心して保険診療が受けられるようになります。


マイナ保険証でよいのではないか?


 現在、マイナ保険証を利用しており特段問題がない方はそのまま利用するのも手であります。
もっとも、マイナ保険証を利用するには2つ程注意点があります。
1点目は、マイナ保険証での受付が出来ない場合があるということで政府をそれに対する対応策を示しています。要はマイナ保険証だけでなく「資格情報のお知らせ」を持った方がよいということで、マイナ保険証だけでは窓口でトラブルとなる可能性がある。
2点目は、マイナンバーカード(電子証明書)の有効期限を意識しなければならないことで、5年目(5回目の誕生日)で電子証明書の更新があり、10年目(10回目の誕生日)でマイナンバーカードの更新があります。更新を忘れるとマイナ保険証が使えなくなる。『その場合どうなるか?』ということがあるが、最終的には資格確認証が送られてくることになるが、それなら資格確認証でよいということになる。
もちろん、今後システムの完成度が上がり、マイナンバーカードの更新が習慣化すればマイナ保険証で受診するのが当たり前となるかと思われるが、時間はかかるかと思われる。


マイナ保険証の利用登録解除とそのデメリット


 利用登録解除を行うには、保険者(保険証に記載がある)に連絡することになる。保険者の名称からWEBで検索を行ってホームページから『利用登録解除』の方法を調べることになる。国民健康保険・後期高齢者医療保険は市町村に問い合わせることになる。サラリーマン等のいわゆる厚生年金加入者は健康保険組合と呼ばれる団体に問い合わせることになる。
サラリーマンの方が利用登録解除を行い、資格確認証を取得しようとすると、場合によっては資格確認証が会社に送られてくるかもしれない。多くの中小企業が入っている全国健康保険協会(いわゆる協会けんぽ)の東京支部の場合は、会社に送られてきた。また全国健康保険協会は会社に対して従業員に『マイナ保険証を使うように』と通知を行っており会社員の方にとってはプレッシャーとなるかもしれない。その他、確定申告時に医療費控除を受ける際に領収書を集めておかなければならないとか一定の不便さがある(このあたりは従来どおりと言えば従来どおりである)ので今一度、マイナ保険証のメリットを再確認して、メリットが失われた場合に本当に困らないかどうか、念の為、確認する必要があるでしょう。


2025-08-03 | コメント:0件

PHPのバージョンアップの激しさに閉口する


Wordpressのお知らせで、わざわざPHPのサポート終了について知らせてくれるのだが、Rocky Linux9(要はRHEL9)の場合、PHP 8.0系でも2032年までサポートするらしい。というこで気にはなるが今のところは放置でよい。
もっとも、過去にWordpressがPHP5系のサポートを止めて7系に強制アップデートしたときがありその場合(Centos5か7)の時はPHPのバージョンを気にしないとダメだったので面倒だった。
プログラミング言語のサポート期間が4年とか5年というのは、短すぎると思うのだが、如何でしょうか?

2025-07-14 | コメント:0件

「エンジニアってなんか性格悪い人多くね?」で与太話

Youtubeネタです。


エンジニアってなんか性格悪い人多くね? という記事をみまして、エンジニアとして正論を言うときの注意事項、そもそも営業に仕様を任せることについて、さらに新人教育について与太話します。


2025-03-31 | コメント:0件

RYZEN

2020年もすっかり明けて2月になりましたが、年明けに10年ぶりにPCを更新しました。
ちょうど10年ほど前に、購入するPCの世代を統一しようと初代Core i7でソケット1366に決めたのですが、そこからCore i7-980Xを3つ程とi7-920を入手し4台のPCがあるわけですが、その後継ということでZEN2世代のRYZENに決めました。
Core i7を買ったときはちょうどWindows7に乗り換えた時でそこから8,10ときて、ここ2,3年は自分のPCがもっさりしていてグラフィックカードを変えたりしていましたがやっとこさ全とっかえができました。

今回はインテルからAMDに乗り換えたのですが、長いPC歴でちょこちょこAMDを使っています。今までメインマシンで使ったCPUを思い出すだけ書き出すと、こんな感じになります。

1984 (不明)ポケコンPB110
1985 uPD780(Z-80相当品) NEC
1989 80286相当品 AMD
1989 V30 NEC
1992 i486SX(J) Intel
1994 Am486 SX2-66 AMD
1996 Pentium 133 Intel
1997 MMX Pentium 166 Intel
1998 K6 AMD
1998 K6-2 AMD
1998 M2 Cyrix
1999 K6-III AMD
2000 Pentium III 600 Intel
2000 Pentium III 1000 Intel
2002 Celeron 1.4(PentiumIII系) Intel
2003 Celeron 2.3(Northwood-128K) Intel
2003 Pentium4(Northwood) Intel
2004 Athlon 64 3000+ AMD
2006 Pentium D 805 Intel
2006 Core 2 DUO E6400 Intel
2008 Xeon X3350(Core 2 Quad) Intel
2009 Core i7 - 920 Intel
2010 Core i7 - 980X Intel
2020 RYZEN9 3950X AMD

年号は大体ということで割といい加減です。その時の懐事情と趣味とその他諸事情で買い集めたり絞ったりしていましたが、こうしてみると2010年代のスキップぶりが半端ないですね。Core i7についてはSandy Bridge世代でそろえればよかったと少し後悔して、AMDからZenマイクロアーキテクチャが出る噂を聞きつけたときに様子見をしてZen2になったところで「行こう!」となった感じです。

話は戻って、初めての16ビット、32ビット、64ビットCPUは、AMDになります。初めての16ビットパソコンはPC-9801RXでしばらくはIntelを使っていると思っていたのですがあるときに中を開けてみたらAMDのCPUでした。よくよくカタログをみたら80286相当品と書かれていてものすごくがっかりした記憶があります。初めての32ビットCPUは、i486SX(J)と思いきや、このCPUは外部バス16ビットで、それを初めて知った時のがっかり感は半端なかったです。そのあとに買ったパソコンが今はなきコンパックのPresario CDS 524でこちらもメモリの増設で筐体を開けた時にみたらAMDでまたもやがっかりした記憶があります。その後、懐事情が改善し自作に移行して狂ったように買いましたが、初めてのDual-processor, Dual-core, Quad-core, Hexa-core はIntelになります。
RYZEN9は、初めての16-core(書き方を探すのが面倒)、PCI-E Ver4.0(Ver3.0はスキップ)、DDR4-RAM、UEFIです。利用面からは、初めてのCPUプロファイラ(AMDuProf)を使うプロセッサになります。CPUはキャッシュミスとか分岐予測ミスとかが発生すると内部のカウンタで記録をとるのですが、それを読み出すソフトウェアがCPUプロファイラということになります。有名どころではIntelのVTuneがあるのですがこのソフトがめっぽう高くCPUと合わせての購入となると個人では手が出しにくいです。AMDの方はなんと無料ということでまぁAMDということになりました。
そんなものを何に使うのか?と言われそうですが、もちろんADPのインタプリタ部分で、当初はVisualStudio付属のプロファイラを使って最適化を行っていましたが、いろいろ私に合わず、『V-Tuneかー』と思っていたところへ、CodeXL(AMDuProfの前身)の存在を知り、CodeXLに乗り換えたのが5年ほど前になります。CPUがIntelの場合、プロファイラは命令毎にかかった時間が分かるのですが具体的な原因(キャッシュミスなのか?ブランチペナルティか?とか)までは分からずそのあたりは手探りになっておったのがこれでばっちりと分かるようになります。早速プロファイルをしてみると、



パットと見てよくわからない指標があるのでカウンタの意味についてはお勉強が必要なようです。例えばハイライト部分はただの代入になるのですが、それでなぜRet branchとかが関係するのか?(おそらく他のブランチとの関係で結果的に実行された/なかったとか言いたいのかもしれないのですが・・・)とか直接的でないところがあります。

ここにきて、ADPの実行ファイルサイズは約1MBになりますが、今まではプログラムやデータのメモリへの配置はコンパイラに任せていましたがそろそろそういったところまでも手を出す必要があるのかなと思っています。といっても具体的にどうするのか?という話ですが、先ずCPUプロファイラを使いながら基礎データを集めてその上でソースコードを再編集したり、インタプリタ本体を抜き出してミニマムなプログラムを作ってプロファイルをかけたりいろいろ実験ができそうです。

ちなみにこういった話をすると『じゃアセンブラで組めや!』と言われかねないのですが、まぁうざい煽りに真面目に答えると、要は今のプログラムはCPUの潜在能力を十分に生かし切れていないので工夫の余地があり、上手くいけば数倍早いプログラムが作れるということになり、2020年現在ではシングルスレッド性能で数倍といえば時間軸に置き換えると10年以上先に行けるという話になります。

どういうことかと言いますと、例えば1989年に出たi486DX(33MHz)と2000年に出たPentiumIII(1GHz)の性能比は、単純にクロック周波数で見ても30倍(実際はそれ以上)になります。次いで2010年に出たCore i7-980X(3.33GHz、ブースト3.6GHz)とPentiumIII(1GHz)との性能比は、クロック周波数でみて約3.3-3.6倍と伸び率が10分の1程度に減速しています。そして今回のRYZEN9 3950X(3.5GHZブースト4.7GHZ)とCorei7-980Xはクロック周波数ではブースト時で比較して1.3倍、実際に手元にあるADPのプログラムを動かしてみると整数演算で2倍となっています。つまり、それまでは最新のCPUと言えば以前のCPUより格段に速くなって10年も経てば桁違いの速さを見せたのですが2000年代の中盤頃からそのスピードが止まり、今では10年で2倍のパフォーマンスアップに留まることになります。
つまり今まではプアなプログラムを組んでも時間が経てば解決してくれるのですが、これからはきちんと考えて作らないとダメということになります。

CPUプロファイルの話はこの辺にしておいて、今回もう一つ試したいことがあるのが、仮想マシンの活用で今回、私が使う必要のあるプログラムの一部(eTaxとか弥生会計とか)を仮想マシンの方へ移しました。今までは再セットアップとなるとこれらのソフトを再インストールしなければならなくなり面倒なだけなのですが、それが不要となり気軽に再セットアップができるようになるので便利です。欠点としてはOSやらその他のライセンスがインストールするマシンの台数分必要になることと、RYZEN9 3950X特有かもしれませんがCPUプロファイルとの共存ができない(切替にUEFIレベルで設定変更が必要になる)ことでCPUプロファイルを取りたいときはいちいちマシンを再起動することになります。

2020-02-02 | コメント:2件
Previous Page | Next Page