kpccl_shm_comm_create
创建kpccl comm。
接口定义
int kpccl_shm_comm_create(int size, int rank, int pid, kpccl_shm_oob_allgather_cb_t oob_allgather
kpccl_shm_oob_cb_h oob_cbs
, void *group, kpccl_shm_comm_h *comm);
参数
参数名 |
类型 |
描述 |
输入/输出 |
|---|---|---|---|
size |
int |
需要创建的kpccl通信域大小 |
输入 |
rank |
int |
当前进程的进程号 |
输入 |
pid |
int |
当前进程的pid |
输入 |
oob_cbs |
kpccl_shm_oob_cb_h |
带外函数指针 |
输入 |
group |
void * |
带外函数指针依赖的参数 |
输入 |
comm |
kpccl_shm_comm_h |
需要创建的kpccl通信域 |
输出 |
返回值
- 成功:返回KPCCL_OK
- 失败:返回KPCCL_ERROR
示例
#include <stdio.h>
#include <mpi.h>
#include "kpccl.h"
int oob_allgather_callback(const void *sendbuf, void *recvbuf, int size, void *group,kpccl_shm_datatype_t datatype)
{
switch (datatype) {
case KPCCL_SHM_DATATYPE_CHAR:
return MPI_Allgather(sendbuf, size, MPI_CHAR, recvbuf, size, MPI_CHAR, (MPI_Comm)group);
case KPCCL_SHM_DATATYPE_INT:
return MPI_Allgather(sendbuf, size, MPI_INT, recvbuf, size, MPI_INT, (MPI_Comm)group);
case KPCCL_SHM_DATATYPE_LONG:
return MPI_Allgather(sendbuf, size, MPI_LONG, recvbuf, size, MPI_LONG, (MPI_Comm)group);
case KPCCL_SHM_DATATYPE_FLOAT:
return MPI_Allgather(sendbuf, size, MPI_FLOAT, recvbuf, size, MPI_FLOAT, (MPI_Comm)group);
case KPCCL_SHM_DATATYPE_DOUBLE:
return MPI_Allgather(sendbuf, size, MPI_DOUBLE, recvbuf, size, MPI_DOUBLE, (MPI_Comm)group);
default:
kpccl_error("not support datatype");
return KPCCL_ERROR;
}
}
int oob_barrier_callback(void *group)
{
return MPI_Barrier((MPI_Comm)group);
}
int main()
{
int myid, numprocs;
MPI_Comm comm = MPI_COMM_WORLD;
MPI_Comm_size(comm, &numprocs);
MPI_Comm_rank(comm, &myid);
kpccl_shm_oob_cb_t oob_cbs;
kpccl_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;
kpccl_shm_comm_h kpccl_comm;
kpccl_shm_comm_create(numprocs, myid, myid, oob_cbs_h , (void *)comm, &kpccl_comm);
kpccl_shm_comm_destroy(kpccl_comm);
}
上述示例演示了创建、清理一个kpccl comm的流程。kpccl_shm_comm_create函数创建了一个kpccl comm。
父主题: 共享内存通信函数