我有一个带有openmp的c程序,并行for.The机器有24个内核。每个并行任务访问mmap文件中的不同位置,并进行一些计算。我没有设置任何特定的线程数。我让openmp来决定。当我查看htop时,我发现一次运行的线程数量有很大的不一致。有时,所有24个核心都被100%使用,整个任务很快就完成了,但在其他时候,htop显示只有2-3个线程(与除我的程序之外的所有其他进程/线程相结合)在运行。我还看到,当只有2-3个线程在运行时,大多数内核几乎不会被占用。
在任何给定时间运行的线程数量不一致的原因可能是什么,是否有一种方法可以通过我的程序控制行为,使结果在某种程度上是可预测的。目前,我的程序可能需要7秒甚至超过1分钟才能完成。
提前感谢!
添加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发布于 2015-02-03 02:59:04
OpenMP试图通过减少线程数量来帮助您,因为它认为您的并行性不够。此行为可由代码中的OMP_DYNAMIC环境变量或omp_set_dynamic函数调用控制。默认情况下,它应该被禁用,但它值得仔细检查。
动态一词的这种用法不应与表示动态调度的调度( dynamic )相混淆。OMP_DYNAMIC指的是动态数量的线程,而不是动态地将工作调度到固定数量的线程(调度(动态)。
https://stackoverflow.com/questions/28272075
复制相似问题