使用openmp时运行的线程数量不一致

时间:2015-02-02 06:15:50

标签: c multithreading openmp multicore

我有一个带有openmp并行的c程序。该机器有24个核心。每个并行任务访问mmap< d文件中的不同位置并进行一些计算。我没有设置任何特定数量的线程。我让openmp决定。我看到当我看到htop时,运行的线程数量存在巨大的不一致。有时所有24个核心都使用100%,整个任务很快完成,但在其他时候htop显示只运行2-3个线程(与我的程序以外的所有其他进程/线程组合)。我还看到,当只有2-3个线程运行时,大多数内核几乎不会被占用。

在任何给定时间运行线程数量不一致的原因可能是什么?我可以通过我的程序控制行为,以便结果可以预测。目前,我的课程可能需要7秒或有时超过一分钟才能完成。

提前致谢!

添加gprof输出

Each sample counts as 0.01 seconds.
%   cumulative   self              self     total
time   seconds   seconds    calls  ms/call  ms/call  name
43.50     26.62    26.62                             __libc_csu_init
41.91     52.26    25.65     4985     5.14     5.14  _get_entity
9.08     57.81     5.55                             __libc_csu_fini
4.61     60.64     2.82     5000     0.56     0.56  common_count_2
0.74     61.09     0.45        1   450.27   450.27  _get_first_entity
0.16     61.19     0.10                             main
0.00     61.19     0.00        1     0.00     0.00  copy_index

1 个答案:

答案 0 :(得分:0)

OpenMP正试图通过减少线程数来帮助您,因为它认为您没有足够的并行性。可以通过代码中的OMP_DYNAMIC环境变量或omp_set_dynamic函数调用来控制此行为。默认情况下应禁用它,但值得仔细检查。

不应将动词一词的这种用法与动态调度的时间表(动态)混淆。 OMP_DYNAMIC指的是动态的线程数,而不是动态地将工作调度到固定数量的线程(schedule(动态)。