如果不使用 OMP TASK,我该如何做到这一点?

How can I do this without using OMP TASK?

我有一个名为 array 的包含 4 个任务的数组。声明如下: type(tcb),dimension(4)::arrray

与:

type:: tcb !> new type task control block  
     procedure(my_interface),NOPASS,pointer:: f_ptr => null() !< the function pointer
     type(variables)::variables !< the variables 
     integer :: state     !< the task state
end type tcb

我只有2个线程来执行这4个任务。我想避免使用 !$OMP TASK。 当我使用任务构造时,我得到了这样的东西:

type(tcb),dimension(4),intent(inout)::array !< the array of tasks
integer,intent(in)::ff !< the counter 
type(tcb)::self !< self
type(variables),intent(inout)::var !< the variables
!OpenMP variables
integer::num_thread !< the rank of the thread
integer::nthreads !< the number of threads
integer:: OMP_GET_THREAD_NUM !< function to get the rank of the thread
integer::OMP_GET_NUM_THREADS !< function to get the number of threads    

!=======================================================================================================================================================
!$OMP PARALLEL PRIVATE(num_thread,nthreads,ff) &
!$OMP SHARED(array)
num_thread=OMP_GET_THREAD_NUM() !< le rang du thread 
nthreads=OMP_GET_NUM_THREADS() !< le nombre de threads
       !$OMP MASTER
       do ff=1,3
             !$OMP TASK SHARED(array) IF ((num_thread .ne. 0) .and. (num_thread .ne. 1))
             call array(ff)%f_ptr(self,var)
             !$OMP END TASK
          end if
       end do
       !$OMP TASKWAIT 
       !$OMP END MASTER      

你有什么想法吗?我希望当一个线程完成 运行 一个任务时,它直接移动到下一个可用任务。它不应该等待另一个线程完成。 不使用 OMP Tasking 怎么办? 我想单独安排任务,而不是借助 OpenMP。可能吗?

您使用 OpenMP 指令创建了一个串行程序。在这里,我试着解释一下原因。您代码中的任务创建位于 MASTER 区域内,其中 num_thread 始终为零 。来自 specification:

Thread number: A number that the OpenMP implementation assigns to an OpenMP thread. For threads within the same team, zero identifies the master thread and consecutive numbers identify the other threads of this team.

因此 ((num_thread .ne. 0) .and. (num_thread .ne. 1)) 表达式始终为假。再次来自 specification:

When an if clause is present on a task construct, and the if clause expression evaluates to false, an undeferred task is generated, and the encountering thread must suspend the current task region, for which execution cannot be resumed until the generated task is completed.

所以,这意味着你有一个串行程序。主线程执行暂停,直到任务完成。尽管标准没有要求(或指定),但实际上这意味着您的程序将 运行 仅在主线程上 ,其他线程只是在等待。因此,您必须删除 if 子句,您的程序将是并发的。

如果您希望 运行 仅在 2 个线程上执行这些任务,则必须在并行区域上使用 num_threads(2) 子句来显式指定它。

编辑:为了回答您的问题,使用任务是一个不错的选择,但如果在编译时已知任务数量,您也可以使用部分

!$omp sections
  !$omp section
    ! first job is here
  !$omp section 
    ! second job is here
  ...
!$omp end sections

ps: 你提到了 4 个任务,但是你的代码只生成了其中的 3 个。 ps2:不需要end if