2017-01-23 25 views
-1

私はハイブリッドなopenMP/MPIコードを書いています。 まず、8つのスレッドでopenMPだけをベンチマークしました。 そして、私は、次のハイブリッドOpenMP/MPIとOpenMPだけでは実行時間が遅い

MPI_Init(&argc, &argv); 
MPI_Comm_size(MPI_COMM_WORLD, &numprocs); 
MPI_Comm_rank(MPI_COMM_WORLD, &rank); 
MPI_Get_processor_name(processor_name, &namelen); 
//the following function has OPENMP for loop embedded 
parallelfunction(args);//should I add condition on rank? 
MPI_finalize(); 

OpenMPの機能のようなMPI層Iハイブリッドコードをコンパイルし、この

ようつのCPU上で実行

#pragma omp parallel for schedule(dynamic,chunk) private(i) 
for(i=0;i<n;i++){ 
//loop code here 
} 

ループのための標準のOpenMPで加え

mpirun -np 1 -x OMP_NUM_THREADS=8 ./program 

実行時間がopenMP単独よりも5倍遅かったことを認識するだけです(1つのCPUで必然的に)。 私はbash time関数を使ってウォールタイムをベンチマークします。 提案がありますか?

私はOpenMPIののv1.10.3

+0

実際のコードや実際の測定結果を見ずには完全にわかりません。 – Zulan

+0

はい、本当にありがとうございます。 1 cpuと8スレッド。 – Marouen

+2

あなたはOpen MPIを使用しています。 '--bind-to none'を' mpirun'オプションのリストに追加してみてください。 –

答えて

2

を使用EDIT

mpiccのでのOpenMP 3.1を使用していますが、明示的にMPIの実装を指定していないが、MPIに環境変数を渡すために-xを使用してプロセスはOpen MPIの兆候です。 MPI process launcherのmanページで詳述するように、プロセスピニング/バインディングがデフォルトで有効になって、バージョン1.8以降で:

すると、そのmpirunのは自動的にV1.8シリーズの開始などのプロセスをバインドしますのでご注意ください。二つの結合パターンは、任意のさらなる指示の不存在下で使用されているコアに

バインド:プロセスの数である場合

プロセスの数がソケットに< = 2
バインドである場合> 2

アプリケーションがスレッドを使用する場合は、適切なバインドレベルまたは特定の数の処理要素を使用して、バインドされていないか(複数のコアにバインドされているか(--bind-to none)アプリケーションごとのプロセス数。

この場合、プロセスは1つのコアにバインドされ、すべてのスレッドでタイムシェアリングが必要です。 --bind-to noneはバインディングを削除し、スレッドをすべてのCPUコアでスケジュールできるようにします。

+0

openmpiバージョン2.1.1では残念ながら私のために働いていませんでした! – niceman

関連する問題