我在OpenMP并行区域内有两个do循环,如下所示:
!$OMP PARALLEL
...
!$OMP DO
...
!$OMP END DO
...
!$OMP DO
...
!$OMP END DO
...
!$OMP END PARALLEL
Run Code Online (Sandbox Code Playgroud)
假设OMP_NUM_THREADS = 6.我想先用4个线程运行do-loop,然后用3个线程运行第二个do-loop.你能说明怎么做吗?我希望它们在一个平行区域内.也可以指定哪个线程号应该执行任何一个do循环,例如在第一次do循环的情况下我可以要求它使用线程号1,2,4和5.谢谢.
好吧,您可以将该num_threads子句添加到OpenMP parallel指令,但这适用于该区域内的任何指令.在您的情况下,您可以将程序拆分为两个区域,例如
!$OMP PARALLEL DO num_threads(4)
...
!$OMP END PARALLEL DO
...
!$OMP PARALLEL DO num_threads(3)
...
!$OMP END PARALLEL DO
Run Code Online (Sandbox Code Playgroud)
当然,这正是你所说的你不想做的,只有一个平行区域.但是没有机制来限制并行区域内使用的线程数.我个人无法理解为什么有人会这样做.
至于将计算的一部分分配给特定的线程,再次,不,OpenMP没有提供这样做的机制,为什么你想要?
我认为我非常传统,但当我看到程序员试图对各个线程进行精确控制的并行程序的迹象时,我通常会看到一个具有以下一个或多个特征的程序:
在并行程序中,这些都不是必需的,并且如果您希望对线程数量的控制级别以及对单个线程的工作分配,则必须使用比OpenMP提供的更低级别的方法.这样的方法比比皆是,所以放弃OpenMP不应该限制你.