Dynamic OpenMp:如何确保每个线程在动态调度中至少运行1次迭代

Dynamic OpenMp:如何确保每个线程在动态调度中至少运行1次迭代,dynamic,openmp,Dynamic,Openmp,我正在为循环迭代使用动态调度。但是当每次迭代中的工作量太小时,一些线程就不能工作,或者线程数量太多。有100次迭代,有90个线程,我希望每个线程至少做一次迭代,其余10次迭代可以分配给完成任务的线程。我如何才能做到这一点?您不能强制OpenMP运行时做到这一点。但是,您可以向OpenMP运行时提供提示,以便它在(它决定)可能的情况下(以更高的开销为代价)可能会这样做。 另一种方法是指定动态调度循环的粒度。 以下是一个例子: #计划的pragma omp并行(动态,1) 对于(int i=0;i,

我正在为循环迭代使用动态调度。但是当每次迭代中的工作量太小时,一些线程就不能工作,或者线程数量太多。有100次迭代,有90个线程,我希望每个线程至少做一次迭代,其余10次迭代可以分配给完成任务的线程。我如何才能做到这一点?

您不能强制OpenMP运行时做到这一点。但是,您可以向OpenMP运行时提供提示,以便它在(它决定)可能的情况下(以更高的开销为代价)可能会这样做。 另一种方法是指定动态调度循环的粒度。 以下是一个例子:

#计划的pragma omp并行(动态,1)

对于(int i=0;i,您不能强制OpenMP运行时执行此操作。但是,您可以向OpenMP运行时提供提示,以便它在(它决定)可能时以更高的开销为代价执行此操作。 另一种方法是指定动态调度循环的粒度。 以下是一个例子:

#计划的pragma omp并行(动态,1)

对于(int i=0;iI使用第一种方法,但它没有按预期工作。一些线程不工作。我检查哪个线程工作,结果让我感到困惑。例如,线程1,2,5,10,88只工作。如果结果是线程1,2,3,4,5只在90个线程中工作,我可以假设在创建所有线程之前完成了工作。确实,more线程并不意味着运行时更快。我想要的是比较运行时线程大小的差异。例如,用1个线程运行程序,用2个线程运行程序…最多100个线程(与迭代的线程数相同)。这样我就可以比较运行时。
std::thread::hardware_concurrency()的结果是什么
在您的机器上?当我运行时,它是8。我发现如果我将线程数设置为大于8,则只有8个线程可以在动态和引导调度中工作。但是在静态调度中,所有线程都可以工作。这是如何发生的?答案已经更新,以考虑到此信息。我使用的是第一种方法,而不是w按预期工作。一些线程不工作。我检查哪个线程工作,结果让我困惑。例如,线程1、2、5、10、88只工作。如果结果是线程1、2、3、4、5只在90个线程中工作,我可以假设工作在创建所有线程之前完成。确实,更多线程并不意味着运行速度更快。我想要的是要比较运行时线程大小的差异。例如,使用1个线程运行程序,使用2个线程运行程序…最多100个线程(与迭代的线程数相同)。这样我就可以比较运行时。
std::thread::hardware\u concurrency()的结果是什么
在您的机器上?当我运行时,它是8。我发现,如果我将线程数设置为8以上,则只有8个线程在动态和引导调度中工作。但是在静态调度中,所有线程都工作。这是如何发生的?答案已更新,以考虑到此信息。