問題タブ [contiguous]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
arrays - N 個を超えるプロセスでのセグメンテーション違反
SUB EXC_MPI (MOD01) を呼び出すとき、正確には MPI_StartAll (コメント) で無効なメモリ参照に苦労しています。
通話元:
MAIN (実際にはモジュール内のサブ) が MYSUB (上記のコード) を 2 回目に呼び出すと、実行時にセグメンテーション違反が発生します。分解された配列に依存する NPMAX など、ジョブを特定の数のプロセスに分割する場合にプログラムが機能するという意味で、エラーは体系的ではありません。NPMAX よりも多くの proc を使用すると、プログラムはセグメンテーション違反を起こします。環境条件の詳細:
- ほぼ [コンパイラ + mpi 独立]: [gfortran+ompi]、[gfortran+mpich]、[ifort+mpich] でも同じ問題が発生します。
- deb ベース (glibc) の mini hpc と pcs で発生 (「深刻な」nec、sun、ibm では問題なし)
図からわかるように、MOD02 は交換手順 (MOD01) に、連続していないスライスされた配列 Y0 を渡します。この障害 (NPMAX が 1 桁大きくなる) をほぼ克服できる唯一の方法は、次元を前後に交換することですが、これにより実行速度が約 2 倍遅くなります。ディメンションは解決しますが、SUB01 のようなネストされたサイクルの効率を下げたくありません (最初のディメンションは他のディメンションよりもはるかに大きい)。
実際、MOD02 は一時配列を作成します。それを明示的に行っても問題は解決しません。
ヒープまたはスタックの割り当てを強制しても解決しません。
何かヒントはありますか?読んでくれてありがとう
更新: 呼び出しごとに初期化する (サブ exc_mpi の if ステートメントから exc_init() を呼び出す) ことで解決しますが、MAIN (リストされていない) が大量にループしているため、完全に非効率的です。
UPDATE2 (@Gilles の後): 連続した配列 (この場合は Y1) を渡し、mpi が一時を作成していない場合でも、この回避策は機能しません。
algorithm - 最大値連続サブシーケンス アルゴリズム
この問題への入力は、A[1...n]
実数の配列です。A[i],A[i+1],...A[j]
の連続する部分列のすべての数値を合計して得られる最高値を調べる必要がありますA
。A
に負の数が含まれていない場合、問題は自明であり、 のすべての要素を合計することで解決できますA
。A
ただし、正の数と負の数が混在している場合は、よりトリッキーになります。
たとえば、 の場合A = [-2,11,-4,13,-5,-3]
、解は20
(11-4+13=20)です。の場合A = [-2,1,-3,4,-1,2,1,-5,4]
、解は6
(4-1+2+1=6)です。空の部分列の数の合計は です0
。
O(n^3)でこの問題を解決する力ずくのソリューションが存在しますが、問題を線形時間で解決することも可能です。
- 上記の問題を線形時間で解くアルゴリズムを設計します。アルゴリズムを疑似コードで提示します。
- アルゴリズムがどのように、またなぜ機能するのかを簡単に説明してください。
- アルゴリズムが実際に線形時間で実行される理由を簡単に説明してください。