我有一个带有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
答案 0 :(得分:0)
OpenMP正试图通过减少线程数来帮助您,因为它认为您没有足够的并行性。可以通过代码中的OMP_DYNAMIC环境变量或omp_set_dynamic函数调用来控制此行为。默认情况下应禁用它,但值得仔细检查。
不应将动词一词的这种用法与动态调度的时间表(动态)混淆。 OMP_DYNAMIC指的是动态的线程数,而不是动态地将工作调度到固定数量的线程(schedule(动态)。