【发布时间】: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