Как исправить MPI_ERR_RMA_SHARED? - PullRequest
0 голосов
/ 19 апреля 2019

Я написал программу MPI, в которой я использую общую память с помощью команды MPI_Win_Allocate_shared, затем запускаю программу на виртуальной машине с 4 процессорами в Azure.Все работает хорошо с 1 или процессами, но не работает с 3 или 4.

Я знаю, что MPI_Win_Allocate_shared работает, только если процессы находятся на одном узле, поэтому я подумал, что проблема связана с этим.Я попытался решить эту проблему с помощью настройки хост-файла "AzureVM slots = 4 max_slots = 8", но все равно получаю ошибку.Я сообщу об ошибке ниже:

mpiexec -np 3 --hostfile my_host --oversubscribe tables

[AzureVM][[37487,1],1][btl_openib_component.c:652:init_one_port] ibv_query_gid failed (mlx4_0:1, 0)

[AzureVM][[37487,1],0][btl_openib_component.c:652:init_one_port] ibv_query_gid failed (mlx4_0:1, 0)

[AzureVM][[37487,1],2][btl_openib_component.c:652:init_one_port] ibv_query_gid failed (mlx4_0:1, 0)

--------------------------------------------------------------------------
WARNING: There was an error initializing an OpenFabrics device.

  Local host:   AzureVM
  Local device: mlx4_0
--------------------------------------------------------------------------

[AzureVM:01918] 2 more processes have sent help message help-mpi-btl-openib.txt / error in device init
[AzureVM:01918] Set MCA parameter "orte_base_help_aggregate" to 0 to see all help / error messages

[AzureVM:1930] *** An error occurred in MPI_Win_allocate_shared
[AzureVM:1930] *** reported by process [2456748033,2]
[AzureVM:1930] *** on communicator MPI_COMM_WORLD
[AzureVM:1930] *** MPI_ERR_RMA_SHARED: Memory cannot be shared
[AzureVM:1930] *** MPI_ERRORS_ARE_FATAL (processes in this communicator will now abort,
[AzureVM:1930] ***    and potentially your MPI job)
[AzureVM:01918] 1 more process has sent help message help-mpi-errors.txt / mpi_errors_are_fatal
Makefile:54: recipe for target 'table' failed
make: *** [table] Error 71

Пожалуйста, кто-то может объяснить мне, как решить проблему ??Заранее спасибо!

1 Ответ

0 голосов
/ 11 мая 2019

Привет, ты решил проблему? Попробуйте добавить эти две строки (после quide )

MPI_Comm nodecomm;                                                          
MPI_Comm_split_type(MPI_COMM_WORLD, MPI_COMM_TYPE_SHARED, 0, MPI_INFO_NULL, &nodecomm);    

А после этого выделять память с помощью

// define alloc_length (sth like: int alloc_length = 10 * sizeof(int);)
MPI_Win win;
MPI_Win_allocate_shared (alloc_length, 1, info, shmcomm, &mem, &win);

У меня была такая же проблема (по крайней мере, похожий журнал ошибок), и я решил ее точно так же, как я описал выше

Чтобы лучше понять, см. это . Я проверил код в конце ответа, выбранного как лучший, и, к сожалению, он не работал для меня. Я изменил это следующим образом:

#include <stdio.h>
#include <mpi.h>

#define ARRAY_LEN 32

int main() {
    MPI_Init(NULL, NULL);

    int * baseptr;
    MPI_Comm nodecomm;
    MPI_Comm_split_type(MPI_COMM_WORLD, MPI_COMM_TYPE_SHARED, 0,
            MPI_INFO_NULL, &nodecomm);

    int nodesize, noderank;
    MPI_Comm_size(nodecomm, &nodesize);
    MPI_Comm_rank(nodecomm, &noderank);

    MPI_Win win;
    int size = (noderank == 0)? ARRAY_LEN * sizeof(int) : 0;
    MPI_Win_allocate_shared(size, 1, MPI_INFO_NULL,
            nodecomm, &baseptr, &win);

    if (noderank != 0) {
        MPI_Aint size;
        int disp_unit;
        MPI_Win_shared_query(win, 0, &size, &disp_unit, &baseptr);
    }

    for (int i = noderank; i < ARRAY_LEN; i += nodesize)
        baseptr[i] = noderank;

    MPI_Barrier(nodecomm);

    if (noderank == 0) {
        for (int i = 0; i < nodesize; i++)
            printf("%4d", baseptr[i]);
        printf("\n");
    }
    MPI_Win_free(&win);

    MPI_Finalize();
}

Теперь, если вы назвали код выше как test.cpp
mpic++ test.cpp && mpirun -n 8 ./a.out выдаст 0 1 2 3 4 5 6 7


Несколько правильных советов, которые я взял с здесь

Удачи!

...