openmp 代码不是 运行 并行
openmp code not running in parallel
omp_set_num_threads( 8 );
#pragma omp parallel for
for( int tx = 0; tx < numThread; tx++ )
{
cout<<"\nThread :"<<omp_get_num_threads()<<"\n";
}
我的理解是上面的代码应该打印 8。但是我得到的输出是
Thread :1
Thread :1
Thread :1
Thread :1
Thread :1
Thread :1
Thread :1
Thread :1
请告诉我这里出了什么问题。我是 openmp 的初学者,所以我很确定我一定犯了一些愚蠢的错误。
提前致谢
我不确定这里发生了什么。
这可能是您使用存根 OpenMP 库编译的情况,它提供了所有 OpenMP 库 API,但仅充当顺序模式(参见 this link 的示例以了解相应的英特尔编译器开关)。
另一种可能是 OMP_THREAD_LIMIT
环境变量在您的环境中设置为 1
。例如,请参阅此代码:
#include <iostream>
#include <omp.h>
int main() {
omp_set_num_threads(8);
#pragma omp parallel
#pragma omp single
std::cout << "Number of threads in the current parallel region is " << omp_get_num_threads() << std::endl;
return 0;
}
在使用 OpenMP 支持和 运行 编译时,它给我:
$ g++ -fopenmp nbthreads.cc -o nbthreads
$ ./nbthreads
Number of threads in the current parallel region is 8
$ OMP_THREAD_LIMIT=1 ./nbthreads
Number of threads in the current parallel region is 1
除了这两种可能性,我不知道。
编辑:感谢
评论,我很确定我拿到了谜底的钥匙。
使用与上述代码完全相同的代码,这就是我得到的:
$ g++ -o nbthreads nbthreads.cc -lgomp
$ ./nbthreads
Number of threads in the current parallel region is 1
所以您只是在编译/链接代码时错误地使用了 -lgomp
而不是 -fopenmp
。这为您提供了相当于只有 1 个线程的 OpenMP 代码,即使您明确要求更多。
omp_set_num_threads( 8 );
#pragma omp parallel for
for( int tx = 0; tx < numThread; tx++ )
{
cout<<"\nThread :"<<omp_get_num_threads()<<"\n";
}
我的理解是上面的代码应该打印 8。但是我得到的输出是
Thread :1
Thread :1
Thread :1
Thread :1
Thread :1
Thread :1
Thread :1
Thread :1
请告诉我这里出了什么问题。我是 openmp 的初学者,所以我很确定我一定犯了一些愚蠢的错误。
提前致谢
我不确定这里发生了什么。
这可能是您使用存根 OpenMP 库编译的情况,它提供了所有 OpenMP 库 API,但仅充当顺序模式(参见 this link 的示例以了解相应的英特尔编译器开关)。
另一种可能是 OMP_THREAD_LIMIT
环境变量在您的环境中设置为 1
。例如,请参阅此代码:
#include <iostream>
#include <omp.h>
int main() {
omp_set_num_threads(8);
#pragma omp parallel
#pragma omp single
std::cout << "Number of threads in the current parallel region is " << omp_get_num_threads() << std::endl;
return 0;
}
在使用 OpenMP 支持和 运行 编译时,它给我:
$ g++ -fopenmp nbthreads.cc -o nbthreads
$ ./nbthreads
Number of threads in the current parallel region is 8
$ OMP_THREAD_LIMIT=1 ./nbthreads
Number of threads in the current parallel region is 1
除了这两种可能性,我不知道。
编辑:感谢
使用与上述代码完全相同的代码,这就是我得到的:
$ g++ -o nbthreads nbthreads.cc -lgomp
$ ./nbthreads
Number of threads in the current parallel region is 1
所以您只是在编译/链接代码时错误地使用了 -lgomp
而不是 -fopenmp
。这为您提供了相当于只有 1 个线程的 OpenMP 代码,即使您明确要求更多。