2013-03-28 78 views
0

我遇到了一個問題,標誌-Dparallel(我們在代碼中使用它來啓用並行部分)。當我使用它時,我不再獲得更多的OpenMP線程。mpicc/openmp標誌-Dparallel有什麼影響?

備註:我們正在運行MPI/OpenMP混合代碼。

短代碼例如:

#include <stdio.h> 
#include "mpi.h" 

#ifdef _OPENMP 
    #include <omp.h> 
#else 
    #define omp_get_num_threads() 0 
    #define omp_get_thread_num() 0 
#endif 

int main(int argc, char **argv) 
{ 
    int nthreads, thread_id; 
    int rank, size, provided; 

    MPI_Init_thread(&argc, &argv, MPI_THREAD_FUNNELED, &provided); /* starts MPI */ 

    MPI_Comm_rank (MPI_COMM_WORLD, &rank); /* get current process id */ 
    MPI_Comm_size (MPI_COMM_WORLD, &size); /* get number of processes */ 

    #pragma omp parallel private(nthreads, thread_id) 
    { 
    nthreads = omp_get_num_threads(); 
    thread_id = omp_get_thread_num(); 

    if (thread_id == 0) 
     printf("This is rank %d with %d threads.\n", rank,nthreads); 
    } 

    MPI_Finalize(); 
    return 0; 
} 

如果我與​​編譯它的輸出顯示:

$ mpirun -np 2 ./example 
This is rank 1 with 6 threads. 
This is rank 0 with 6 threads. 

正如所預期的。

如果我使用的標誌-Dparallel(整行:mpicc -Dparallel -o example_parallel -fopenmp example.c

輸出說:

$ mpirun -np 2 ./example_parallel 
This is rank 0 with 1 threads. 
This is rank 1 with 1 threads. 

爲什麼-Dparallel限制了OpenMP的Threadfs爲1?我在哪裏可以找到這方面的文件?

爲完整起見:

  • 的mpirun(開放MPI)1.4.1
  • GCC(Ubuntu的4.4.3-4ubuntu5.1)4.4.3

EDIT(也許解決方案):我只是testet編譯它使用:

mpicc -Dparallel=parallel -o example_parallel -fopenmp example.c 

它按預期工作。所以我想--D並行只是混淆了#pragma omp parallel。我對嗎?

回答

3

對於大多數C編譯器,-D是一個用於定義預處理器宏符號值的選項。使用-Dparallel您可以定義一個名爲parallel但具有空值的預處理器符號。由於預處理總是在編譯器進一步分析代碼之前完成的,因此代碼中出現的所有parallel都被替換爲空字符串,並且#pragma omp parallel private(...)變爲#pragma omp private(...)。編譯器可能會忽略由此產生的無效編譯指示。從命令行下降-Dparallel。如果您需要能夠編譯代碼的不同部分條件,然後用另一種預處理符號,例如BUILD_PARALLEL,例如:

#if defined(BUILD_PARALLEL) 
... parallel code ... 
#else 
... serial code ... 
#endif 

決不使用預處理符號相匹配的語言關鍵字名稱。使用-Dparallel=parallel是一個可怕的破解都具有parallel預處理器符號定義,並仍保留其原來的含義。

+0

你說得對。謝謝。 「並行=並行」不是解決方案,而是證明這是問題。 – redimp