首页 > 解决方案 > KNEM cookie 和声明的区域

问题描述

第一个问题是 PROT_WRITE 和 PROT_READ 我无法在任何地方找到,这让我很难编译。我用 0 和 1 替换,但它似乎不起作用。

二、“rejected(不存在的区域cookie)”

int rank;
MPI_Init( &argc, &argv );
MPI_Comm_rank( MPI_COMM_WORLD, &rank );
MPI_Win win;
int knem_fd = open("/dev/knem", O_RDWR);
int err;
uint64_t size = 64;

if( rank == 0 ){
    char *inbuf = malloc(size);
    for( int i = 0; i < size; i++ )
        inbuf[i] = rand() % 26 + 97;

    print_array( inbuf, size, '0' );

    struct knem_cmd_create_region create;
    struct knem_cmd_param_iovec knem_iov[1];

    knem_iov[0].base = (uint64_t)&inbuf;
    knem_iov[0].len = size;

    create.iovec_array = (uintptr_t) &knem_iov[0];
    create.iovec_nr = 1;
    create.flags = KNEM_FLAG_SINGLEUSE;
    //create.protection = 1;
    err = ioctl( knem_fd, KNEM_CMD_CREATE_REGION, &create );

    MPI_Send( &(create.cookie), 1, MPI_UINT64_T, 1, 0, MPI_COMM_WORLD );
    MPI_Barrier( MPI_COMM_WORLD );

} else if( rank == 1 ){
    char *obuf = malloc(size);
    int err;

    struct knem_cmd_copy copy;
    struct knem_cmd_create_region create;
    struct knem_cmd_param_iovec knem_iov[1];

    knem_iov[0].base = (uint64_t)&obuf;
    knem_iov[0].len = size;

    create.iovec_array = (uintptr_t) &knem_iov[0];
    create.iovec_nr = 1;
    //create.protection = 0;
    create.flags = KNEM_FLAG_SINGLEUSE;

    err = ioctl( knem_fd, KNEM_CMD_CREATE_REGION, &create );

    MPI_Recv( &(copy.src_cookie), 1, MPI_UINT64_T, 0, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE );

    copy.src_offset = 0;
    copy.dst_cookie = create.cookie;
    copy.dst_offset = 0;
    copy.flags = 0;
    err = ioctl(knem_fd, KNEM_CMD_COPY, &copy);

    print_array( obuf, size, '1' );
    MPI_Barrier( MPI_COMM_WORLD );
}

0 和 1 都创建了一个区域,0 将其 cookie 发送到 1,1 从 0 获取数据。我检查了接收到的 cookie 与发送 cookie 相同,但它只是找不到声明的区域。

标签: linux-kernel

解决方案


PROT_READ 和 PROT_WRITE 是 mmap 标志,您需要包含 sys/mman.h 才能获取它们。在代码的第二部分,您需要将 copy.src_cookie 设置为 create.cookie(或者只使用内联副本来完全避免创建该区域,因为它会因为 SINGLEUSE 标志而立即被销毁)。此外,请确保在继续之前检查所有 ioctl 的返回值。如果由于 create ioctl 失败而未初始化 create.cookie,则无法复制。


推荐阅读