Oracle® Solaris Studio 12.4:OpenMP API 用户指南

退出打印视图

更新时间: 2014 年 12 月
 
 

4.5.1 关于任务依赖性的说明

    请注意以下有关任务依赖性的提示:

  • depend 子句中的 inoutinout 依赖类型类似于读写操作,但是 inoutinout 依赖类型只用于建立任务依赖性。它们不指示任务区域内的任何内存访问模式。包含 depend(in:a)depend(out:a)depend(inout:a) 子句的任务可能可以在其区域内读取或写入变量 a,也可能根本无法访问变量 a

  • 如果在同一任务指令中同时包含 if 子句和 depend 子句,当 if 子句的条件求值结果为 false 时,开销可能很大。当某个任务包含 if(false) 子句时,遇到该任务的线程必须暂停当前的任务区域,直到生成的任务(包含 if(false) 子句的任务)完成为止。同时,任务调度程序在所生成任务的任务依赖项满足之前,无法调度该任务。由于紧随在显式任务生成之后的点是任务调度点,因此任务调度程序将尝试调度任务,以便满足不延迟 (undeferred) 任务的任务依赖项。查找和调度池中正确任务的开销可能会很高。在最糟糕的情况下,开销可能与拥有一个 taskwait 区域那么大。

  • 相同任务或同级任务的 depend 子句中使用的列表项目必须指明相同存储或不相交存储。因此,如果 depend 子句中出现数组段,请确保数组段指明了相同存储或不相交存储。