【问题标题】:Why isn't openMP working?为什么 openMP 不工作?
【发布时间】:2017-11-29 08:46:21
【问题描述】:

我正在做一些基本的练习来掌握 C++ 中使用 OpenMP 进行并行化的窍门,但我无法让它工作。这是我写的代码:

std::cout << "omp_get_max_threads(): " << omp_get_max_threads() << std::endl;

for(int n=0; n<25; ++n){
  std::cout << n << " " << omp_get_num_threads() << " " << std::flush;
}
std::cout << std::endl;

#pragma omp for
for(int n=0; n<25; ++n){
  std::cout << n << " " << omp_get_num_threads() << " " << std::flush;
}
std::cout << std::endl;

我每次得到的输出是:

omp_get_max_threads(): 4
0-1 1-1 2-1 3-1 4-1 5-1 6-1 7-1 8-1 9-1 10-1 11-1 12-1 13-1 14-1 15-1 16-1 17-1 18-1 19-1 20-1 21-1 22-1 23-1 24-1 
0-1 1-1 2-1 3-1 4-1 5-1 6-1 7-1 8-1 9-1 10-1 11-1 12-1 13-1 14-1 15-1 16-1 17-1 18-1 19-1 20-1 21-1 22-1 23-1 24-1

这个想法是有一个非并行循环的基线,然后是一个并行的循环进行比较。如果它工作正常,我希望输出看起来更像这样:

omp_get_max_threads(): 4
0-1 1-1 2-1 3-1 4-1 5-1 6-1 7-1 8-1 9-1 10-1 11-1 12-1 13-1 14-1 15-1 16-1 17-1 18-1 19-1 20-1 21-1 22-1 23-1 24-1 
17-4 11-4 4-4 3-4 8-4 0-4 23-4 24-4 1-4 2-4 21-4 12-4 20-4 9-4 7-4 19-4 5-4 22-4 15-4 10-4 16-4 13-4 14-4 6-4 18-4 

也许不是SO混乱了,但至少不完全是顺序的,并且使用了多个线程。

我正在使用-fopenmp 标记进行编译。有谁知道我可能做错了什么?

【问题讨论】:

  • 尝试将#pragma omp for 更改为#pragma omp parallel for
  • 谢谢,效果很好!如果你把它作为一个答案,如果你愿意,我可以接受它..

标签: c++ parallel-processing openmp


【解决方案1】:

根据高性能标记的评论,这就是答案,以防其他人遇到类似问题。

我使用了#pragma omp parallel for 而不仅仅是#pragma omp parallel,而且效果很好

【讨论】:

    猜你喜欢
    • 2012-06-21
    • 2018-02-23
    • 2021-08-10
    • 2016-11-19
    • 1970-01-01
    • 2015-06-15
    • 2013-06-01
    • 2011-09-29
    • 2014-05-16
    相关资源
    最近更新 更多