実験的な並列機能を有効にして、gnuapl 1.5 を実行しています。4 つのコアで次の 2 行を実行します。
a←b←⍳x←1000
a-⊂b ⍝この行は、計算に非常に時間がかかるようです。
x の値が小さい場合 (10 や 100 など)、この計算には目立った遅れはありません。
誰でもa-⊂bとは異なるアプローチを推奨できますか
実験的な並列機能を有効にして、gnuapl 1.5 を実行しています。4 つのコアで次の 2 行を実行します。
a←b←⍳x←1000
a-⊂b ⍝この行は、計算に非常に時間がかかるようです。
x の値が小さい場合 (10 や 100 など)、この計算には目立った遅れはありません。
誰でもa-⊂bとは異なるアプローチを推奨できますか
まず第一に、出力データのサイズは 2 次的に増加します。
a←b←⍳x←100 ◊ ⍴,⍕ a-⊂b
33240
a←b←⍳x←200 ◊ ⍴,⍕ a-⊂b
146490
a←b←⍳x←300 ◊ ⍴,⍕ a-⊂b
349740
a←b←⍳x←400 ◊ ⍴,⍕ a-⊂b
642990
a←b←⍳x←500 ◊ ⍴,⍕ a-⊂b
1026240
a←b←⍳x←600 ◊ ⍴,⍕ a-⊂b
1499490
a←b←⍳x←700 ◊ ⍴,⍕ a-⊂b
2062740
a←b←⍳x←800 ◊ ⍴,⍕ a-⊂b
2715990
a←b←⍳x←900 ◊ ⍴,⍕ a-⊂b
3459240
次に、データを印刷するときだけ遅延が発生するようです。APL2 のフォーマット規則は、すべての場合に最適化することは困難です。あなたの場合、出力行が非常に長いようです(x←1000で4292490文字)。それでも、データを表示するのに必要な時間は、データを読み取る時間よりも短いと思います。
/// ユルゲン
時間がかかっているのは計算であり、結果を画面にエコーしていないことは確かですか?
私はGnuAPLを使用していませんが、私の場合は速いようです:
B←A-⊂A←⍳1000
ここでは、結果をエコーするのではなく、B に割り当てています。
代替案は次のとおりです。
B←,/A∘.-A←⍳1000
実際の計算∘.-
はより高速かもしれませんが (多くのメモリを消費しますが)、それをベクトルのベクトルに変換するに,/
は時間がかかります。(コードはクールに見えますが...)