• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Tablice Bcast MPI

0 głosów
393 wizyt
pytanie zadane 15 stycznia 2020 w C i C++ przez poldeeek Mądrala (5,980 p.)

Napisałem program, który przesyła dwuwymiarową tablicę między procesami. Tablice wyświetla tylko proces root, a sam program po jej wyświetleniu wyrzuca mi błąd 


YOUR APPLICATION TERMINATED WITH THE EXIT STRING: Segmentation fault (signal 11)
#include "mpi.h"
#include <stdio.h>
#include <stdlib.h>


int main (int argc, char *argv[]){
	MPI_Init(&argc,&argv);
	
	int rank, num_procs;
	
	MPI_Comm_rank(MPI_COMM_WORLD, &rank);
	MPI_Comm_size(MPI_COMM_WORLD, &num_procs);
	
	int i, j;
	int tab_size;
	double **tab;
	
	if(rank == 0){
		FILE *fp;
		double a, b;
		fp = fopen("dane.txt", "r");
		fscanf(fp, "%d", &tab_size);
		tab = malloc(tab_size * sizeof(double*));
		
		for(i = 0; i < tab_size; ++i){
			tab[i] = malloc(2 * sizeof(double));
			fscanf(fp ,"%lf %lf", &a, &b);
			tab[i][0] = a;
			tab[i][1] = b;
		}
		
		close(fp);
	}
	
	MPI_Bcast(&tab_size, 1, MPI_INT, 0, MPI_COMM_WORLD);
	if(rank != 0 ){
		tab = malloc(tab_size * sizeof(double*));
		if( rank != 0 ){
			for(i = 0; i < tab_size; ++i){
				tab[i] = malloc(2 * sizeof(double));
			}
		} 	
	}
	
	MPI_Barrier(MPI_COMM_WORLD);
	MPI_Bcast(&tab, tab_size*2, MPI_DOUBLE, 0, MPI_COMM_WORLD);

	for(i = 0; i < tab_size; i++)
		printf("%d : %lf, %lf\n", rank, tab[i][0], tab[i][1]);
	
	for(i=0; i<tab_size; i++)
        free(tab[i]);
    free(tab);
	

	
	MPI_Finalize();
	
	
	return 0;
}

 

1 odpowiedź

0 głosów
odpowiedź 15 stycznia 2020 przez poldeeek Mądrala (5,980 p.)
#include "mpi.h"
#include <stdio.h>
#include <stdlib.h>

int malloc2dfloat(float ***array, int n, int m) {
	int i;

    float *p = (float *)malloc(n*m*sizeof(float));
    if (!p) return -1;

    (*array) = (float **)malloc(n*sizeof(float*));
    if (!(*array)) {
       free(p);
       return -1;
    }

    for (i=0; i<n; i++) 
       (*array)[i] = &(p[i*m]);

    return 0;
}

int free2dfloat(float ***array) {
    free(&((*array)[0][0]));
    free(*array);
    return 0;
}


int main (int argc, char *argv[]){
	MPI_Init(&argc,&argv);
	
	int rank, num_procs;
	
	MPI_Comm_rank(MPI_COMM_WORLD, &rank);
	MPI_Comm_size(MPI_COMM_WORLD, &num_procs);
	
	int i, j;
	int tab_size;
	double **tab;
	
	if(rank == 0){
		FILE *fp;
		double a, b;
		fp = fopen("dane.txt", "r");
		fscanf(fp, "%d", &tab_size);
		malloc2dfloat(&tab, tab_size, 2);
		
		for(i = 0; i < tab_size; ++i){
			fscanf(fp ,"%lf %lf", &a, &b);
			tab[i][0] = a;
			tab[i][1] = b;
		}
		
		close(fp);
	}
	
	MPI_Bcast(&tab_size, 1, MPI_INT, 0, MPI_COMM_WORLD);
	if( rank != 0)
		malloc2dfloat(&tab, tab_size, 2);
	
	MPI_Barrier(MPI_COMM_WORLD);
	MPI_Bcast(&(tab[0][0]), tab_size*2, MPI_DOUBLE, 0, MPI_COMM_WORLD);

	for(i = 0; i < tab_size; i++)
		printf("%d : %lf, %lf\n", rank, tab[i][0], tab[i][1]);

	

	
	MPI_Finalize();
	
	
	return 0;
}

zmieniłem sposób alokacji pamięci i poszło. Tylko nie za bardzo rozumiem jak to działa..
https://stackoverflow.com/questions/5104847/mpi-bcast-a-dynamic-2d-array stąd brałem kod na alokację

komentarz 15 stycznia 2020 przez poldeeek Mądrala (5,980 p.)
Dodatkowo w tym momencie jeśli wyświetlę tablice przed jej rozesłaniem wygląda ona tak :

2.400000, 5.000000
1.500000, 2.300000
8.400000, 11.000000
4.500000, 3.200000
55.100000, 32.400000
3.500000, 2.600000
7.600000, 7.600000
4.300000, 5.700000

a po rozesłaniu tak :

2.400000, 1.500000
1.500000, 8.400000
8.400000, 4.500000
4.500000, 55.100000
55.100000, 3.500000
3.500000, 7.600000
7.600000, 4.300000
4.300000, 5.700000
komentarz 16 stycznia 2020 przez j23 Mędrzec (195,220 p.)

  Tylko nie za bardzo rozumiem jak to działa..

Różnica jest taka, że w drugiej metodzie, tej działającej, tablica leży w jednym bloku pamięci, więc MPI_Bcast wysyłała całą tablicę, a nie, jak wcześniej, tablicę wskaźników, która ma rozmiar tab_size, a Ty dałeś tam tab_size * 2, co musiało skutkować błędem.

Podobne pytania

0 głosów
0 odpowiedzi 279 wizyt
pytanie zadane 12 stycznia 2020 w C i C++ przez poldeeek Mądrala (5,980 p.)
+1 głos
1 odpowiedź 467 wizyt
pytanie zadane 14 października 2019 w C i C++ przez tralnia Nowicjusz (150 p.)
0 głosów
1 odpowiedź 871 wizyt
pytanie zadane 3 grudnia 2022 w C i C++ przez Janchess Początkujący (480 p.)

93,695 zapytań

142,615 odpowiedzi

323,225 komentarzy

63,226 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Twierdza Linux. Bezpieczeństwo dla dociekliwych

Aby uzyskać rabat -10%, użyjcie kodu pasja-linux, wpisując go w specjalne pole w koszyku.

...