Julia for-loopsはベクトル化された操作と同じくらい速く、さらに高速に使用されると言われています(正しく使用されている場合)。 私は2つのコードを持っています。この考え方は、与えられた0-1シーケンスのサンプル統計を見つけることです。これはxです(これらの2つの例では、私は合計を見つけようとしていますが、もっと複雑な例があります。私のコードでの落とし穴の)。最初のようになります。ジュリア語。ベクトル化された操作をどのように克服するか?
S = 2 * sum(x) - n
s_obs_new = abs(S)/sqrt(2 * n)
pval = erfc(s_obs_new)
と第二は、「ナイーブ」と古典ものです:私は、最初の例の実行中の時間は約11.8ミリ秒であることがわかってきました@benchmarkを使用して
S = 0
for i in eachindex(x)
S += x[i]
end
S = 2 * S - n
s_obs_new = abs(S)/sqrt(2 * n)
pval = erfc(s_obs_new)
2回目は38msです。
この例は私にとって非常に重要です。なぜなら、ベクトル化が不可能な場所がたくさんあるからです。私は、ベクトル化のように速くベクトル化された「方法」で計算を行いたいと思います。
ベクトル化されたコードがベクター化されたコードよりも4倍遅くなる可能性があるという考えはありますか?最初の関数のコード型安定性は、OKである不要な大きなメモリ割り当てが存在しない等
ある:
function frequency_monobit_test1(x :: Array{Int8, 1}, n = 0)
# count 1 and 0 in sequence, we want the number
# of 1's and 0's to be approximately the same
# reccomendation n >= 100
# decision Rule(at 1% level): if pval < 0.01 -> non-random
if (n == 0)
n = length(x)
end
S = 2 * sum(x) - n
s_obs_new = abs(S)/sqrt(2 * n)
pval = erfc(s_obs_new)
return pval
秒である:
function frequency_monobit_test2(x :: Array{Int8, 1}, n = 0)
# count 1 and 0 in sequence, we want the number
# of 1's and 0's to be approximately the same
# reccomendation n >= 100
# decision Rule(at 1% level): if pval < 0.01 -> non-random
if (n == 0)
n = length(x)
end
S = 0
@inbounds for i in eachindex(x)
S += x[i]
end
S = 2 * S - n
s_obs_new = abs(S)/sqrt(2 * n)
pval = erfc(s_obs_new)
return pval
まず、公式の[パフォーマンスのヒント](https://docs.julialang.org/en/stable/manual/performance-tips/は)しようとする –
別のものを読むことが重要です '@inboundsを置くことです'for'ステートメントの前の@ simd' –
ベンチマークを取得するために実行する実際のコードを表示してください。 –