0

実験的な並列機能を有効にして、gnuapl 1.5 を実行しています。4 つのコアで次の 2 行を実行します。

a←b←⍳x←1000

a-⊂b ⍝この行は、計算に非常に時間がかかるようです。

x の値が小さい場合 (10 や 100 など)、この計算には目立った遅れはありません。

誰でもa-⊂bとは異なるアプローチを推奨できますか

4

2 に答える 2

2

まず第一に、出力データのサイズは 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文字)。それでも、データを表示するのに必要な時間は、データを読み取る時間よりも短いと思います。

/// ユルゲン

于 2015-04-11T11:08:20.583 に答える
1

時間がかかっているのは計算であり、結果を画面にエコーしていないことは確かですか?

私はGnuAPLを使用していませんが、私の場合は速いようです:

B←A-⊂A←⍳1000

ここでは、結果をエコーするのではなく、B に割り当てています。

代替案は次のとおりです。

B←,/A∘.-A←⍳1000

実際の計算∘.-はより高速かもしれませんが (多くのメモリを消費しますが)、それをベクトルのベクトルに変換するに,/は時間がかかります。(コードはクールに見えますが...)

于 2015-04-10T11:31:08.840 に答える