黒木玄 Gen Kuroki
- いいね数 389,756/311,170
- フォロー 995 フォロワー 14,556 ツイート 293,980
- 現在地 (^-^)/
- Web https://genkuroki.github.io/documents/
- 自己紹介 私については https://twilog.org/genkuroki と https://genkuroki.github.io と https://github.com/genkuroki と https://github.com/genkuroki/public を見て下さい。
2021年08月08日(日)
気象大学校は気象学を志す学生さんには本当オススメの大学です。気大は気象庁の研修機関でもあるので入学すると職員(国家公務員)になり、学生でも給料をもらえます。4学年全体で学生数60名なので、教官と気象学をはじめとする地球科学を深く学べます。#情熱大陸 #天気の図鑑 www.mc-jma.go.jp/mcjma/ pic.twitter.com/HDmcFnRPUF
posted at 23:16:33
#超算数
これ、ツイート見ると理解力自体はありそう。おかしな教え方(式の意味、とか)をされて、変な拘りがついてしまったのかも。 twitter.com/niehidoom/stat...
タグ: 超算数
posted at 22:28:02
#Julia言語 MITでの並列化に関する講義
github.com/mitmath/18337#...
Styles of Parallelism
github.com/mitmath/18337#...
GPU Computing
タグ: Julia言語
posted at 21:27:12
8月8日は、台湾の父の日✨今日にピッタリな「8」詰碁をどうぞ🎁✨
#張栩 #詰碁 #父親節快樂 pic.twitter.com/9CjAlUpk9G
posted at 20:38:07
Dr.ナイフなる人物のツイートが時々RTされてきて、そのあまりの見識のなさにいつも呆れているのだけど、彼または彼女を「論座」が起用したというのは、担当編集者もまた同様に呆れるほど見識がないということでしょう。担当編集者が誰なのか知りたい。
肯定的にRTすると馬鹿だと思われるよ
タグ:
posted at 20:21:13
そして、問題を解くメソッドを
function solve(prob::Problem, alg::SomeAlg)
~
end
と書いて、
prob = Problem(~)
alg = SomeAlg(prob, ~)
sol = solve(prob, alg)
と実行する(たとえばREPLもしくはその拡張版などで)。
タグ:
posted at 20:19:21
例えば、あるアルゴリズムSomeAlgでは、問題probのサイズに合わせて前もって作業領域tmpを配列などで用意しておいて、その作業領域を使って計算する。この場合には
struct SomeAlg{~, T}
~
tmp::T
end
function SomeAlg(prob::Problem, param)
~tmp作成~
SomeAlg(~, tmp)
end
タグ:
posted at 20:15:35
#Julia言語
質点の真上への投げ上げ
github.com/genkuroki/publ...
2次元Ising模型
github.com/genkuroki/publ...
ではアルゴリズムを記述する型のオブジェクトの値が、問題に依存しなくなっていますが、依存する場合には、問題からそのアルゴリズムで使うデータを作るコンストラクタを書けばよい。
タグ: Julia言語
posted at 20:10:03
#Julia言語 このProblem-Algorithm-Solverパターンで設計された基本パッケージは沢山あって、例えば、
github.com/SciML/Differen...
DifferentialEquations.jl (これがすごい!)
github.com/JuliaNLSolvers...
Optim.jl
などがあります。
github.com/genkuroki/publ...
タグ: Julia言語
posted at 19:59:39
添付画像のような、問題Board、アルゴリズムSingleThread, MultiThread、問題を解く函数update!の三点セットでコードを整理する方法については
github.com/genkuroki/publ...
が詳しいです。例が中高生レベル(質点の真上への投げ上げ)。
github.com/genkuroki/publ... twitter.com/genkuroki/stat... pic.twitter.com/SnSr1vZdKt
タグ:
posted at 19:54:18
さらに、通常のコマンドラインの代わりにJuliaで使われるのは、REPLもしくはその拡張版なので、コマンドラインでの実行の単位である「main函数」を書くという発想を捨てて、REPLで実行される単位である函数を書くという発想になります。
実行したい内容を意味する名前の函数を書くだけでよい。
タグ:
posted at 19:48:46
#Julia言語 このコードはJulia界でよく見られる典型的なパターンになっています。
解くべき問題を記述するパラメータを格納する型 Board
アルゴリズムの型 SingleThread, MultiThread
問題を解く函数 update!(board::Board, niters, alg)
docs.julialang.org/en/v1/base/io-... pic.twitter.com/Uj7c0z23L8
タグ: Julia言語
posted at 19:37:15
P(i, m), Q(j, n)は周期境界条件にするための補助函数。
update!(board, niters[, alg]) は盤面 board 全体を niters 回更新する函数で、3つのメソッド(計算法)が定義されています。
* シングルスレッド
* マルチスレッド
* デフォルト pic.twitter.com/BUsXMfQ0vi
タグ:
posted at 19:33:27
#Julia言語 画像によるプロットではなく、テキストによる表示のデフォルト設定を定義するには、Base. show(io::IO, x::MyType) メソッドを定義してやります。
docs.julialang.org/en/v1/base/io-...
タグ: Julia言語
posted at 19:29:19
#Julia言語 using Plotsでプロット用のパッケージを読み込んで、@ recipeマクロで、イジング模型の盤面のデフォルトでのプロットの仕方を定義。
@ recipeは函数定義の式をプロットの仕方の定義を与えるコードに変換してくれるマクロです。
docs.juliaplots.org/latest/recipes/
github.com/genkuroki/publ... pic.twitter.com/XJc6faczHp
タグ: Julia言語
posted at 19:29:18
#Julia言語 Isingモジュールのコード解説続き
Boardは2次元イジングの「盤面」の型で以下を期待:
* state = ±1を成分とする2次元配列
* β = 逆温度
* ±1を反転する確率達を並べたもの
randboardは初期stateがランダムな盤面のコンストラクタ。
続く
github.com/genkuroki/publ... pic.twitter.com/ZeGTZrmeDT
タグ: Julia言語
posted at 19:29:17
#超算数
二重数直線への批判。
同様のことは、田の字表などにも言える。
じゃあ、どうするか?シンプルに考えればいいだけ。 twitter.com/michikusa_heya...
タグ: 超算数
posted at 18:41:42
特にPythonから来た人達は @ code_warntype の使い方を覚えた方が無難だと思います。
Juliaでは引数の型を書く必要はないが、具体的に与えられた引数の型の伝搬の仕方は非常に重要。
docs.julialang.org/en/v1/manual/p…
Performance Tips
に目を通しておくと時間の無駄を防げます。
タグ:
posted at 18:25:26
OokuboTact 大久保中二病中年 @OokuboTact
「和田義信著作・講演集」は絶版だけど、算数教育の専門家達への影響力がかなりある。
大学院の授業で使われているからだろうか pic.twitter.com/G7uKk53Qm2
タグ:
posted at 18:20:24
struct Foo
A::Matrix{Float64}
x::Float64
end
ではなく、フィールドの型をJuliaに自動的に判別させる
struct Foo{S, T}
A::S
x::T
end
という書き方をしておけば、Matrix{Float64}, Float64以外のフィールドの型でFoo型を予想できなかった形で使用可能になる余地が残ります。
タグ:
posted at 18:07:25
#Julia言語 面倒で失敗する確率が高いので函数の引数の型を書かない場合でも書いた場合でも、@ code_warntype で具体的な引数の型がどのように伝搬するようなコードを自分が書いたかを確認した方がよいことが多いです。
「引数の型がどのように伝搬するか」が超大事。
docs.julialang.org/en/v1/manual/p...
タグ: Julia言語
posted at 18:00:49
これ、12a÷(-6a²b)×2bと負符号の割り算があるおかげでカッコがあるのが幸いしている。もし6a²bで割るとかだったらきっとカッコがなくて、併置積は計算の結果であり一つの数とみなすが炸裂しているはず。#超算数 twitter.com/LimgTW/status/...
タグ: 超算数
posted at 17:59:47
#Julia言語 のdiscourse discourse.julialang.org でも、引数の型をどうしても書きたい人やさらに戻り値の型までどうしても書きたい人が現れて、「それ、やめた方がいいよ」とみんなに言われているシーンを定期的に見ます。
多分「静的型付けで安全!」などとどこかで過学習してしまっている。
タグ: Julia言語
posted at 17:51:58
#Julia言語 のジェネリック函数が予想外の場合にも使えることはよくあるのですが、自分が使用する範囲内に引数の型を制限していると、Juliaにそのような恩恵があることに永久に気付かずに終わってしまいます。
函数の戻り値の型は普通書きません。
github.com/JuliaLang/juli... pic.twitter.com/QFQxm3G6uU
タグ: Julia言語
posted at 17:48:51
#Julia言語 開発版のドキュメントにも添付画像のように、引数の型を過剰に制限することがよくある間違いであることと、疑わしい場合には引数の型を書かない方が良いことが太字で強調されています。
github.com/JuliaLang/juli... pic.twitter.com/OBSTAQd3b7
タグ: Julia言語
posted at 17:45:27
ところで研究者が亡くなって架蔵本の処理に困るというのは全国至る所で生じている。大学図書館はどこももうコレクションを引き取ってくれない。古書店に売るのも手だが、コレクションとしての価値がある。で、早稲田は引き取ってPDFにして文庫化するようですね。これには驚きました。
タグ:
posted at 17:23:57
#Julia言語
Vector{T}, Matrix{T} はそれぞれ Array{T, 1}, Array{T, 2} のエイリアスです。
注意:ベクトルと行列と配列の型は、Vector, Matrix, Array以外にも、無数にあるので、例えば行列を引数とする函数を
function f(A::Matrix) ~ end
のように書かないで下さい。 twitter.com/sugimochi_1019... pic.twitter.com/RqR5BQZ1Qt
タグ: Julia言語
posted at 17:23:02
道草学習の部屋@オンライン家庭教師&教育 @michikusa_heya
「二重数直線」に対する批判動画、YouTubeに投稿しました。20分を少し超えて少し長くなってしまいました。1.5倍速ぐらいで視聴されるのがちょうどいいと思います。
www.youtube.com/watch?v=M1NeZL...
タグ:
posted at 17:21:07
About the Joukowski complex transformation w = z + 1/z
Excellent pedagogy
bit.ly/30vTcku (AT&T Archives)
#math #science #iteachmath #mtbos #visualization #elearning #physics pic.twitter.com/Qac1LgQ869
タグ: elearning iteachmath math mtbos physics science visualization
posted at 15:01:31
@hgn_no_otaku 「何を考えて式を書いたか知りたい」と「この式を書いていたらこう考えた事にする」をごちゃ混ぜにする算数教育界wの悪習の体現ですよね。
タグ:
posted at 13:36:41
スクリプト言語でありながらPythonの数十倍速いJuliaを使うための準備の手順をまとめました!
今後も勉強しながらJuliaの記事を発信予定です。
#Julia
#JupyterLab
#ブログ初心者
cae-memo.com/julia-environm...
タグ: Julia JupyterLab ブログ初心者
posted at 12:30:00
訂正
「図5の分割は周期境界条件では使えない」と書いたが、解釈による。
図5での赤の領域の個数が周期境界条件で1つ減ることにすれば、図5の分割を周期境界条件での並列化で使える。 pic.twitter.com/mIkCsUzTEP
タグ:
posted at 11:57:03
図5の分割は周期境界条件では使えない。
右下の図の領域1と領域2の格子点は直接線で繋がっていないので、相互作用しておらず、領域1内と領域2内の計算は別々に独立に可能。
ここまで理解すれば3次元以上の場合も同様。 pic.twitter.com/w5J3F7RxVV
タグ:
posted at 11:52:48
#Julia言語 上では図1のような2次元正方格子上のIsing模型を扱いました。直接線で繋がった格子点どうしのみが相互作用している(実際には周期境界条件でやっている)。
上で使った並列化は図2の分割に対応。赤の部分と青の部分でそれぞれ並列化している。
他にも図3,4,5のような分割でも並列化可能。 pic.twitter.com/kSdfVc0BTa
タグ: Julia言語
posted at 11:49:59
プログラミング言語とは無関係に並列化やGPU化そのものに結構難しい所があります。
すべてが完全に独立に実行できる場合(例:マンデルブロ集合)は超絶簡単ですが、相互作用があるような系では色々考えなければいけないことが増える。
タグ:
posted at 10:34:43
誰かが頑張って結合法則の一般化の考え方で並列化を楽に行えるようにしてくれるフレームワークのパッケージがあると便利かもしれません。
GPUでの計算の本質も並列化。
タグ:
posted at 10:31:00
勉強不足で並列計算の教科書の類を何1つ見たことがないのですが、並列化の基本が結合法則の一般化であることは、Juliaでの並列計算でちょっと遊んでみればすぐに気付きます。
タグ:
posted at 10:29:00
結合法則を1次元の場合とみなして、それを2次元化すれば、2次元正方格子上のIsing模型などの並列化の仕方も得られるわけです。
互いに相互作用がない部分集合達A_{i_1}, A_{i_2}, …のそれぞれの上での計算は独立に実行可能なので並列化できる。そのような並列化された実行を繰り返して全体を更新。
タグ:
posted at 10:26:30
並列化の基本は、代数学における結合法則およびその(多次元への)一般化です。
結合法則を使えば、abcdefghをab, cd, ef, ghに分割して並列に計算し、(ab)(cd), (ef)(gh)を並列で計算し、((ab)(cd))((ef)(gh))を計算するという3ステップで計算できます。ab, (ab)c, ((ab)c)d, ...と計算しなくてよい。
タグ:
posted at 10:22:35
#Julia言語 マルチスレッド版
もしもマルチスレッド化で「物理」を変えてしまうバグを混入させていたらごめんなさい。結構やりがち。
github.com/genkuroki/publ... pic.twitter.com/9ZSKybqiYt
タグ: Julia言語
posted at 10:14:45
#Julia言語 これはシングルスレッド版で作った動画
200×200の盤面全体を更新するごとにフレームを作成しています。全部で400フレームの動画。fpsは20です。逆温度は理論的な臨界値。
github.com/genkuroki/publ... pic.twitter.com/DwEhRS4DEM
タグ: Julia言語
posted at 10:14:39
そういう手抜きになってしまった理由は、必要最小限のコードの変更で並列化したからです。もうちょっとコードを書けば効率を上げられるはずです。
しかし、そういう手抜きのコードであっても12スレッドで6~9倍速くなった。スレッド生成は気にしすぎるほど重くないということなのでしょう。
タグ:
posted at 10:08:53
一般には、格子を部分集合A_i達に分割して、互いに独立に実行できる A_{i_1}, A_{i_2}, ... 達の上での更新を並列化することを繰り返して、格子全体上での更新を実現すればよいです。
この一般化を理解していれば、上の方法はひどい手抜きでスレッドを無駄に多く生成していることも分かります。
タグ:
posted at 10:08:53
同様に、
{1,2,…,m} × {j} (j = 2, 4, 6, …)
の各々の上での更新も違いに独立に実行の順序を気にせずにやって構わない。
これが、jが奇数と偶数の場合に分けて、それぞれを並列化した理由です。
タグ:
posted at 10:08:52
この方法での並列化のポイントは
互いに独立に実行の順番を気にせずにすむforループに
Threads.@ threadsマクロを作用させること
です。m×nの正方格子上のIsingモデルでは
{1,2,…,m} × {j} (j = 1, 3, 5, …)
の各々の上での更新は違いに独立に実行の順序を気にせずにやって構いません。続く
タグ:
posted at 10:08:51
#Julia言語 j0は1と2を動きます。それによって、格子のj座標の動く範囲は奇数と偶数に分割されます。
Threads.@ threads はその直後のforループをスレッド並列化されたコードに書き直してくれるマクロです。
これによって、j座標が奇数と偶数の場合が別々に並列化されています。続く pic.twitter.com/ih62qXMV0p
タグ: Julia言語
posted at 09:52:12
#Julia言語 添付画像は2次元正方格子上のIsing模型の盤面全体を更新する函数です。シングルスレッド版とマルチスレッド版の違いは赤線の部分しかありません。
これだけの変更でスレッド並列化が完了します。続く pic.twitter.com/9DD5QkEKLy
タグ: Julia言語
posted at 09:52:10
#Julia言語 ごめんなさい、まだそのgistを見てないです。
以前書いた2D Isingのコードの並列化を書こうとずっと思っていたのをついさっき書きました。
今回試した場合には、6コア12スレッドCPUでのマルチスレッド化で6~9倍程度速くなっています。解説に続く。
github.com/genkuroki/publ... twitter.com/yujitach/statu... pic.twitter.com/xwoNkDA9wc
タグ: Julia言語
posted at 09:42:19
An open-source license that starts out "free for non-commercial use", and opens up for commercial use as you're paid for the work
タグ:
posted at 04:48:18
コードを GPU 向けにコンパイルし直すんですね。文献は llvm.org/devmtg/2019-04... や arxiv.org/abs/1712.03112 のあたりのようです。
タグ:
posted at 00:33:03
書いて gist にあげました: gist.github.com/yujitach/c30d7... が、どうでしょう、GPU でなくても並列で高速化していただけるととても助かりますが、Julia 大好きな方に教えていただけますと有り難いです。
それは兎も角、CUDA.jl の仕組みはすごいですね、Julia が 内部で使っている LLVM を直接つかって
タグ:
posted at 00:33:03
Julia の良い所を数日前に聞いたら、@genkuroki さんにGPU で簡単にコードを走らせられると教えていただきました。今研究で spin chain Hamiltonian の数値対角化をしようとしていて、GPU で速くなるのならとても有り難いのですが。サンプルとして一次元 Ising 鎖のコードを Julia で twitter.com/genkuroki/stat...
タグ:
posted at 00:33:02