3.5.2 RMA函数使用
OpenSHMEM API有三种类型的put和get函数:一般、类型和跨步。对RMA的一般put和get函数是类型不可知的,只简单地传输字结块,这两个一般函数对大部分传输都足够用了,但缺乏类型和跨步接口的便利性。OpenSHMEM提供的类型put和get函数操作在连续的原生数据类型块上,函数名指明了位宽或对象类型(因此有20个put和20个get函数指明数据类型或被访问的对象大小)。OpenSHMEM也提供跨步访问函数,允许以指定跨步访问源和目标地址(如数组的每第n个元素)。代码清单3-4、代码清单3-5和代码清单3-6分别描述了一般、类型和跨步put和get函数。
每个函数的前两个参数标识要更新的(target)位置和数据要被拷贝的(source)位置。对put函数,target是远程的(被动端PE),由最后一个参数(pe)标示。source是本地的主动端PE。对get函数,要更新的target位置在本地主动端PE,source在远程被动端PE。值得注意的是虽然在被动端PE标明的位置必须在其对称内存里,但主动端的位置允许在对称或非对称内存。倒数第二个参数len描述要传输的数据量,对一般函数是字节数,对类型和跨步函数是标明的原生类型数目。跨步参数tst和sst分别标明访问目标和源数组的跨步,单位是函数名所标明的类型。当跨步设为1时即为连续传输,与这些函数的类型版本相同。代码清单3-7显示使用get和put进行环形通信的简单示例,注意在这个示例中,唯一需要同步的是在设置self和被另一PE读取之间的同步屏障。