留学・音ゲー・研究備忘録

heine98の音ゲー・研究・留学の記録。Juliaとかlatexとか使います。

Julia 並列化

マルチスレッドとかなんもわかってないけど。コアが物理でスレッドが仮想(コア内に2こくらいある)でおk? とにかくとりあえずメモ。今後追加していく。現状、Julia v1.3である。 なお以下の内容は

Announcing composable multi-threaded parallelism in Julia

をかいつまんだもの。

スレッドの数を設定

Julia起動前にターミナルで

$ export JULIA_NUM_THREADS=n

を実行。ただしnは任意の整数。もちろんコンピューターが持ってるスレッド以上の数を指定しても以下では無視されるけど。

正しく設定できてるか確認

上記のセットが終わればJuliaを起動して、

Threads.nthreads() # いくつスレッドが使われてるか
Threads.threadid()  # 現在のスレッドのID

# またはタスク振り分けを画面に表示させてみる
Threads.@threads for i = 1:10
           println("i = $i on thread $(Threads.threadid())")
       end

テスト

並列化の恩恵について以下の関数で見てみる。関数自体は1次元配列vを受け取ったときに中身をソートするものだけど、vがある一定サイズの場合、並列化を行う。 最初に入れたvを半分に分割し、1~size(n)/2までの方を並列化、一定サイズになるまではそこに再帰的に関数を適用している。

import Base.Threads.@spawn

# sort the elements of `v` in place, from indices `lo` to `hi` inclusive
function psort!(v, lo::Int=1, hi::Int=length(v))
    if lo >= hi                       # 1 or 0 elements; nothing to do
        return v
    end
    if hi - lo < 100000               # below some cutoff, run in serial
        sort!(view(v, lo:hi), alg = MergeSort)
        return v
    end

    mid = (lo+hi)>>>1                 # find the midpoint

    half = @spawn psort!(v, lo, mid)  # task to sort the lower half; will run
    psort!(v, mid+1, hi)              # in parallel with the current call sorting
                                      # the upper half
    wait(half)                        # wait for the lower half to finish

    temp = v[lo:mid]                  # workspace for merging

    i, k, j = 1, lo, mid+1            # merge the two sorted sub-arrays
    @inbounds while k < j <= hi
        if v[j] < temp[i]
            v[k] = v[j]
            j += 1
        else
            v[k] = temp[i]
            i += 1
        end
        k += 1
    end
    @inbounds while k < j
        v[k] = temp[i]
        k += 1
        i += 1
    end

    return v
end

重要なのは

half = @spawn psort!(v, lo, mid)  # task to sort the lower half; will run
    psort!(v, mid+1, hi)              # in parallel with the current call sorting
                                      # the upper half
    wait(half)                        # wait for the lower half to finish

    temp = v[lo:mid]                  # workspace for merging

再帰的に関数を適用してるから、結果的には最初の2分割で上下ともに並列化されてるんだと思われる。

MacBool Pro 13 inch 2017、2.3 GHz デュアルコアIntel Core i5での結果は

julia> a = rand(20000000);

 b = copy(a); @time sort!(b, alg = MergeSort);   # single-threaded
  2.120218 seconds (111.87 k allocations: 82.144 MiB, 31.72% gc time)

julia> b = copy(a); @time sort!(b, alg = MergeSort);
  1.985665 seconds (11 allocations: 76.294 MiB)

julia> b = copy(a); @time psort!(b);    # four threads
  1.760655 seconds (332.00 k allocations: 702.748 MiB, 4.95% gc time)

julia> b = copy(a); @time psort!(b);
  1.101960 seconds (3.77 k allocations: 686.923 MiB, 4.72% gc time)

と早くなってるのがわかる。

とまあ、参照したサイトのはわかるけど、これをどうやって数値計算に落とし込むかが〜〜〜。

デバフ

ルカはUBで防御デバフあるからTP貯めるために星あげないほうがいい マコトもUBにあるけど柔らかすぎるので耐久上げるために星上げたほうがいいってことね。

次のプリフェスって年末かな。クリスが引きたい。そしていつジュンさんは来てくれるのか。

そういえばなんかゴリ押しでダンジョンExtremeの方行くほうが、育成整えるより早そう。。。まだ当分はかかるけど。

latex + VScode

メモし忘れてたから、念の為。

latexvs codeはhomebrewなりなんなりでインスコ済みとする。 vs codelatex workshopを使うとき、ちゃんとwaorkshop側にlatexビルドできるようにするために、まず最初にユーザーのホームディレクトリに(cdだけでいけるとこ?)に.latexmkrcファイルを作成する必要がある。 内容は現行のPCの中をコピペすればいいけど、参考としては以下のサイトを参照のこと。 qiita.com

ただしこれをやると、workshop側でビルド時にpdfがVS code内のタブで開く設定にしててもskimが勝手に開くので、手動でpdf用のタブを開く必要があるっぽい?しかもskimとtabで同じpdfを見てるアホな自体になると思うけど。

クリイベの時期重なりすぎ問題

ずっとFGOだけやってたんだけど、夏からプリコネ初めて最近は酒を飲むのもやめたのでバンドリも始めたが、イベントが重なりすぎてる。 そして迫りくるワークショップの発表、どないしろっちゅーねん。

プリコネ、経験値1.5倍なのと、自力でストーリー開放したいから頑張ってるんだけど、これはスタミナパックないと無理ですね(買った アメリカのカードで課金できるのを再度確認したので助かった。 クラバト前からの育成で育ててた分、21−14まで一気に進めた(18−9で詰まってたのは暗闇の敵に対処しないで脳筋前衛物理パでやろうとしてたからだった。 でもここからはまたR12とか120くらいまで育てないと行けないので5日に来るであろうノマドロ2倍で周回できるように今のうちにイベント走っておきます。そろそろVHの敵も2凸位できそうだけど面倒くさいからハードだけしかやってない。

FGO、19箱だけど開けたのは10まで。そして礼装全然落ちない。今日のストーリーで剣トルフォ使えたのだけど、バトルボイスがいいので欲しくなってしまった。でも我慢。

バンドリ、そろそろExtreme?赤の難易度で埋めていきたいけど、イベント多すぎなのとスタミナ消費してからじゃないと練習できないのが苦しい。あと練習するにもライフゼロで落ちるので、そう考えると最後まで演奏できる弐寺は良かったな。

マクロ経済学版Write Code Every Day

を考えたらどうなるかという適当な内容。今スライドまとめたくないから書いてます(研究室で隠れてプリコネ速報とか読むの楽しー

マクロ経済学と銘打って書くと、まずどこからやねんって感じになってしまう。というのも、それは最初に必要な数学チックなネタから入るのか(Numerical Recipesとか)、それは所与として経済学の問題を解くのか(部分均衡、一般均衡数値計算コード)。

最初の場合だと、n元方程式の解を求めるのに行列表記してどうやって逆行列を求めるかとか、多次元方程式の解を求めるときにどうするか(bisection、newton法など)とかだし

もっと実践的なのはやっぱり家計の最適化問題動的計画法とか、一般均衡を求めるとかだけど。でもこれって切のいい区切りに到達するまでクソ時間かかるのと、代表的家計モデルとかの一般均衡のfluctuationの問題だと良いパッケージがあって、関数だけ書けばあとはそれ使ったら終わりみたいなのもあるし。

まあ結局最初はQuant Econのレクチャーに従って自分で解いていくのが、言語習得だけじゃなくてコード書くという点ではいいのかもね

FGOクリスマス2019+11月クラバト

いやーやっとメンテも明けてイベントが無事に始まりましたね。アップルはクソ(Macから 今コード回してて暇なので書いてます。

アップルストアの遅延でFGO史上最長のメンテだったらしいですが、連続ログインの救済とかもあったしまあまだ許せる範囲だったのでは。僕はメンテ前にログインできてましたけど。

今年はナイチンゲールがサンタで配布、星5はセイバーのアストルフォ。どっちも好きな声優なので交換所が素敵です。

とりあえず朝少し出遅れて6時に目が覚めて参加でしたけど、家出るまでにボックスチケ礼装の交換と1枚泥が来たのでラッキーです。時差が辛い。

あとは何箱開けられるかですが。。。禁断の頁が足りないので、その分QP溢れても回りたい。あと羽根も。 ただどうしてもスカスカ+エドモンになってしまうので、また6積みしたとき面白い編成が組めたらいいですね。 (と思ったらすでに未凸6積みできる状況で、バニ上ギルにW孔明で行けました。まあ礼装の30%もしくはスキルのNPチャージが無駄になるけど、3Tで行けるならそれで良し)

クラバトは所属クランが11周目に入り、3段階目。完全に貢献できる気がしない。朝見たら11周目だったので、今日の夜くらいしか回るチャンスないけど。 ノマドロ2倍で結構R11のキャラ増やせたので良しとします。あとはコインでメモピ集められれば。。。いつになったらマコトを星5にできるのかな。 去年は年末無料10連があったみたいなので、そのあたりで女神の秘石集められたらいいのだけれど。そしてできればクリスを手に入れたい。

プレイヤーレベルも110になり(そろそろ111)、育成も少しづつ進んできたのでこれからガンガン進められたらいいな。たしか始めたのが夏に日本にいたときだから、4ヶ月目くらいなのだろうか。FGOのときのこと考えるとここから戦力補強するのが辛い感じがするけど、宝具重ねたり限定が多いわけではないので、あまり無駄な課金はせずに頑張りたいですね。

クラバト11月

とりあえず3体目かなんかでコンスタントに100(平均120〜130)、5体目のマルチタゲで200超えた。 もちろんサポート借りてだけど。

ただ、200超えたのは範囲攻撃固めたせいで、その後全然ダメージ出せなかった。手動で良ければ100出せるパーティー組んでいったけど、失敗して85くらい。。。

ところで気づいたけど、ノマ18−8がクリアできない。まあこのクラバトのために少しレベル上げたから今日試してみるけど。