global array相关

来源:互联网 发布:怎么禁止电脑休眠mac 编辑:程序博客网 时间:2024/05/17 06:18

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,但这需要其他进程也执行业务逻辑;要么通过mpi发送接收创建内存的参数,开销比较大。所以我们在程序的最开始,根据num_proc和每个节点最大能贡献的内存(不是全部内存,还要预留一定空间给上面说的buf使用)申请一块很大的内存,然后已有代码中所有大内存申请的地方全部改为从这块大内存中申请,由我们管理这块内存的使用。

3. 第三方的.c文件如何加入现有程序

        *.h文件中,声明函数定义,使用extern声明变量,不赋值;

        *.c文件中,包含*.h头文件,给上述变量赋值,给出上述函数的具体实现。

        其他代码使用时,包含*.h头文件即可。

4. makefile如何写

        以今天的程序为例,共有三个文件:global_array.h,global_array.c,testGA.c。

        test: testGA.o global_array.o
        (Tab)mpicc -o test testGA.o global_array.o -lga -lgfortran

        testGA.o: testGA.c global_array.h
        (Tab)mpicc -c testGA.c -std=c99

        global_array.o: global_array.c global_array.h
        (Tab)mpicc -c global_array.c -std=c99

原创粉丝点击