КНЕМ повар ie и заявленный регион - PullRequest
0 голосов
/ 18 января 2020

Первый вопрос: PROT_WRITE и PROT_READ, я нигде не смог найти, и мне трудно компилировать. Я заменил на 0 и 1, но это не похоже на работу.

Во-вторых, "отклонено (готовит несуществующий регион ie)" *

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 отправляет своего повара ie на 1 и 1 переходит в захват данные от 0. Я проверил, что полученный повар ie совпадает с отправленным поваром ie, но ему просто не удалось найти объявленный регион.

1 Ответ

0 голосов
/ 19 января 2020

PROT_READ и PROT_WRITE - флаги mmap, для их получения необходимо включить sys / mman.h. Во второй части кода вам нужно установить copy.src_cook ie для create.cook ie (или просто использовать встроенную копию, чтобы вообще не создавать эту область, поскольку она будет немедленно уничтожена из-за SINGLEUSE флаг). Кроме того, перед продолжением убедитесь, что вы проверили возвращаемые значения всех ioctl. Копирование не может работать, если create.cook ie не был инициализирован из-за сбоя при создании ioctl.

...