errno 14 尝试实现缓冲 MPI_Get 时

问题描述 投票:0回答:1

我尝试实现 MPI_Get 的缓冲版本,因此当一个进程仅从另一个进程获取某些内容时,不需要全局围栏。但是,我收到此错误:

读取 -1,预期 40,errno = 14

我使用 openmpi 版本 4.1.2,并使用 mpirun -n 2 运行下面的程序。

#include <mpi.h>
#include <stdlib.h>
#include <stdint.h>
#include <sys/mman.h>

void *ptr;
static MPI_Win win;

void setup(size_t maxmem)
{
    if ((ptr = mmap (NULL, maxmem, PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0))
        == (void *)(intptr_t)-1) {
        MPI_Abort(MPI_COMM_WORLD, 1);
    }

   MPI_Win_create (ptr, maxmem, 1, MPI_INFO_NULL, MPI_COMM_WORLD, &win);
}

void bufferedGet(void *origin, size_t count,
    size_t owner_rank, size_t offset)
{
    MPI_Win_lock (MPI_LOCK_SHARED, owner_rank, 0, win);
    MPI_Get (origin, count, MPI_BYTE, owner_rank,
                       offset, count,
                       MPI_BYTE, win);
    MPI_Win_unlock (owner_rank, win);
}

int main(int argc, char **argv)
{
    MPI_Init(&argc, &argv);

    size_t size = 409600;
    setup(size);

    void *result = malloc(10);

    bufferedGet(result, 10, 0, 1);

    free(result);
    MPI_Win_free(&win);
    munmap(ptr, size);

    MPI_Finalize();
}
mpi rdma
1个回答
0
投票

我认为您只是错过了

| PROT_READ
您的
mmap
电话。

© www.soinside.com 2019 - 2024. All rights reserved.