включите mpif.h, ошибка c2015 слишком много символов в константе - PullRequest
0 голосов
/ 05 июля 2019

Я пытаюсь протестировать код из примера общей памяти MPI из stackoverflow ( Общая память MPI-3 для структуры массива ). Здесь я опубликую весь код в качестве минимально воспроизводимого примера.

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

typedef struct MyArray {
    double* data;
    int length;
}MyArray;

#define ARRAY_SIZE 10

int main(int argc, char *argv[]) {
    int rank, worldSize, i;
    MPI_Win win;
    MPI_Aint disp;
    MPI_Aint *allProcessDisp;
    MPI_Request *requestArray;

    MyArray myArray;

    MPI_Init(&argc, &argv);
    MPI_Comm_rank(MPI_COMM_WORLD, &rank);
    MPI_Comm_size(MPI_COMM_WORLD, &worldSize);

    MPI_Win_create_dynamic(MPI_INFO_NULL, MPI_COMM_WORLD, &win);

    allProcessDisp = malloc(sizeof(MPI_Aint) * worldSize);

    requestArray = malloc(sizeof(MPI_Request) * worldSize);
    for (i = 0; i < worldSize; i++) 
        requestArray[i] = MPI_REQUEST_NULL;

    myArray.data = malloc(sizeof(double) * ARRAY_SIZE);
    myArray.length = ARRAY_SIZE;

    //Allocating memory for each process share window space 
    MPI_Alloc_mem(sizeof(double) * ARRAY_SIZE, MPI_INFO_NULL, &myArray.data);
    for (i = 0; i < ARRAY_SIZE; i++)
        myArray.data[i] = rank;

    //attach the allocating memory to each process share window space 
    MPI_Win_attach(win, myArray.data, sizeof(double) * ARRAY_SIZE);

    MPI_Get_address(myArray.data, &disp);

    if (rank == 0) {
        allProcessDisp[0] = disp;
        //Collect all displacements
        for (i = 1; i < worldSize; i++) {
            MPI_Irecv(&allProcessDisp[i], 1, MPI_AINT, i, 0, MPI_COMM_WORLD, &requestArray[i]);
        }
        MPI_Waitall(worldSize, requestArray, MPI_STATUS_IGNORE);
        MPI_Bcast(allProcessDisp, worldSize, MPI_AINT, 0, MPI_COMM_WORLD);
    }
    else {
        //send displacement 
        MPI_Send(&disp, 1, MPI_AINT, 0, 0, MPI_COMM_WORLD);
        MPI_Bcast(allProcessDisp, worldSize, MPI_AINT, 0, MPI_COMM_WORLD);
    }

    // here you can do RMA operations 
    // Each time you need an RMA operation you start with 
    double otherRankData = -1.0;
    int otherRank = 1;
    if (rank == 0) {
        MPI_Win_lock_all(0, win);
        MPI_Get(&otherRankData, 1, MPI_DOUBLE, otherRank, allProcessDisp[otherRank], 1, MPI_DOUBLE, win);
        // and end with 
        MPI_Win_unlock_all(win);
        printf("Rank 0 : Got %.2f from %d\n", otherRankData, otherRank);
    }

    if (rank == 1) {
        MPI_Win_lock_all(0, win);
        MPI_Put(myArray.data, ARRAY_SIZE, MPI_DOUBLE, 0, allProcessDisp[0], ARRAY_SIZE, MPI_DOUBLE, win);
        // and end with 
        MPI_Win_unlock_all(win);
    }

    printf("Rank %d: ", rank);
    for (i = 0; i < ARRAY_SIZE; i++)
        printf("%.2f ", myArray.data[i]);
    printf("\n");

    //set rank 0 array
    if (rank == 0) {
        for (i = 0; i < ARRAY_SIZE; i++)
            myArray.data[i] = -1.0;

        printf("Rank %d: ", rank);
        for (i = 0; i < ARRAY_SIZE; i++)
            printf("%.2f ", myArray.data[i]);
        printf("\n");
    }

    free(allProcessDisp);
    free(requestArray);
    free(myArray.data);

    MPI_Win_detach(win, myArray.data);
    MPI_Win_free(&win);
    MPI_Finalize();

    return 0;
}

Я использую распространяемый пакет MS-MPI для Visual Studio C ++ 2012 и HPC Pack 2012. При компиляции выдает ошибку

error C3861: 'MPI_Win_attach': identifier not found
error C3861: 'MPI_Win_lock_all': identifier not found
error C3861: 'MPI_Win_unlock_all': identifier not found
error C3861: 'MPI_Win_lock_all': identifier not found
error C3861: 'MPI_Win_unlock_all': identifier not found
error C3861: 'MPI_Win_detach': identifier not found

Я ищу ссылку на MS MPI (https://docs.microsoft.com/en-us/message-passing-interface/mpi-win-attach-function), и, похоже, также нужен mpif.h Когда я использую

#include "mpif.h"

В нем много ошибок, таких как

Error   51  error C2015: too many characters in constant

Чтобы более подробно рассмотреть ошибку в mpif.h, она выглядит примерно так

   INTEGER MPI_OFFSET
   PARAMETER (MPI_OFFSET=z'4c00083c')
   INTEGER MPI_COUNT
   PARAMETER (MPI_COUNT=z'4c00083d')
   INTEGER MPI_FLOAT_INT
   PARAMETER (MPI_FLOAT_INT=z'8c000000')
   INTEGER MPI_DOUBLE_INT
   PARAMETER (MPI_DOUBLE_INT=z'8c000001')
   INTEGER MPI_LONG_INT
   PARAMETER (MPI_LONG_INT=z'8c000002')
   INTEGER MPI_SHORT_INT
   PARAMETER (MPI_SHORT_INT=z'8c000003')
   INTEGER MPI_LONG_DOUBLE_INT
   PARAMETER (MPI_LONG_DOUBLE_INT=z'8c000004')

Я думаю, что я не должен менять 'на' для mpif.h, поскольку это заголовок библиотеки. Есть ли какой-нибудь способ подавить эту ошибку компиляции и заставить ее работать? Спасибо.

1 Ответ

0 голосов
/ 08 июля 2019

@ Зулан прав насчет того, что mpif.h для Фортрана. Поэтому не может включать mpif.h.

Проблема, похоже, в версии программы MS MPI. Я обновляю MS MPI SDK с 9.0 до 10.0 (https://www.microsoft.com/en-us/download/details.aspx?id=57467), и проблема решена.

...