Fortran 規格のcoarray機能
Fortran 2008 と Fortran 2015
2016 年6月1日
NEC 林 康晴
内容
1. Fortran 2008 coarray 機能
2. 姫野ベンチMPI版coarray化 要点
3. Fortran 2015 coarray 機能
現Fortran規格 (Fortran 2008)
▌ 2010 年,最新 ISO規格
▌ 目玉 一 ,coarray機能 導入さ た
主 し ,分散並列処理 機能
(MPI う ) ローカ デ ・全手動 並列化
各 ロセ , 独自 データを
通信や同期 ,全 利用者 ロ
通信 ,代入文 形式 ,片側通信方式 記述
5 © Nどで でorporation 201す
Fortran 2008 coarray 機能概要(1)
▌ image
リ
CPU
リ
CPU
リ
CPU
リ
CPU
ー 間 ッ ワーク
image image image image
ログラム instance ( 通常, ロセ )
image番号 (image ID) 1 2 3 4
通信や同期処理等 ,基本的
image 番号を使 書く
(MPI rank 相当す )
Fortran 2008 coarray 機能概要(2)
▌ ータマッ ン 並列化
各image上 データ・処理 、独立し 別物
宣言時 codimension ( [*] ) を付加 ,coarray
,他 image 参照 可能
[n1, n2, *] う ,多次元 image構成 可能
自image上 coarray ,通常 (coarray い)データ 同様
参照
integer :: a(2)
do i=1,2 a(i) = i enddo
image 2 image 1
a(1) a(2) a(1) a(2) do i=1,2 do i=1,2
integer, save :: a(2)[*]
do i=1,2 a(i) = i enddo
image 2 image 1
a(1) a(2) a(1) a(2) do i=1,2 do i=1,2
7 © Nどで でorporation 201す
Fortran 2008 coarray 機能概要(3)
▌ 他 image上 coarray 参照 (通信)
image i 上 coarrayを参照 場合,image selector ( [ i ])
を付加
多次元image構成 場合,image selector image番号 対応 ,配
列添字 配列要素 対応(添字順序値) 同様 ,column-wise
order 計算
integer,save :: a[*]
if(THIS_IMAGE().eq.1)then a = a[2]
endif
image 2 image 1
a a[2]
integer,save :: a[*]
if(THIS_IMAGE().eq.1)then a[2] = a
endif
integer,save :: a[*]
if(THIS_IMAGE().eq.3)then a[2] = a[1]
endif
image 2 image 1
a a[2]
image 2 image 1
a[2]
get put 第三者による操作
image 3 a[1]
THIS_IMAGE() ,自image image番号を返 組込 関数
Fortran 2008 coarray 機能概要(4)
▌ ータ 整合性 ,ユー 保証 必要 あ
integer,save :: b, a[*]
if(THIS_IMAGE().eq.1)then a[2] = a
else if(THIS_IMAGE().eq.2)then b = a
endif
確定と引用の競合
image 2 image 1
a a[2]
b
integer,save :: b, a[*]
if(THIS_IMAGE().eq.1)then a[2] = a
else if(THIS_IMAGE().eq.2)then a = b
endif
確定と確定の競合
image 2 image 1
a a[2]
b
正しい順序 実
行を保証す う
コ ドを書く
,
上記 う 競合 起こ ロ ,規格違反
同期を追加 必要 あ
9 © Nどで でorporation 201す
Fortran 2008 coarray 機能概要(5)
▌ ータ 整合性を保証 た 手段
Fortran 同期機能
SYNC ALL 文
SYNC IMAGES 文
CRITICAL 構文
LOCK 文,UNLOCK文
SYNC MEMORY 文 + Fortran以外 手段 同期
SYNC MEMORY 文 , 操作 完了を保証
SYNC MEMORY 文 + atomicサ ーチン 同期
atomic サ ーチン(組込 手続) ,coarray atomic
引用・確定 可能
ータ 整合性を保証 た 手段 (1)
▌ SYNC ALL 文
全image 同期を取
ロ 実行 segment 分割さ
segment 完了時 , 以前 操作 完了 保証さ
例: segment B , segment A 実行後 実行さ
(NUM_IMAGES() ,全image 個数を返 組込 関数) integer, save :: a[*] ! coarray if(THIS_IMAGE().eq.1)then
do i=2, NUM_IMAGES()
a[i] = a ! 全image a 値を確定 enddo
endif
SYNC ALL
! 各image aを引用す :
segment A
segment B image 2
image 1
a a[2]
coarray 変数 a を引用
SYNC ALL
image 3 a[3]
segment A
segment B
SYNC ALL [ ( [ sync-stat-list ] ) ]
11 © Nどで でorporation 201す
segment
▌ 実行 一部分
image control statement を実行 , ロ
実行 , 前後 ,二 segment 分割さ
操作 ,segment 実行完了時 完了し い
image control statement ,次 う 文 あ
SYNC ALL 文
SYNC IMAGES 文
LOCK 文,UNCLOK文
CRITICAL 文,END CRITICAL文
ALLOCATABLE 属性を coarray を明示的 又 暗黙的 割付け 又
解放 文 実行
ALLOCATE文,DEALLOCATE文,RETURN文
SYNC MEMORY 文
▌ を正 く実行 ,次 2点 必要
操作 完了 ほ い箇所 segment 分割
必要 順序 segment 実行さ う 同期を書く
ータ 整合性を保証 た 手段 (2)
▌ SYNC IMAGES 文
指定し image 同期を取 (* ,全imageを意味 )
例: segment C , segment A ・B 実行後 実行さ
image 2 image 1
a a[2]
変数a,bを 引用す
image 3
b[2] b
segment A segment B
segment C
integer, save :: b[*], a[*] ! coarray if(THIS_IMAGE().eq.1)then
a[2] = a ! 変数a[2]を確定す
SYNC IMAGES(2)
else if(THIS_IMAGE().eq.3)then b[2] = b ! 変数b[2]を確定す
SYNC IMAGES(2)
else if(THIS_IMAGE().eq.2)then SYNC IMAGES((/1, 3/))
! 変数a, bを引用す endif
segment A
segment B
segment C
SYNC IMAGES ( image-set [ , sync-stat-list ] )
image-set ,image番号を値 持 式 又 *
SYNC IMAGES
13 © Nどで でorporation 201す
▌ LOCK 文、UNLOCK文
lock 変数 ロッ 操作・ロッ 解除操作を行う
lock 変数 ,型LOCK_TYPE coarray
型LOCK_TYPE ,組込 ュー ISO_FORTRAN_ENV 定義さ い
例: segment A ,ロッ を獲得し image け 実行
ータ 整合性を保証 た 手段 (3)
use, intrinsic :: ISO_FORTRAN_ENV type(LOCK_TYPE),save :: lock[*] integer, save :: a[*]
LOCK(lock[2]) a[2] = a[2] + 1 UNLOCK(lock[2])
image 2 image 1
a[2]
image 3 segment A segment A segment A
segment A
LOCK ( lock 変数 [ , lock-stat-list ] )
UNLOCK ( lock 変数 [ , sync-stat-list ] )
LOCK( lock 変数 , ACQUIRED_LOCK=
論理型変数)
う ,ACQUIRED_LOCK指定子を け ,非 ロッキン 実行 ,論
理型変数 ,ロッ を獲得 場合 真, 場合 偽
ータ 整合性を保証 た 手段 (4)
▌ CRITICAL 構文
実行文 列 を同時 実行 image を一 制限
コード 一部分 対 ロッ 考え
例: segment A ,各image 逐次的 実行
image 2 image 1
a[2]
image 3
segment A segment A segment A integer,save :: a[*] ! coarray CRITICAL
a[2] = a[2] + 1 END CRITICAL
segment A
CRITIAL
実行文 列
END CRITICAL
15 © Nどで でorporation 201す
ータ 整合性を保証 た 手段 (5)
▌ SYNC MEMORY 文+Fortran以外 手段 同期
segment を分割
例: segment B , segment A 実行後 実行さ
SYNC MEMORY 文 無い ,処理系 ,確定や引用 実行順序を変
更 可能性 あ ,正しい実行 保証さ い
image 2 image 1
a a[2]
変数 a を引用す
利用者独自 同期 +SYNC MEMORY
image 3 a[3]
segment A
segment B
segment A
segment B integer,save :: a[*] ! coarray
if(THIS_IMAGE().eq.1)then do i=2, NUM_IMAGES()
a[i] = a ! 全image a 値を確定 enddo
endif
SYNC MEMORY
call mybarrier() ! 利用者独自 同期 SYNC MEMORY
! 各image aを引用す
:
SYNC MEMORY [ ( [ sync-stat-list ] ) ]
問合せ組込 関数
NUM_IMAGES()
全image 個数を返
THIS_IMAGE([ COARRAY [ ,DIM ]])
THIS_IMAGE() 場合,自image image番号を返
THIS_IMAGE(COARRAY [,
DIM]) 場合,引数COARRAY image
構成 関 ,自image 座標 (引数DIMを指定 た場合,
DIM 次元目 )を返
LCOBOUND, UCOBOUND(COARRAY [ ,DIM ] [ ,KIND ])
引数COARRAY image構成 関 ,cobound 下限,上限
を(引数
DIMを指定 た場合,
DIM次元目 ) 返
IMAGE_INDEX(COARRAY, SUB)
引数COARRAY ,引数SUB 指定さ たcosubscript 対応
image 番号を返
17 © Nどで でorporation 201す
coarray 主要 機能 (Fortran 2008)
ータマッ ン
通信
並列処理・同期
coarray 全image上 必 存在
例)
2次元coarray配列a(10,10) 、全image上 存在real, save :: a(10,10)[*]
基本的 代入文 形 書く(片側通信・手動)
例)
image 2上 bを、image 1上 b 代入b[1] = b[2]
各image 独立し 動作し、image間 処理 手動
そ 他
問合せ組込 手続 : THIS_IMAGE, NUM_IMAGES 等atomic ーチン : ATOMIC_REF, ATOMIC_DEFINE
同期: SYNC ALL文, SYNC IMAGES文 操作 完了: SYNC MEMORY文
1 image毎 実行: CRITICAL構文
ッ ・ ッ 解除: LOCK文, UNLOCK文
姫野ベンチMPI版coarray化 要点(1)
▌ 宣言・割付け等
real(4),dimension(:,:,:),allocatable::p real(4) :: gosa
:
! 3次元 構成 生成
call mpi_cart_create(icomm,ndims,idm,& ipd,ir,mpi_comm_cart,ierr)
! 自 座標 取得
call mpi_cart_get(mpi_comm_cart, & ndims, idm, ipd, iop, ierr) :
! 各 各次元 ータ イ
imax= mx2(iop(1)) jmax= my2(iop(2)) kmax= mz2(iop(3))
! 各 各次元 割付け イ
mimax= imax + 1 mjmax= jmax + 1 mkmax= kmax + 1 :
allocate(p(mimax,mjmax,mkmax)) ! 割付け
real(4),dimension(:,:,:),allocatable::p[:,:,:] real(4),allocatable,CODIMENSION[:,:,:]::gosa
! 各image 各次元 割付け イ
mimax= maxval(mx2(0:ndx-1)) + 1 mjmax= maxval(my2(0:ndy-1)) + 1 mkmax= maxval(mz2(0:ndz-1)) + 1 :
! 3次元 image構成 割 付け
allocate(p(mimax,mjmax,mkmax)[ndx,ndy,*]) allocate(gosa[ndx,ndy,*])
! 自image 座標 取得(3次元構成)
iop(:) = THIS_IMAGE(p)
! 各image 各次元 ータ イ
imax= mx2(iop(1)-1) jmax= my2(iop(2)-1) kmax= mz2(iop(3)-1)
MPI 場合 coarray 場合
coarray 全 image 同一
イ け
い
ータ イ , い毎 異い
ー 必要 ータ
coarray
19 © Nどで でorporation 201す
姫野ベンチMPI版coarray化 要点(2)
▌ 主要計算部
do loop=1,nn
:
! coarray コ ー gosa = wgosa
SYNC ALL ! 全image 同期 do i=1, NUM_IMAGES()
! 他 image上 gosaを加算
if(THIS_IMAGE() .ne. i)then gosa = gosa + gosa[i] endif
enddo enddo
各image内 閉 た計算 ,そ
大丈夫
集団操作 ,処 理を書 下
通信 , 次ベー 参照
MPI 場合 coarray 場合
do loop=1,nn :
do k=2,kmax-1 do j=2,jmax-1 do i=2,imax-1
s0=a(I,J,K,1)*p(I+1,J,K) & :
wgosa=wgosa+ss*ss
wrk2(I,J,K)=p(I,J,K)+omega*ss enddo
enddo enddo
p(2:imax-1,2:jmax-1,2:kmax-1)= & wrk2(2:imax-1,2:jmax-1,2:kmax-1)
call sendp(ndx,ndy,ndz)
call mpi_allreduce(wgosa,gosa,1,mpi_real4,& mpi_sum,mpi_comm_world,ierr) enddo
姫野ベンチMPI版coarray化 要点(3)
▌ 通信(1次元目方向 例)
MPI 場合
coarray 場合
! 派生 ータ型 作成
call mpi_type_vector(jmax*kmax,1,mimax,& mpi_real4,jkvec,ierr)
! 派生 ータ型 登録
call mpi_type_commit(jkvec,ierr)
通信 1
次元 目
2次元目
image [i-1,j,k]
上 ッ
! 派生 ータ型 通信
call mpi_isend(p(2,1,1),1,jkvec,npx(1),1& , mpi_comm_cart,ireq(0),ierr)
SYNC ALL if(ndx > 1)then
if(iop(1).ne.1) p(imax, :jmax, :kmax)[iop(1)-1,iop(2),iop(3)] = p(2, :jmax, :kmax) ! 1次元目下側 if(iop(1).ne.ndx)p(1, :jmax, :kmax)[iop(1)+1,iop(2),iop(3)] = p(imax-1, :jmax, :kmax) ! 1次元目上側 endif
ータ型 や 上 ッ 処理系 知
い ,利用者 部分配列 代入文 書け (効率 く転送 う 別 話)
MPI_PROC_NULL う 特殊 指定 い , 端 imageを除外 必要 あ
ータ型や 上 ッ 指定 必要( ッ ッ 方法 あ )
配列 1-2次元平面 断面図
image [i,j,k]
21 © Nどで でorporation 201す
次期Fortran規格 (Fortran 2015)
▌ 2018 年 7 月リリース予定
▌ 大 機能拡張 行わ い
並列処理機能 拡張(coarray 拡張) (TS 18508)
C 相互利用可能性 拡張 (TS 29113)
Fortran 2008 問題点・矛盾点を修正
並列処理機能 拡張
▌ タ 並列
▌ 片方向同期
▌ collective ーチン
▌ atomic ーチン 追加
▌ ォー ン 機能
23 © Nどで でorporation 201す
タ 並列(1)
▌ team
image 部分集合
image 番号 ,各 team 内 1~ image 個数 値を
基本的 , 現在 team 全 image あ う 実行さ
team 識別子
team 番号 ( 兄弟間 )
•利用者 指定し 整数値
team 変数 ( 先祖 親子間 )
•型TEAM_TYPE カラ変数(値を設定す 処理系)
•型TEAM_TYPE ,組込みモ ルISO_FORTRAN_ENV中 定義さ い
image image image image
image番号 1 2 1 2
image image image image
image番号 1 2 3 4
team 1 team 2
タ 並列(2)
▌ FORM TEAM 文: teamへ 分割
image image image image image image image image
1 2 3 4
FORM TEAM ( team 番号, team変数 [ , form-team-spec-list ] )
カラ整数式 (n) ,各 image 所属す
team番号を指定す
•MPI_Comm_split 引数color 相当す
team変数
(t) 自 image 所属す team 情報 処理系 設定さ
•MPI_Comm_split 引数newcomm 相当す
NEW_INDEX=
カラ整数式を指定す , team 内 自 image image 番号
を指定 (省略し 場合 ,処理系依存 値 )
use, intrinsic:: ISO_FORTRAN_ENV type(TEAM_TYPE) :: t
n = (THIS_IMAGE()-1) / 2 +1 i = mod(THIS_IMAGE()-1,2) + 1 FORM TEAM(n, t, NEW_INDEX=i)
image番号 1 2 1 2
例
team 1 team 2
25 © Nどで でorporation 201す
タ 並列(3)
▌ CHANGE TEAM 構文: 現在 team を変更
各image ,自身 属 現在 team 全image あ
う ,他 team 独立し 処理を行う
CHANGE TEAM ( team 変数 [ , coarray-association-list ] [ , sync-stat-list ] )
実行文 列
END TEAM [ (sync-stat-list) ]
program main
use, intrinsi :: ISO_FORTRAN_ENV type(TEAM_TYPE) :: t
n = (THIS_IMAGE()-1) / 2 +1 i = mod(THIS_IMAGE()-1,2) + 1 FORM TEAM(n, t, NEW_INDEX=i) ! 現在 team ,全image
CHANGE TEAM(t) ! team t内 同期
:
! 現在 team t (team 1 or team 2)
:
END TEAM ! team t内 同期
例
image image image image image image image image
1 2 1 2
team 1 team 2
1 2 3 4
t t
タ 並列(4) team毎 異 処理を
▌ 組込 関数TEAM_NUMBER
image image image image
TEAM_NUMBER([ team 変数 ])
team変数
対応 team 番号を返
team変数
が省略された場合,自image 現在 team team番号
use, intrinsic :: ISO_FORTRAN_ENV type(TEAM_TYPE) :: t
n = (THIS_IMAGE()-1) / 2 +1 i = mod(THIS_IMAGE()-1,2) + 1 FORM TEAM(n, t, NEW_INDEX=i) CHANGE TEAM(t)
! 現在 team ,t
select case (TEAM_NUMBER()) case(1)
call compute_land() case(2)
call compute_ocean() end select
END TEAM
1 2 1 2
例
team 1 team 2
image image image image
1 2 3 4
t t
27 © Nどで でorporation 201す
タ 並列(5)
▌ image selector : 他 team coarray 参照
[ スカラ整数式-list [ , team 識別子 ] [ , STAT= 整数型スカラ変数 ] ]
•team識別子
,
TEAM_NUMBER=team番号又
TEAM=team変数use, intrinsic :: ISO_FORTRAN_ENV real, save :: a[*]
type(TEAM_TYPE) :: t1, t2 :
CHANGE TEAM(t1) ! 現在 team t1
b = a[1] ! team t1 a[1] CHANGE TEAM(t2) ! 現在 team t2
b = a[1] ! team t2 a[1] c = a[1, TEAM=t1 ] ! team t1 a[1] END TEAM
END TEAM
例
team識別子
を指定し い場合,現在 team け image番号
team番号
,兄弟team
team番号を指定する
team変数
,現在 team 又 祖先 team
team変数を指定
image image
a[1] a[2]
t0
1 2 3 4
image image
t1
1 2
image
1
image
1
t2 t2
image image image image
image
1 a[3] a[4]
t1
1 2
image
1
t2 t2
タ 並列(6)
▌ image 構成 再定義
CHANGE TEAM 文中 ,coarray 別名 codimensionを指定
,image構成を変更
program main
use, intrinsic :: ISO_FORTRAN_ENV real,save :: a[2, *]
type(TEAM_TYPE) :: t1
i = THIS_IMAGE(a, 1) ! 1次元目 cosubscript
n= THIS_IMAGE(a,2) ! 2次元目 cosubscript FORM TEAM(n,t1,NEW_INDEX=i) ! 各列 CHANGE TEAM(t1, aa[*] =>a)
b = a[1,1] ! team t1 a[1,1] c = aa[1] ! team t1 aa[1] END TEAM
例
image 1
t1
t0
t1
image 2
a[2,1]
image 3
a[1,2]
image 4
a[2,2]
image 1
image 2
image 1
image 2
a[1,1]
=>a[1,1] aa[1]
aa[2]
aa[1]
aa[2]
=>a[2,1]
=>a[1,1]
=>a[2,1]
29 © Nどで でorporation 201す
タ 並列(7)
▌ SYNC TEAM 文
指定し team 全image 同期を取
image image image image image image image image
1 2 3 4
SYNC TEAM ( team 変数 [ , sync-stat-list ] )
親 team t0 内 同期を
SYNC ALL 文 同期範囲拡張版
use, intrinsic :: ISO_FORTRAN_ENV type(TEAM_TYPE) :: t0, t1 :
FORM TEAM(n, t1, NEW_INDEX=i) :
CHANGE TEAM(t1) :
SYNC TEAM(t0) ! team t0 同期
image番号 1 2 1 2
例
同期
t0
t1 t1
問合せ組込 関数 拡張
IMAGE_INDEX(COARRAY, SUB [ , team 変数 又 team 番号 ] )
• team変数
又
team番号指定さ たteam (省略時 現在
team) け ,引数COARRAY ,引数SUB 指定さ た
cosubscript 対応 image 番号を返
NUM_IMAGES( [ team 変数 又 team 番号 ] )
• team 変数 又 team番号 指定さ たteam (省略時 現在
team) け ,全image 個数を返
THIS_IMAGE([ COARRAY [ , DIM ]] [ , team 変数 ])
• THIS_IMAGE( [
team変数] ) 場合,
team変数指定さ たteam (省
略時 現在 team) け ,自image image番号を返
• THIS_IMAGE(COARRAY [
, DIM] [
, team変数] ) 場合,
team変数指定
さ たteam (省略時 現在 team) け ,引数COARRAY
image 構成 関 , 自image 座標 (引数
DIMを指定 た
場合,
DIM次元目 ) を返
31 © Nどで でorporation 201す
片方向同期(1)
▌ image P ータを設定 ,image Q そ を使
用 う 場合
image Q ,image P 設定処理 完了を待
image P ,image Q 処理を待 必要 い
event 変数 を使用し 同期を行う
型 EVENT_TYPE coarray カラ変数
型EVENT_TYPE ,組込みモ ルISO_FORTRAN_ENV中 定義さ い
同期 ,待 側 image 上 event 変数 を使用す
event 変数 ,成分 event 数を持
event 数 初期値 0
組込み ル チン EVENT_QUERY(event 変数 , COUNT [
, STAT]) event
数を問合せ可能
image P image Q
e[2]
通知 待
event 数++
event 数 閾値以上 待
片方向同期(2)
▌ EVENT POST 文 : 通知
event 変数 event数をatomic 1増や
EVENT POST ( event 変数 [ , sync-stat-list ] )
33 © Nどで でorporation 201す
片方向同期(3)
▌ EVENT WAIT 文 : 待ち
EVENT WAIT ( event 変数 [ , wait-spec-list ] )
wait-spec
,
UNTIL_COUNT=スカラ整数式閾値を指定可能
event 数 閾値以上 迄待 ,値を atomic 閾値分
け減 す
UNTIL_COUNT= カラ整数式
を省略し 場合,閾値 1
自 image 上 coarray event 変数 を指定す
use,intrinsic::ISO_FORTRAN_ENV type(EVENT_TYPE) :: e[*] real a[*]
:
if(THIS_IMAGE().eq.1)then a[2] = b ! a 値を設定 EVENT POST(e[2])
else
EVENT WAIT(e)
call calc(a) ! a 値を引用 endif
例
image 2 image 1
b a[2]
変数aを引用
segment A
segment B
e[2]
• segment B
segment A
実行後 実行
EVENT POST(e[2])
さ
EVENT WAIT(e)
collective ーチン
▌ ー
CO_BROADCAST(A,SOURCE_IMAGE [ ,STAT ] [ ,ERRMSG ] )
image SOURCE_IMAGE 上 変数A 値を,現在 team 全
image 上 コピー (MPI_Bcast 同様)
▌ 集計計算
CO_SUM(A [ ,RESULT_IMAGE ] [ ,STAT ] [ ,ERRMSG ] )
現在 team内 全image上 、引数A 値 総和を計算
引数RESULT_IMAGEを指定し 場合,結果 image RESULT_IMAGE上
引数A け 代入さ (MPI_Reduce 同様)
引数RESUT_IMAGEを省略し 場合,結果 現在 team 全image上
引数A 代入さ (MPI_Allreduce 同様)
CO_MAX, CO_MIN あ
CO_REDUCE(A, OPERATOR [ ,RESULT_IMAGE ] [ ,STAT ] [ ,ERRMSG ])
引数OPERATOR ,二 カ 引数を 純粋要素別処理関
数を指定
可換 結合則 成 立 関数 け い35 © Nどで でorporation 201す
coarray 主要 機能 (Fortran 2015)
ータマッ ン
通信
並列処理・同期
coarray 割付け時 team 全image上 必 存在
例)
2次元coarray配列a(10,10) 、全image上 存在real, save :: a(10,10)[*]
基本的 代入文 形 書く(片側通信・手動)
例)
team t image 2上 bを、image 1上 b 代入b[1] = b[2, TEAM=t ]
各image 独立し 動作し、image間 処理 手動
そ 他
問合せ組込 手続 : THIS_IMAGE, NUM_IMAGES 等collective ーチン: CO_SUM, CO_BROADCAST 等 atomic ーチン : ATOMIC_REF, ATOMIC_DEFINE 等 タ 並列: FORM TEAM文, CHANGE TEAM構文
同期: SYNC TEAM文, SYNC ALL文, SYNC IMAGES文 片方向同期: EVENT POST文, EVENT WAIT文
操作 完了: SYNC MEMORY文 1 image毎 実行: CRITICAL構文
ッ ・ ッ 解除: LOCK文, UNLOCK文