1. global_array原理
把多个节点的分立内存统一编址从而成为一个整体大内存,对用户透明,底层则通过网络发送和接收所需数据,需要和MPI一起使用。大致过程如下:
初始化: MPI_Init(&argc, &argv); GA_Initialize(); int id = GA_Nodeid(); int n = GA_Nnodes();
创建共享内存:NGA_Create64(C_CHAR, ndim, dims, "handle", chunk);参数分别为元素类型、维数、代表内存大小的数组、内存区域名称和chunk,返回值是int类型的句柄;
从共享内存中取数据:NGA_Get64(handle, low, high, buf, NULL); 参数分别为标识内存的句柄、索引的上限和下限、取出的数据放入本地的buf;
往共享内存中放数据:NGA_Put64(handle, low, high, buf, NULL);参数同上,只是共享内存到buf的方向不同;
结束:GA_Destroy(handle); GA_Terminate(); MPI_Finalize()。
2. 如何解决现有程序内存瓶颈问题
一般利用global_array都是为了解决单个节点内存不足的问题,所以需要多个节点共享内存。这就不可避免的需要多进程,我们是要在已有的串行代码基础上改,为了不改变程序的逻辑,理想情况是主进程干活,其他进程只把所在节点的内存贡献出来就OK,但为了告诉其他进程要贡献多大的内存,要么其他进程知道context,但这需要其他进程也执行业务逻辑;要么通过mp