黒木玄 Gen Kuroki is a user on mathtod.online. You can follow them or interact with them if you have an account anywhere in the fediverse. If you don't, you can sign up here.

mathtod.online/@tetu/409449

おお!tetuさん、素晴らしいです!

私の手元の環境(MSYS2 mingw64 g++)で同じコードを実行したら、pragma がばっちり効いて高速化されました。

pragma無しだと

time ./find_g++ で2.6秒台。

しかし、pragma有りで並列処理では

time ./findpi_g++pragma で0.4秒台。

これはJuliaの並列処理を使わない場合の速さと同じです。(並列処理を使うと0.12~0.14秒になる。)

Julia はどうしてこんなに速いのでしょうかね?

mathtod.online/media/mrzEdDpXh

黒木玄 Gen Kuroki @genkuroki

私のWindows環境での最高速をまとめておきます。円周率のモンテカルロの1億回ループにかかる時間です。

Python + numpy → 2.3秒台

mingw64 gcc + Mersenne Twister → 0.8秒台

mingw64 g++ + OpenMP (並列化) → 0.4秒台

Julia (非並列化) → 0.4秒台

Julia (並列化) → 0.12秒

· Web · 1 · 2

たぶん、Python + numpy のケースはもっと高速化できると思います。

私の現時点での知識と能力ではやり方が思い付かないのですが、原理的には Python の for ループを避けることと配列を避けることが同時にできれば確実に速くなるはず。

あと g++ の場合ですが、OpenMP のプラグマが効けば速くなり、0.4秒台が出ます。

しかし、プラグマをコメントアウトすると、2.6秒まで遅くなってしまうんですね。

これだとg++を使っているのに、Python + numpy よりも遅いです。

おそらく、こちらももっと高速化できるのだと思います。

mathtod.online/@waidotto/40984

y.さんのおかげで、gccでJuliaと同じ速さ、円周率モンテカルロをできるようになりました!

gcc で並列化を使わずに0.4秒台が出ました!

私が追試するときに使ったコードとコンパイルの仕方(Makefile)は次の場所にあります。

gist.github.com/genkuroki/67a5

findpi_dSFMT.c のコンパイルのためには
math.sci.hiroshima-u.ac.jp/~m-
から dSFMT-src-2.2.3 をダウンロードして展開しておく必要があります。

mathtod.online/media/-8HAEg24d