鲲鹏社区首页
中文
注册
我要评分
文档获取效率
文档正确性
内容完整性
文档易理解
在线提单
论坛求助

kupl_shm_win_query

获取对端进程的共享内存首地址。

接口定义

int kupl_shm_win_query(kupl_shm_win_h win, int remote_rank, void **baseptr);

参数

表1 参数定义

参数名

类型

描述

输入/输出

win

kupl_shm_win_h

用于查询的window对象

输入

remote_rank

int

对端进程的进程号

输入

baseptr

void **

对端进程共享内存块的首地址

输出

返回值

成功:返回KUPL_OK

失败:返回KUPL_ERROR

示例

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
#include <stdio.h>
#include <mpi.h>
#include <unistd.h>
#include <string.h>
#include "kupl.h"
 
// 创建 kupl 通信域需要的回调函数 1
static int oob_barrier_callback(void *group)
{
    return MPI_Barrier((MPI_Comm)group);
}
// 创建 kupl 通信域需要的回调函数 2
static int oob_allgather_callback(const void *sendbuf, void *recvbuf, int size, void *group,
                                  kupl_shm_datatype_t datatype)
{
    switch (datatype) {
        case KUPL_SHM_DATATYPE_CHAR:
            return MPI_Allgather(sendbuf, size, MPI_CHAR, recvbuf, size, MPI_CHAR, (MPI_Comm)group);
        default:
            fprintf(stderr, "not support datatype");
            return KUPL_ERROR;
    }
}
int main(int argc, char *argv[])
{
    // 初始化 MPI 环境
    MPI_Init(&argc, &argv);
    MPI_Comm comm = MPI_COMM_WORLD;
    // 获取 MPI 通信域大小
    int world_size;
    MPI_Comm_size(comm, &world_size);
    // 获取进程 rank 号
    int world_rank;
    MPI_Comm_rank(comm, &world_rank);
    // 获取进程 pid 号
    int pid = getpid();
    // 创建 kupl 通信域
    kupl_shm_oob_cb_t oob_cbs;
    kupl_shm_oob_cb_h oob_cbs_h = &oob_cbs;
    oob_cbs_h->oob_allgather = oob_allgather_callback;
    oob_cbs_h->oob_barrier = oob_barrier_callback;
    kupl_shm_comm_h kupl_comm;
    int ret = kupl_shm_comm_create(world_size, world_rank, pid, oob_cbs_h, (void *)comm, &kupl_comm);
    if (ret != KUPL_OK || kupl_comm == NULL) {
        fprintf(stderr, "kupl shm comm create failed: %d\n", ret);
        return -1;
    }
    // 申请共享内存
    kupl_shm_win_h win;
    void *local_buffer;
    int count = 4;
    size_t buf_size = count * sizeof(int);
    ret = kupl_shm_win_alloc(buf_size, kupl_comm, &local_buffer, &win);
    if (ret != KUPL_OK) {
        fprintf(stderr, "kupl shm win alloc failed: %d\n", ret);
        return -1;
    }
    // 进程 0 对本进程 buffer 赋值
    if (world_rank == 0) {
        for (int i = 0; i < count; i++) {
            ((int *)local_buffer)[i] = i;
        }
    }
    // 所有其他进程获取进程 0 的 buffer,进行 memcpy
    if (world_rank != 0) {
        void *remote_buffer;
        int remote_rank = 0;
        kupl_shm_win_query(win, remote_rank, &remote_buffer);
        memcpy(local_buffer, remote_buffer, buf_size);
        // 检查是否成功 memcpy
        bool check = true;
        for (int i = 0; i < count; i++) {
            if (((int *)local_buffer)[i] != i) {
                check = false;
                break;
            }
        }
        if (check) {
            printf("check success\n");
        } else {
            printf("check fail\n");
        }
    }
    // 销毁共享内存
    kupl_shm_win_free(win);
    // 销毁 kupl 通信域
    kupl_shm_comm_destroy(kupl_comm);
    MPI_Finalize();
    return 0;
}

运行结果如下。

check success

上述示例演示了创建、查询、清理一个kupl win的流程。kupl_shm_win_query函数用于获取对端进程的共享内存首地址。