julia --track-allocation=user
のメモリ割当レポートで割り当ての最大値がこの関数である:ジュリア、関数内のループでメモリ割り当てが行われるのはなぜですか?
- function fuzzy_dot_square(v::Array{Int64, 1})
- dot_prod = zero(Int64)
7063056168 for i::Int64 in 2:28
0 dot_prod += v[i]*(v[i] + v[i-1] + v[i+1] + v[i+28])#/4 # no "top" pixel
- end
0 for i in 29:(28*27) # compiler should literate 28*27
0 dot_prod += v[i]*(v[i] + v[i-1] + v[i+1] + v[i-28] + v[i+28])#/5 # all pixels
- end
0 for i in (28*27):(28*28 - 1)
0 dot_prod += v[i]*(v[i] + v[i-1] + v[i+1] + v[i-28])#/4 # no "bottom" pixel
- end
-
0 return dot_prod
- end
- それは28ピクセル画像28を表す、ベクトルの「ファジードット積」正方形であり(既知MNIST数字画像のデータセット)。
なぜ割り当てはそこで行われますか? 私が理解する限り、dot_prod
は割り当てられる唯一のものです。 しかし...
ための最初のレポートポイントはまた、私はとREPLでそれを再現しようとした:
v = Array{Int64,1}(1:100)
dot_prod = zero(Int64)
@allocated for i in 2:28
dot_prod += v[i]
end
- と私は@allocated for ...
でエラーを以下の取得:
ERROR: UndefVarError: dot_prod not defined
in macro expansion at ./REPL[3]:2 [inlined]
in (::##1#f#1)() at ./util.jl:256
@time
マクロが正常に動作するので、おそらく@allocated
にいくつかのバグがありますか?私はjulia 0.5.0
です。
'@ allocated'はその引数を関数内にラップします。したがって、' dot_prod + = v [i] 'はforループのローカル変数です。どのような場合でも、グローバル変数に依存しているので、望む結果を得ることはまずありません。 –