《并行计算的编程模型》一2.3.1 开始和结束

2.3.1 开始和结束

几乎所有编程语言都会有一个类似“Hello,World!”的例子。使用并行语言也希望有能够打印一些关于作业大小和调用进程信息的统计函数。下面是一个2.6.2节中的例子,我们这里引用以介绍核心API的相关部分。

GASNet客户端通过gasnet_init函数进行初始化,该函数包括引用main()函数的标准参数argc和argv。调用gasnet_init函数的任务环境较为模糊(详见使用文档),且不建议用户过多使用任务环境。如果必须要用的话,请在gasnet_init函数调用前使用。然而,在gasnet_init调用后,命令行将清除GASNet内部使用的所有参数,且环境变量将通过gasnet_getenv获取。此外,初始化函数还设置了任务的stdout和stderr。GASNet不对stdin做任何保证。
只有在gasnet_init函数返回后,上述列表中的其他函数才能合法调用。初始化GASNet任务的下一步将调用gasnet_attach函数以分配GASNet的段并保留任务所需的所有网络资源。gasnet_attach的变量赋值给AM处理程序的客户端表,且客户端的段需求如下:
gasnet_handlerentry_t * table
这是一个指向C结构体数组的指针:

fnptr函数作为AM处理程序在相应的整数index上调用。AM处理程序的签名将在2.3.5节讨论。index的128~255值对客户端是可用的,而特殊值0表示可以忽略且将由gasnet_attach的特定值重写。
int numentries
表示句柄条目表中条目的个数。
uintptr_t segsize
GASNet段的所需大小。
其值必须为GASNET_PAGESIZE的倍数,且不大于gasnet_getMaxLocalSegmentSize返回的值。
GASNET_SEGMENT_EVERYTHING可以忽略。
uintptr_t minheapoffset
表示GASNet段与当前堆顶间的最小距离。在包含GASNet段和堆空间竞争的虚拟内存系统上,能够确保分配段后还有剩余空间用于堆分配。虽然不建议使用,但通过0传递是合法的。且所有节点传递的值都是相等的。
GASNET_SEGMENT_EVERYTHING可以忽略。
其中有两个函数用于确定在其他调用中能够请求的段大小。
gasnet_getMaxLocalSegmentSize函数返回GASNet已经确认的且对于调用节点上段可用的最大内存大小,而gasnet_getMaxGLobalSegmentSize函数返回所有本地节点中的最小值。值得注意的是在大多数平台上,GASNet段和堆需要竞争同一空间,这就意味着这些SegmentSize值必须是segsize与minheapoffset之和的最大值。如果客户端找到的可用的段大小小于其要求大小,则将调用gasnet_exit函数终止任务而不是调用gasnet_attach函数。
除了两个段大小查询调用与使用gasnet_getenv函数访问环境变量之外,客户端可以调用gasnet_nodes函数查询任务中的GASNet节点数,以及调用gasnet_mynode函数确定执行当前任务的调用者的进程号(进程号从0开始)。上述调用是由gasnet_init和gasnet_attach函数允许调用的全部函数。其中两个段大小查询函数是在asnet_init和gasnet_attach函数调用时仅有的合法调用函数。
单节点上gasnet_exit调用足以使整个并行任务终止。任何没有同时作为一个或多个调用gasnet_exit函数的节点将可能返回SIGQUIT信号。这时客户端可以方便地注册唯一信号处理程序,因为GASNet保留所有其他内容给内部调用使用。为了避免误触发其机制,客户端在执行正常退出时需要在gasnet_exit函数调用前立即执行同步操作(详见2.3.3节)。

上一篇:C语言入门这一篇就够了,厂长推荐学习


下一篇:【万里征程——Windows App开发】控件大集合2