Отправка 2 тусклого массива с помощью scatter - PullRequest
0 голосов
/ 20 мая 2010

Я новичок в MPI, и я использую язык C и симулятор для процессоров (MPICH2), я написал следующий код для отправки 2D-массива, чтобы заставить 2 процессора взять строку из него, но при запуске он выдает ошибку MPICH2, код:

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

int main(int argc, char *argv[]) {
    int rank;
    int commsize;

    MPI_Init(&argc, &argv);
    MPI_Comm_size(MPI_COMM_WORLD,&commsize);
    MPI_Comm_rank(MPI_COMM_WORLD,&rank);
    char** name=malloc(2*sizeof(char*));
    int i;

    for(i=0;i<2;i++){
        name[i]=malloc(15*sizeof(char));
    }
    name[0]="name";
    name[1]="age";
    /////////////////////
    if(rank==0) {
        char** mArray=malloc(2*sizeof(char*));
        MPI_Scatter(&name,1,MPI_CHAR,&mArray,1,MPI_CHAR,0,MPI_COMM_WORLD);//send
    }
    else {
        char** mArray=malloc(2*sizeof(char*));
        int k;

        for(k=0;k<2;k++){
            mArray[k]=malloc(15*sizeof(char));
        }
        MPI_Scatter(&mArray,1,MPI_CHAR,&mArray,1,MPI_CHAR,0,MPI_COMM_WORLD);//receive       
        printf("line is %s \n",mArray[rank-1]);
    }
    MPI_Finalize();
}

Ответы [ 2 ]

3 голосов
/ 20 мая 2010
  name[0]="name";

  name[1]="age";

Это не строковая копия. Ну, не так, как вы, наверное, думаете. Вы использовали малое пространство и присвоили ему имя [0] и имя [1], а затем пишете поверх этих указателей с указателями на буквенные строки «имя» и «возраст». Неверные массивы char [15] потеряны (утечка памяти).

Затем, когда вы пытаетесь отправить его с помощью MPI_Scatter, вы фактически отправляете то, на что указывает name, то есть указатель, а не строки. (ниже --> означает, что указывает)

name --> [0x4321, 0x2348]
0x4321 --> "name"
0x2348 --> "age"

Но вы рассеиваете (хотя бы часть) [0x4321, 0x2348], а может и больше.

Я раньше не использовал библиотеку MPI (что я помню), но я подозреваю, что другие ваши аргументы MPI_Scatter также неверны из-за неправильного понимания строк (массивов символов) и указателей.

Я думаю, что если вы сделали:

char name[2][15] = {"name", "age"};

и забыл о вашем malloc в разбросанной части кода, вам было бы легче, хотя много-много раз попытки использования массивов 2d C вас также запутают. Многие вопросы здесь связаны с тем, что люди неправильно понимают разницу между массивами указателей на массивы и двумерными массивами.

0 голосов
/ 20 мая 2010

Как указывает nategoose, все ваши определения строк неверны. Сначала исправьте их, не беспокойтесь о вызовах MPI, пока не сможете printf() их. Более того, Scatter будет работать только в том случае, если строка age следует непосредственно за строкой name в памяти: в противном случае она заполнит вторую часть вашего сообщения мусором (или сгенерирует прямую ошибку) Я не уверен, если

char name[2][15] = {"name", "age"};

помещает две строки рядом друг с другом, или просто помещает два указателя рядом друг с другом, которые указывают в памяти. Если это делает первое, то используйте это. В противном случае я бы порекомендовал вам вообще не использовать 2d-массив, а скорее объявить ваши строки следующим образом:

char[2*15] name = "name";
sprintf(name+15, "age");

Ваши параметры для Scatter также неверны. Первый параметр должен быть name, а не &name: Scatter ожидает указатель, передача &name заставит его попытаться отправить адрес памяти name вместо его содержимого.

Второй и пятый параметры также неверны: вы хотите отправить 30 символов (так как это массив 2 * 15), а не только 1.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...