设置openmp中每个部分的线程数?

时间:2017-04-03 11:33:41

标签: multithreading fortran openmp

我想知道是否可以在openmp并行部分中设置每个部分的线程数,即:

real*8     :: x
real*4     :: y
integer*8  :: ii
integer*4  ** jj
x = 0.0d0
y = 0.0
!$OMP PARALLEL 
!$OMP SECTIONS
!$OMP SECTION NUM_THREADS(3)
do ii=1,100000000000
  x=x+(cos(sin(tan(ii*1.0d0)))**(x/ii)
end do
!$OMP SECTION NUM_THREADS(1)
do jj=1,10000
  x=x+exp(jj*0.001)
end do
!$OMP END SECTIONS
!$OMP END PARALLEL

此代码不适用于ifort 16.0,但我只是想知道是否还有其他东西可以做...?

编辑:当我尝试设置每个部分的线程数时,我得到一个错误(在编译期间)...我想为每个部分指定不同数量的线程。

编辑2:错误消息= 2 x

  

错误#5082:语法错误,在预期“<”END-OF-STATEMENT“>”之一时找到'NUM_THREADS' ;

在两个!OMP SECTION NUM_THREADS(i)语句中

原谅匆匆写的......

2 个答案:

答案 0 :(得分:0)

既然你已经告诉我们我们需要知道什么,那么问题就是显而易见......

... num_threads子句仅适用于parallel指令。

不可能以直截了当的方式将mn个线程分配给一个部分,将剩余的n-m个线程分配给另一个部分。你可能可以一起破解某些东西来实现这种效果,但这将违背OpenMP编程的范畴。

答案 1 :(得分:0)

你要做的是反对OpenMP的理念,你不应该对线程有完全的控制权。但是,您可以使用hack:OpenMP和pthread的组合。也就是说,包含pthread语句的OMP PARALLEL块(pthread将完全控制将在OMP块中使用哪些线程)。在过去,我正在尝试这个,虽然我没有尝试你想要做的事情,但我设法得到了一些有趣的结果,证明OpenMP + pthread组合是可能的。此外,一些编译器(如gfortran)通过pthreads在幕后实现OpenMP。

当然,您需要为将要使用的pthread语句编写Fortran绑定,但这不是什么大问题。真正的问题是这种方法的定义是有问题的。它混合了两种截然不同的并行化模型,它是一种黑客攻击,所以你可以独立完成。我不会在严肃的应用程序中这样做,但是,如果有足够的反复试验,那么这就是你想要做的事情。

相关问题