我尝试实现 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();
}
我认为您只是错过了
| PROT_READ
您的 mmap
电话。