2017-02-01 6 views
0

Я пытаюсь написать код MPI C, который многократно выполняет вычисления и сохраняет его результат в один массив для вывода менее часто. Пример кода ниже (размер вар, 200, достаточно для числа процессоров в использовании):Ошибка утверждения при использовании MPI_Gather

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

int main(int argc, char **argv){ 

float *phie, *phitemp, var[200]; 
int time=0, gatherphi=10, gatherfile = 200, j, iter=0, lephie, x; 
int nelecrank = 2, size, rank, Tmax = 2000; 
FILE *out; 

MPI_Init(&argc, &argv) ; 

MPI_Comm_size(MPI_COMM_WORLD, &size); 
MPI_Comm_rank(MPI_COMM_WORLD, &rank); 

lephie = gatherfile/gatherphi; // number of runs of calculation before output 

// allocate memory 
//printf("%d Before malloc.\n", rank); 
if (rank==1) phie=(float *) malloc(nelecrank*size*gatherfile/gatherphi*sizeof(float)); 
phitemp=(float *) malloc(nelecrank*sizeof(float)); 
//printf("%d After malloc.\n", rank); 

for(j=0;j<200;j++) var[j]=rank; 

for(time=0;time<Tmax;time++){ 
if (!time%gatherphi) {// do calculation 

    for (j=0;j<nelecrank;j++) { // each processor does the calculation nelecrank times 
       phitemp[j]=0; 
       for (x = 0; x<=4; x++) { 
        phitemp[j]=phitemp[j]+var[rank+j*size]; 
        } 
       } 
     } // end of j for loop 
     printf("iter: %d, %d Before MPI_Gather.\n", iter, rank); 
     MPI_Gather(phitemp, nelecrank, MPI_FLOAT, phie+iter*nelecrank*size*sizeof(float), nelecrank, MPI_FLOAT, 1, MPI_COMM_WORLD); 
     iter++; 
    } // end of gatherphi condition 

if (time % gatherfile) { //output result of calculation 
    iter=0; 
    if (rank==1) { 
       out = fopen ("output.txt", "wt+"); 
       if (out == NULL) { 
        printf("Could not open output file.\n"); 
        exit(1); 
        } 
       else printf("Have opened output file.\n"); 
       for (j=0;j<nelecrank*size*lephie;j++) { 
         fprintf(out,"%f ",*(phie+j*sizeof(float))); 
        } 
       fclose(out); 
       } 
    } // end of file output 

if (rank==1) { 
     if (phie) free (phie); 
     } 
if (phitemp) free (phitemp); 
MPI_Finalize(); 

return 0; 
} 

Это дает мне повторил проблемы распределения памяти, пока, наконец, не выйдет. У меня нет опыта использования памяти в MPI - можете ли вы помочь?

Большое спасибо, Марта

+0

Можете ли вы описать точный характер ваших «проблем с распределением памяти»? Не хватает ли выделенной памяти? Вы получаете SIGSEGV для незаконного доступа к памяти? Вы получаете двойную бесплатную? –

+0

Вот он: MPT ERROR: rank: 1, function: MPI_GATHER, сообщение усечено при приеме: ошибка приложения заставила отправителя отправлять слишком много данных MPT ERROR: Ранг 1 (g: 1) прерывается с кодом ошибки 0. \t Process ID: 580144, Ведущий: sgiuv, Программа:/Главная/MV12/Код/Fibrosisnew/пример \t MPT Версия: SGI MPT 2,15 11/13/16 2:05:30 MPT: ----- --- трассировка стека ------- MPT: Присоединение к программе:/proc/580144/exe, процесс 580144 – Marta

+0

Возможный дубликат [Адресация памяти в MPI \ _Gather C] (http://stackoverflow.com/ вопросы/41985758/address-memory-in-mpi-gather-c) Не открывайте несколько вопросов по одной и той же проблеме. – Zulan

ответ

0

В принципе, phie не является достаточно большим.

Вы malloc ed nelecrank*size*gatherfile/gatherphi*sizeof(float)=80*sizeof(float) память для phie.

Для связи требуется MPI_Gather. iter принимает максимальное значение nelecrank*Tmax-1, поэтому phie должно быть (nelecrank*Tmax-1)*nelecrank*size*sizeof(float)+nelecrank*size*sizeof(float), что составляет около 8000*size*sizeof(float) большое.

Возможно, вы хотите сбросить iter=0 в вашей петле где-нибудь?

Смежные вопросы