【发布时间】:2021-03-26 16:43:22
【问题描述】:
我遇到了一些奇怪的事情。我正在一台只有一个不起眼的 4 核 I3 的小型本地机器上测试 MPI + OMP 并行代码。事实证明,我的一个循环非常慢,在这个环境中每个进程有超过 1 个 OMP 线程(线程多于内核)。
#pragma omp parallel for
for ( int i = 0; i < HEIGHT; ++i )
{
for ( int j = 0; j < WIDTH; ++j )
{
double a =
( data[ sIdx * S_SZ + j + i * WIDTH ] - dMin ) / ( dMax - dMin );
buff[ i ][ j ] = ( unsigned char ) ( 255.0 * a );
}
}
如果我使用默认值运行此代码(不设置 OMP_NUM_THREADS,或使用 omp_set_num_threads),则大约需要 1 秒。但是,如果我使用任何一种方法(export OMP_NUM_THREADS=1 或omp_set_num_threads(1)))显式设置线程数,则大约需要 0.005 秒(快 200 倍)。
但似乎omp_get_num_threads() 无论如何都会返回 1。事实上,如果我只是这样做 omp_set_num_threads( omp_get_num_threads() ); 则大约需要 0.005 秒,而注释掉该行需要 1 秒。
知道这里发生了什么吗?为什么在程序开始时调用一次omp_set_num_threads( omp_get_num_threads() ) 会导致 200 倍的性能差异?
一些上下文,
cpu: Intel(R) Core(TM) i3-9100F CPU @ 3.60GHz
g++ --version: g++ (GCC) 10.2.0
compiler flags: mpic++ -std=c++11 -O3 -fpic -fopenmp ...
running program: mpirun -np 4 ./a.out
【问题讨论】:
标签: c++ multithreading parallel-processing mpi openmp