openMP 没有并行线程

Posted

技术标签:

【中文标题】openMP 没有并行线程【英文标题】:no parallel threads with openMP 【发布时间】:2011-08-01 14:17:27 【问题描述】:

我的问题是我无法使用 openMP 进行并行化。

我的系统: Ubuntu 11.4 Intel(R) Core(TM) i5 CPU M 430 @ 2.27GHz

编译器: g++ 版本:4.5.2 带有标志 -fopenmp

通过这段代码,我看到只有一个线程:

int nthreads, tid, procs, maxt, inpar, dynamic, nested;

// Start parallel region 
#pragma omp parallel private(nthreads, tid)   

// Obtain thread number    
tid = omp_get_thread_num();

// Only master thread does this    
if (tid == 0) 

printf("Thread %d getting environment info...\n", tid);

// Get environment information 
procs = omp_get_num_procs();
nthreads = omp_get_num_threads();
maxt = omp_get_max_threads();
inpar = omp_in_parallel();
dynamic = omp_get_dynamic();
nested = omp_get_nested();

// Print environment information 
printf("Number of processors = %d\n", procs);
printf("Number of threads = %d\n", nthreads);
printf("Max threads = %d\n", maxt);
printf("In parallel? = %d\n", inpar);
printf("Dynamic threads enabled? = %d\n", dynamic);
printf("Nested parallelism supported? = %d\n", nested);  


因为我看到以下输出:

Number of processors = 4
Number of threads = 1
Max threads = 4
In parallel? = 0
Dynamic threads enabled? = 0
Nested parallelism supported? = 0

有什么问题?

有人可以帮忙吗?

【问题讨论】:

你设置了OMP_NUM_THREADS环境变量了吗? 嘿!不我没有。但是在做了 omp_set_num_threads(2);我得到以下输出:处理器数 = 4 线程数 = 1 最大线程数 = 2 并行? = 0 启用动态线程? = 0 支持嵌套并行? = 0 线程数仍为 1。 【参考方案1】:

您的代码在 Ubuntu 11.04 上使用 g++ 编译器版本 4.5.2 对我有效,但我必须更改

#pragma omp parallel private(nthreads, tid)   

#pragma omp parallel private(nthreads, tid)  

让它编译成功。

编辑:如果修复语法不起作用,我的下一个想法是询问您用于编译代码的确切命令是什么?

【讨论】:

【参考方案2】:
#pragma omp parallel private(nthreads, tid)   

语法不正确,如 hrandjet 所述

pragma 必须以新行结束,因此 应该在下一行。

#pragma omp parallel private(nthreads, tid)   

这适用于我在 Windows XP 上。

【讨论】:

那么...您刚刚发布了@hrandjet 答案的副本?【参考方案3】:

输出是否以

开头
Thread 0 getting environment info...

如果不是,问题如上所述 - 左括号 ( ) 必须在新行上。为了进一步证明这一点,请尝试初始化

int tid = 1

并查看输出是否仍然显示。如果不是,则编译器会忽略#pragma(可能是因为括号问题)。

【讨论】:

以上是关于openMP 没有并行线程的主要内容,如果未能解决你的问题,请参考以下文章

OpenMP 并行等待

为什么OpenMP没有并行化vtk IntersectWithLine代码

对于if-else,increment,如何为OpenMP中任意数量的线程获得相同的并行输出?

openMP:并行运行所有线程会导致内存不足异常

用于区域线程关联的 OpenMP 并行

在运行时本地启用/禁用 OpenMP