linux-kernel - 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, ©);
print_array( obuf, size, '1' );
MPI_Barrier( MPI_COMM_WORLD );
}
0 和 1 都创建了一个区域,0 将其 cookie 发送到 1,1 从 0 获取数据。我检查了接收到的 cookie 与发送 cookie 相同,但它只是找不到声明的区域。
解决方案
PROT_READ 和 PROT_WRITE 是 mmap 标志,您需要包含 sys/mman.h 才能获取它们。在代码的第二部分,您需要将 copy.src_cookie 设置为 create.cookie(或者只使用内联副本来完全避免创建该区域,因为它会因为 SINGLEUSE 标志而立即被销毁)。此外,请确保在继续之前检查所有 ioctl 的返回值。如果由于 create ioctl 失败而未初始化 create.cookie,则无法复制。
推荐阅读
- python - I need to read 100000 lines of a txt file and add each line into a array
- c++ - std::stringstream::flush() 应该做任何事情吗?
- javascript - 使用 forEach 将 100 添加到可被 3 整除的数组值
- javascript - Can someone help me understand the output of the following code?
- flutter - 在 Flutter 中首次重新加载应用程序时获取旧 UI
- angular - Access FormControl inside custom Angular Component
- javascript - 在没有提交表单jsp的情况下使用表单中的按钮
- c++ - 如何将列表从一个班级复制到另一个班级
- mysql - SQL Delete Erro #1064
- java - Why does binding a TextField to a property which is being updated on another thread end up with the application throwing errors?