我正在做一些基本的练习,以便在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 也许不是,所以混乱了,但至少不完全是顺序的,并且使用了多个线程。
我正在使用-fopenmp标记进行编译。有人知道我可能做错了什么吗?
发布于 2017-11-29 00:46:21
根据高性能马克的评论,这是答案,以防其他人有类似的问题。
我用的是#pragma omp parallel for而不是#pragma omp parallel,它运行得很好
https://stackoverflow.com/questions/47524530
复制相似问题