接下來介紹的是核心API在執行屏障時的調用操作:
與其他的屏障實作不同,GASNet中的同步實作是“分階段”且支援可選的id比對。
GASNet的分階段屏障特性在gasnet_barrier_wait的規範描述中非常明顯,其描述為“這是一個隻有在所有節點調用gasnet_barrier_notify()函數完成後傳回的阻塞操作”。簡而言之,假設“notify”遞增一個到達計數器,則“wait”将一直處于阻塞狀态直至計數器與任務大小相等。gasnet_barrier_try函數同樣需要滿足上述條件,但是如果未能滿足,則會立即傳回GASNET_ERROR_NOT_READY的值。完成屏障操作無論使用的是“wait”還是“try”函數,在初始化與完成之間執行大部分GASNet操作都是合法的。
屏障函數中的id和flags參數實作了屏障過程可選比對。這部分内容建議讀者仔細閱讀規範手冊,這裡列舉了兩個易于了解的使用者示例:
異步屏障
最簡單的情況是不使用id比對支援。在本例中,通過flags參數将GASNET_ BARRIERFLAG_ANONYMOUS常量傳遞給同步函數。任何數值都能以id參數傳遞(一般為0),是以可以忽略。
命名屏障
充分使用id邏輯比對時最簡單的情況是所有調用者間具有相等整型參數的阻塞(與分階段相反)屏障。
GASNet的分階段屏障存在一些不太明顯的使用限制。為了簡化叙述,這裡将成功的“try”等價于“wait”操作。第一個限制最為直覺,即必須在“notify”與“wait”之間交替使用以確定屏障操作不會互相重疊。第二個限制是在GASNET_PARSYNC或GASNET_PAR編譯中,“notify”和“wait”操作在每個節點上隻執行一次(用戶端可以自由選擇執行的線程,且不必為兩個階段選擇同一線程)。第三個限制是前兩個限制潛在的可能産生的後果:在GASNET_PAR編譯時,用戶端必須保證在任何時刻都至多有一個用戶端線程處于屏障過程中。