問題タブ [hpc]
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.
c - MPI_Isend と MPI_Irecv がデッドロックを引き起こしているようです
MPI でノンブロッキング通信を使用して、プロセス間でさまざまなメッセージを送信しています。ただし、デッドロックが発生しているようです。PADB (こちらを参照) を使用してメッセージ キューを調べたところ、次の出力が得られました。
これは、送信が完了したことを示しているようですが、すべての受信が保留中です (上記はタグ値 16 のログのほんの一部です)。しかし、これはどのように起こりますか?MPI ではすべての送信と受信が一致する必要があるため、関連する受信が完了しないと送信を完了できません。少なくとも私はそう思っていました…
誰でも洞察を提供できますか?
これを行うために使用しているコードを提供できますが、MPI_Waitall が最後に呼び出されると仮定すると、Isend と Irecv はすべての呼び出し順序に関係なく機能するはずです。
更新:コードはこの要点で入手できます
更新:コードにさまざまな変更を加えましたが、まだ正しく動作していません。新しいコードは同じ要点にあり、取得している出力はこの要点にあります。このコードにはいくつかの質問/問題があります:
出力前にすべての作業が完了していることを確認するために MPI_Barrier() がある場合、最終ループ (すべての配列の出力) からの出力が残りの出力に散在するのはなぜですか?
ランク 0 からランク 0 に送信することは可能/合理的です - それはうまくいきますか? (もちろん、正しい一致する受信が投稿されたと仮定します)。
出力に非常に奇妙な長い数値がたくさん表示されます。これは、ある種のメモリ上書きの問題、または変数のサイズの問題であると思います。興味深いことに、これは MPI 通信の結果であるに違いありません。なぜなら、new_array を 9999.99 の値に初期化すると、通信によって明らかにこれらの奇妙な値に変更されるからです。理由はありますか?
全体的に、転置の一部が発生しているように見えます (マトリックスのビットが転置されているようです...) が、すべてではありません - 私が最も心配しているのは、これらの奇妙な数値です!
c - MPI 通信から奇妙な double 値が表示される - メモリの問題?
元の質問で尋ねられた問題は解決したと思いますが、他の問題がいくつかあります。
行列の転置を行っている MPI コードがあります。これは、MPI_Isend と MPI_Irecv を使用したポイント ツー ポイントのノンブロッキング通信を介して行われます。double を使用していますが、MPI コードはすべて MPI_DOUBLE を型として使用しています。ただし、奇妙なメモリの問題が発生しているようです。そのうちの重要な問題は、出力に「意味のない」数値が含まれていることです。例えば:
どういうわけかメモリの問題があると推測できます-そうでない場合は一部のメモリをdoubleとして読み取り、そうでない場合はdoubleとしてメモリに書き込みます。これをデバッグする方法はありますか?
コードはこちらから入手できますが、コードの詳細な分析、MPI 通信を使用してこの種のエラーが発生する可能性に関するヒント、およびエラーを追跡するために何ができるかについての詳細は期待していません。
私が試したいくつかのことを確認するために、配列の初期化に問題はありません。配列を既知の値 (999) に初期化しようとしましたが、それは最後に配列に表示されないため、明らかにすべての新しい値 (クレイジーなものを含む) は MPI 通信からのものです。
何か案は?
c - MPI_Type_create_subarrayを使用して送信するときに配列を転置できますか?
CでMPIを使用してマトリックスを転置しようとしています。各プロセスには正方形のサブマトリックスがあり、それを正しいプロセス(グリッド上の「反対側」のプロセス)に送信して、通信の一部として転置します。
私は、それぞれ行メジャーと列メジャーのいずれか、またはMPI_Type_create_subarray
順序の引数を持つwhichを使用しています。これらの1つとして送信し、もう1つとして受信した場合、私のマトリックスは通信の一部として転置されると思いました。ただし、これは発生しないようです。転置されないままです。MPI_ORDER_C
MPI_ORDER_FORTRAN
コードの重要な部分は以下のとおりです。コードファイル全体は、この要点で入手できます。なぜこれが機能しないのか誰かが何か考えを持っていますか?転置作業を行うためのこのアプローチは必要ですか?MPI_ORDER_C
との説明を読んだら、そうなると思っていたでしょうが、そうではMPI_ORDER_FORTRAN
ないかもしれません。
c - プログラム内の複数のファイルでOpenMPディレクティブを使用することは可能ですか?
複数の.cファイルと複数の.hファイルで構成されるCプログラムがあります。main関数に1つの#pragma omp parallel
ディレクティブ(すべてのスレッドが1回だけ作成されるようにする)を設定してから#pragma omp for
、他のファイルと同様に他のOpenMP処理を実行したいと思います。
しかし、私はこれを行うことができないようです。private()
メインファイルをコンパイルすると、ディレクティブのandshared()
ビットに記載されている変数の一部が#pragma omp parallel
存在しない(他のファイルにあるため、そのファイルには存在しません)と文句を言います。#pragma omp for
を囲むことなく、私が持っていると文句を言うファイル#pragma omp parallel
。
コードはファイル間でうまく分割されているので、すべてを1つのファイルに戻す必要はありません。これを回避する方法はありますか?
mpi - MPI は現在、HPC で広く使用されていますか?
MPI は現在、HPC で広く使用されていますか?
performance - 必要な参照:ハードウェアアーキテクチャとパフォーマンスの向上[HPC/並列コンピューティング]
HPCアプリケーションのパフォーマンスを向上させる方法/方法はいくつかあります。方法の1つは、ハードウェアアーキテクチャに基づいてアプリケーションを微調整することです。この種の微調整は、主にマルチコアアーキテクチャで行われます。この方法を使用するには、メモリ、ソケット数、ソケットあたりのコア数、L1 / L2キャッシュ、GFlopsなどの基盤となるハードウェアアーキテクチャを実際に理解する必要があります。
これらの専門用語はおなじみのように見えますが、アプリケーションのパフォーマンスの観点から正確に何を意味するのか、まだ明確に理解していません。
パフォーマンスの観点からハードウェアアーキテクチャを理解できる良い場所/本を誰かが提案できますか?
visual-studio - Windows クラスターの構築
私は研究生で、ラップトップを使用して自宅で Windows クラスターを構築し、並列コードをテストしたいと考えています。
問題は、サーバー エディションではなく、Windows 7 Home Premium を使用していることです。
私は Visual Studio 2010 Ultimate を使用しており、Microsoft HPC Packs with SP1 をインストールしており、ローカル ホストで問題なく MPI コードをシミュレートできます。では、実際のアプリケーションを見てみたいと思います。
家には他に 3 台のラップトップがあり、Windows 7 スターターがインストールされています。私は大学からのライセンスを 1 つしか持っていないため、Visual Studio はインストールされていません。
これらの構成で Windows クラスターを構築する方法はありますか??
azure - Windows HPC サーバーと Azure
Azure で Windows HPC サーバーを使用できることを読みました。オンプレミスのヘッド ノードで HPC サーバーを実行し、クラウド上のコンピューティング ノードを使用できるということです。
私の質問は、Azure でヘッド ノードを作成し、Azure で計算ノードを使用できますか? それを行う方法に関するチュートリアルがあれば、非常に役立ちます..
c - #pragma omp for で無視される折りたたみ句
OpenMP を使用した次の C コードがあります。
私が知る限り、#pragma omp for ディレクティブでcollapse句を使用するためのルールに従っていますが、コンパイルすると次のエラーが発生します。
ここで何が間違っていますか?#pragma omp collapse
別のディレクティブとして入れてみましたが、それもうまくいきません。
c - MPI_Type_vectorをテストするための単純なMPIコードがセグメンテーション違反でクラッシュする-なぜですか?
次のコードを使用して、別のプログラムでMPI_Type_vectorをどのように使用しているかをテストしています。この小さなテストプログラムを作成したのは、MPI_Type_vectorに指定しているパラメーターをチェックして、配列の正しい部分を抽出していることを確認できるようにするためです。ただし、正しく機能していないようです。実行時にセグメンテーション違反が発生し(最初に出力の一部を実行したとしても)、その理由を理解できないようです。
何か案は?
コードは以下のとおりです。最初の関数(alloc_3d_int
)は他の誰かによって提供されましたが、十分にテストされています。