私はthis postを読んで、ジュリアではループがより速いことに気付きました。したがって、私はベクトル化されたコードをループに変更することに決めました。しかし、私はループ内でいくつかのif文を使用しなければならなかったが、if文を追加するとループが遅くなった。私のループは遅いです。それはif文のためですか?
function devectorized()
a = [1.0, 1.0]
b = [2.0, 2.0]
x = [NaN, NaN]
for i in 1:1000000
for index in 1:2
x[index] = a[index] + b[index]
end
end
return
end
function time(N)
timings = Array(Float64, N)
# Force compilation
devectorized()
for itr in 1:N
timings[itr] = @elapsed devectorized()
end
return timings
end
文が速度をテストする場合、私は、数を追加しました::
function devectorized2()
a = [1.0, 1.0]
b = [2.0, 2.0]
x = [NaN, NaN]
for i in 1:1000000
for index in 1:2
####repeat this 6 times
if index * i < 20
x[index] = a[index] - b[index]
else
x[index] = a[index] + b[index]
end
####
end
end
return
end
私はこのブロックを6回繰り返した:
は、この私が直接ポストからコピー抜粋、考えてみましょう
if index * i < 20
x[index] = a[index] - b[index]
else
x[index] = a[index] + b[index]
end
簡潔にするために、サンプルコードでこのブロックを繰り返しません。 if文を6回繰り返した後、devectorized2()
は3倍の時間がかかりました。
私は2つの質問があります。
- がif文を実装するためのより良い方法はありますか?
- if文が遅いのはなぜですか?私はJuliaがCと一致する方法でループを実行しようとしていることを知っています。JuliaはJuliaとCの間のより良い "翻訳"を提供しています。
ループの内側部分を6回繰り返したところ、6倍でなく3倍の速度しか落としませんでしたか?それは私にはうってつけです...あなたが正しく読めば、仕事の量は約6倍になるはずです。これはおそらく、分岐予測のために6x未満です。 –
どうすればいいですか? – tryingtosolve
加算回数を6倍にすると、演算回数の6倍を必要とするため、加算回数が6倍になります。あなたはそれについて何もできません。それはどんな言語でも真実です。それをCまたはFortranで試してみてください。 –