Julia言語の@inboundsによる配列計算高速化
インデックスが配列サイズの範囲内かどうかを毎回チェックするのがbounds checkであるが,いきなりこう言われても実感できない方が多いと思うので,例を出そう.
julia> A=[10,20,30]
3-element Vector{Int64}:
10
20
30
julia> for idx in (0,4)
println("A[$idx] = ", A[idx])
end
ERROR: BoundsError: attempt to access 3-element Vector{Int64} at index [0]
Stacktrace:
[1] throw_boundserror(A::Vector{Int64}, I::Tuple{Int64})
@ Base ./essentials.jl:14
[2] getindex(A::Vector{Int64}, i::Int64)
@ Base ./essentials.jl:916
[3] top-level scope
@ ./REPL[2]:2
julia> for idx in (1,4)
println("A[$idx] = ", A[idx])
end
A[1] = 10
ERROR: BoundsError: attempt to access 3-element Vector{Int64} at index [4]
Stacktrace:
[1] throw_boundserror(A::Vector{Int64}, I::Tuple{Int64})
@ Base ./essentials.jl:14
[2] getindex(A::Vector{Int64}, i::Int64)
@ Base ./essentials.jl:916
[3] top-level scope
@ ./REPL[3]:2
というわけで,Juliaは1始まり(one base)のインデックスをとるため,0番目の要素にアクセスしようとするとエラーがでる(えらい!).
しかし,これは配列にアクセスするたびに行われる(二つ目のコードブロック参照).パフォーマンスを上げたい時にはこのbounds checkを無視して欲しい.
そこで使われるのが@inboundsである.
注意するのは未定義の配列要素にアクセスしないと保証できる場面でのみ使用することだ.
もし,未定義要素にアクセスしようとすると,何かしらの数が返ってきたり,Juliaのセッション自体が落ちたりするらしい(らしいなので,悪しからず...自分の環境ではやってない).
配列アクセスの頻度が高い処理においては,@inboundsを付与することで高速化が可能である.ベンチマークテストによりその効果を示そうと思う.
using BenchmarkTools
using DataFrames
using CSV
using Random
@inline function sum_arrays(y)
s = 0.0
@inbounds @simd for i in eachindex(y)
s += y[i]
end
return s
end
function sum_arrays_bounds(y)
s = 0.0
for i in eachindex(y)
s += y[i]
end
return s
end
function benchmark_sum_arrays()
y = rand(1_000_000)
@btime sum_arrays($y)
end
function main()
Ns = [10, 100, 1_000, 10_000, 100_000, 1_000_000]
results = DataFrame(N = Int[], time = Float64[])
Random.seed!(0)
for N in Ns
y = rand(N)
b = @benchmark sum_arrays($y)
push!(results, (N, minimum(b.times)))
end
df = DataFrame(results)
CSV.write("benchmark_results.csv", df)
println("Benchmark results saved to benchmark_results.csv")
end
main()
を行なった.単純に配列の全ての数を足し合わせるという処理を行うsum_array関数を用いて行なった.
結果は次のようになり,配列数が大きくなるほどその効果が実感できる.

おわり.
@simdはこの検証において寄与しないことに注意!!
カレールー
今週のお題「カレー」
カレーは美味しい。
この事実はコカ・コーラのパッケージは赤いってぐらいに自明であり、今日の日本に住んでいるものであらば概ね同意してくれるだろう。
家でカレーを作るときにルーをどうするのか悩む。何を使おう。
ある人は「男はカレーをスパイスから作り始める」とのたまっているが私としては楽して美味しいものを食べたいので普通の市販のカレールーを買う。
よく、ハウスの固形カレールーを買っていたのだが、先日大変な事件が起きた。
無印良品のカレールーがとてもおいしいことに...気づいてしまった。
うますぎた。
買ったのは「辛くないりんごと炒め玉ねぎのカレールー」であったのだが、いわゆる「甘い」カレーではない。その名の通り「辛くない」カレーである。辛くないが、カレーのスパイスの美味しさが際立っている。そこに、具材である人参、玉ねぎの本来の甘さが引き出されてとてもおいしい。
フレーク系のカレールーのいいところは一人暮らしにも優しいことである。その心として、固形だと全部使わなきゃみたいな焦燥感に駆られるのであるが、フレークであれば量の調節は容易である。
つまりは無印良品のカレールーは、うみゃーかつけーざい的なのである。とても。
これは鬼りぴしますわね。
Pocketがサービス終了してしまうので、代替のサービスを探しに、我々はアマゾンの奥地へと向かった...
先週あたりにPocketがサービス終了する旨のニュースが飛び込んできた。突然のPocketとの別れに、記事を見たときには喪失感から素で声を漏らしていた。
「まじか。」
使いやすいウェブクリッパーだっただけに、サービス終了が悔やまれる。
というわけで、移行先が無いかアマゾンの奥地へと向かいました。
移行先候補
なんか、良さげな記事があったので、これを参考にしようかな。
ここの記事で代替のアプリとしてNotionとEvernoteが挙げられているが、これらは論外である。これらはメモアプリであり、後で読みたい記事を保存する闇鍋ではない。できれば1アプリ1機能であることが望ましい。そして無料がいい(傲慢)。
そうなると、instapaperか、Chromeのリーディングリストぐらいしか、選択肢がなくなってしまったぞ。
パワースポット
川上 本当に虐げられていて、伊勢神宮のパワーが本当に必要なひとは伊勢神宮に行くって発想すら持てないわけですよ。伊勢神宮に行くひとは、もう十分パワーを持っているのに、もっともっとっていうその姿勢が⋯⋯。
川上未映子さんのこの視点は確かに!となった。ここまでズバズバ言うのは面白くて笑ってしまった。おまえらピンピンしているのにパワースポット行く欲マシマシだなっていう感覚は少しわかる。本当に必要な人はそんな発想持てないのもそうだ。そこまで信心深い人は今の日本にはほぼいないかもしれない。
その視点は面白いなと思いつつ...パワー持っている人が利益を貪っている感じは正直しないw
パワースポットを巡ることが目的となって活発になっているのかもしれないし...
そんな自分は伊勢神宮は行ったことがある。ちっちゃいときだから、あんまり覚えていないが印象的な思い出が1つ。
怒られそうなんだけど、その時に食べた伊勢うどんがあんまり美味しいと思えなかったんだよね。はなまるうどんの方がおいしいなぁと思いながら食べた覚えがある。子どもだったからお口に合わなかったのか。もう一回リベンジしたいと思う。
