我是新手并行编程。我运行一个用C ++编写的自己的Gibbs采样器。程序概述看起来像这样。
for(int iter=0; iter <=itermax; iter++){ //loop1
#pragma omp parallel for schedule(dynamic)
for(int jobs= 0; jobs<=1000; jobs++){ // loop2
small_job();
#pragma omp critical(dataupdate){
data_updates()
}
}
jobs_that_cannot_be_parallelized();
}
我在64核的机器上运行。由于small_job长度可变且很小,因此我分配了omp_get_max_threads = 128.使用的核心数似乎是正确的(参见图最后一小时加载)。。每个峰都属于loop2。
然而,当我查看实际的cpu使用情况时(参见图,系统似乎使用了大量的cpu,用户只使用了20%。这是因为我在loop2中产生了大量的线程决定omp_get_max_threads的最佳做法是什么?我知道我没有提供足够的信息,但我真的很感激任何其他建议,使程序更快。