2017-01-23 132 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層是用於循環標準的openmp

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

我編譯混合代碼和一個CPU上運行它像這樣

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

只能意識到運行時間比單獨使用openMP慢5倍(在一個CPU上)。 我使用bash time函數對牆壁時間進行基準測試。 有什麼建議嗎?

我使用OpenMP 3.1 mpicc

編輯

我用了openmpi v1.10.3

+0

如果沒有看到實際的代碼和實際的測量結果是完全不可能的。 – Zulan

+0

是的。 1個CPU和8個線程。 – Marouen

+2

您明確使用Open MPI。嘗試在'mpirun'選項列表中添加'--bind-to none'。 –

回答

2

您沒有明確指定MPI實現,但使用-x環境變量傳遞給MPI過程是Open MPI的一個信號標誌。

請注意的mpirun自動綁定程序爲V1.8系列的開始的:與1.8版本,工藝釘扎啓動/綁定默認情況下,詳細的MPI process launcher的手冊頁啓用。

綁定到核心:
時的進程數爲< = 2
綁定到插座:
時的進程數爲兩個結合圖案在沒有任何進一步指示的使用> 2

如果您的應用程序使用線程,那麼您可能希望確保根本沒有綁定(通過指定--bind-to none),或者使用適當的綁定級別或特定數量的處理元素綁定到多個核心ts每個應用程序進程。

在你的情況下,進程綁定到一個單一的核心,所有的線程都必須分時分享。 --bind-to none刪除綁定並允許在所有CPU內核上調度線程。

+0

不幸的是,在openmpi 2.1.1版本中我不工作! – niceman