mpicc/openmp标志Dparallel有什么影响?
我遇到了标志-Dparallel的问题(我们在代码中使用它来启用并行部件)。当我使用它时,我再也不会得到超过一个OpenMP线程了 备注:我们正在运行MPI/OpenMP hyrbrid代码 一个简短的代码示例:mpicc/openmp标志Dparallel有什么影响?,mpi,openmp,openmpi,Mpi,Openmp,Openmpi,我遇到了标志-Dparallel的问题(我们在代码中使用它来启用并行部件)。当我使用它时,我再也不会得到超过一个OpenMP线程了 备注:我们正在运行MPI/OpenMP hyrbrid代码 一个简短的代码示例: #include <stdio.h> #include "mpi.h" #ifdef _OPENMP #include <omp.h> #else #define omp_get_num_threads() 0 #define omp_
#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;
}
正如所料
如果我使用标志-Dparallel
(整行:mpicc-Dparallel-o示例\u 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
mpicc -Dparallel=parallel -o example_parallel -fopenmp example.c
它按预期工作。所以我猜,-Dparallel只是把
#pragma omp parallel
搞砸了。对吗?对于大多数C编译器,-D
是定义预处理器宏符号值的选项。使用-Dparallel
可以定义一个名为parallel
但值为空的预处理器符号。由于预处理总是在编译器进一步解析代码之前完成,因此代码中出现的所有parallel
都将替换为空字符串,并且#pragma omp parallel private(…)
将变为#pragma omp private(…)
。编译器可能会忽略生成的无效杂注
从命令行中删除-Dparallel
。如果需要有条件地编译代码的不同部分,则使用另一个预处理器符号,例如BUILD\u PARALLEL
,例如:
#if defined(BUILD_PARALLEL)
... parallel code ...
#else
... serial code ...
#endif
切勿使用名称与语言关键字匹配的预处理器符号。使用
-Dparallel=parallel
是一种非常糟糕的方法,它既定义了并行
预处理器符号,又保留了它的原始含义。对于大多数C编译器,-D
是定义预处理器宏符号值的一个选项。使用-Dparallel
可以定义一个名为parallel
但值为空的预处理器符号。由于预处理总是在编译器进一步解析代码之前完成,因此代码中出现的所有parallel
都将替换为空字符串,并且#pragma omp parallel private(…)
将变为#pragma omp private(…)
。编译器可能会忽略生成的无效杂注
从命令行中删除-Dparallel
。如果需要有条件地编译代码的不同部分,则使用另一个预处理器符号,例如BUILD\u PARALLEL
,例如:
#if defined(BUILD_PARALLEL)
... parallel code ...
#else
... serial code ...
#endif
切勿使用名称与语言关键字匹配的预处理器符号。使用
-Dparallel=parallel
是一个可怕的攻击既定义了并行
预处理器符号,又保留了其原始含义。你说得对。Thx-Dparallel=parallel
不是解决方案,而是证明这就是问题所在。你是对的。Thx-Dparallel=parallel
不是解决方案,而是证明这就是问题所在。