0

我遇到了标志 -Dparallel 的问题(我们在代码中使用它来启用并行部分)。当我使用它时,我不再获得一个以上的 OpenMP 线程。

备注:我们正在运行 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;
}

如果我用mpicc -o example -fopenmp example.c输出显示编译它:

$ 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

编辑(也许是解决方案):我只是使用 testet 来编译它:

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

它按预期工作。所以我猜,-Dparallel 只是把#pragma omp parallel. 我对吗?

4

1 回答 1

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

切勿使用名称与语言关键字匹配的预处理器符号。Using-Dparallel=parallel是一个可怕的 hack,既parallel定义了预处理器符号,又保留了它的原始含义。

于 2013-03-28T17:04:02.740 回答