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

Przesyłanie tablic MPI

Mały hosting, OGROMNE możliwości
0 głosów
287 wizyt
pytanie zadane 12 stycznia 2020 w C i C++ przez poldeeek Mądrala (5,980 p.)
edycja 13 stycznia 2020 przez poldeeek

Witam, napisałem programik w MPI, który pobrał z pliku tablice w wymiarze [n][2] (na samym gorze pliku liczba kolumn) i chciałem ją podzieloną rozesłać do węzłów jednak nie mogę dojść czemu ciągle wywala taki błąd :

BAD TERMINATION OF ONE OF YOUR APPLICATION PROCESSES

po usunięciu funkcji MPI_Scatter błąd znika ale nie mam pojęcia co robię tam źle...
 

Fatal error in PMPI_Scatter: Message truncated, error stack:
PMPI_Scatter(804)......: MPI_Scatter(sbuf=0x7ffc9cc62080, scount=8, MPI_DOUBLE, rbuf=0x128c350, rcount=4, MPI_DOUBLE, root=1, MPI_COMM_WORLD) failed
MPIR_Scatter_impl(624).:
MPIR_Scatter(585)......:
MPIR_Scatter_intra(266):
MPIR_Localcopy(74).....: Message truncated; 64 bytes received but buffer size is 32
Fatal error in PMPI_Scatter: Message truncated, error stack:
PMPI_Scatter(804).................: MPI_Scatter(sbuf=0x7ffc34fd87e0, scount=8, MPI_DOUBLE, rbuf=0x1000350, rcount=4, MPI_DOUBLE, root=1, MPI_COMM_WORLD) failed
MPIR_Scatter_impl(624)............:
MPIR_Scatter(585).................:
MPIR_Scatter_intra(200)...........:
MPIDI_CH3U_Receive_data_found(131): Message from rank 1 and tag 5 truncated; 128 bytes received but buffer size is 64
MPIR_Scatter_intra(247)...........:
MPIC_Send(284)....................: Negative count, value is -32
Fatal error in PMPI_Scatter: Message truncated, error stack:
PMPI_Scatter(804).................: MPI_Scatter(sbuf=0x7ffffb39f0c0, scount=8, MPI_DOUBLE, rbuf=0x258b350, rcount=4, MPI_DOUBLE, root=1, MPI_COMM_WORLD) failed
MPIR_Scatter_impl(624)............:
MPIR_Scatter(585).................:
MPIR_Scatter_intra(190)...........:
MPIDI_CH3U_Receive_data_found(131): Message from rank 1 and tag 5 truncated; 64 bytes received but buffer size is 32

 

#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;
    double **recv_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);
    
    
    recv_tab = malloc((tab_size/num_procs) * sizeof(double*));
    for(i = 0; i < tab_size/num_procs; ++i){
        recv_tab[i] = malloc(2 * sizeof(double));
    }
    MPI_Barrier(MPI_COMM_WORLD);
    
    int x = tab_size/num_procs;
    
    MPI_Scatter(&tab, x, MPI_DOUBLE, recv_tab, x, MPI_DOUBLE, 1, MPI_COMM_WORLD);
    
    printf("%f", recv_tab[1][1]);
    
    //MPI_Barrier(MPI_COMM_WORLD);
    

    
    MPI_Finalize();
    
    
    return 0;
}
komentarz 13 stycznia 2020 przez DragonCoder Nałogowiec (36,500 p.)

Tak szybko patrzac:

MPI_Scatter(
    void* send_data,
    int send_count,
    MPI_Datatype send_datatype,
    void* recv_data,
    int recv_count,
    MPI_Datatype recv_datatype,
    int root,
    MPI_Comm communicator)

To jest funkcja scatter, ale nie wydaje mi sie, ze robisz root = 1, tu przyklad

https://mpitutorial.com/tutorials/mpi-scatter-gather-and-allgather/

MPI_Scatter(rand_nums, elements_per_proc, MPI_FLOAT, sub_rand_nums,
            elements_per_proc, MPI_FLOAT, 0, MPI_COMM_WORLD);

Moze to jest problemem, ze robisz root = 1

komentarz 13 stycznia 2020 przez poldeeek Mądrala (5,980 p.)

Faktycznie dość głupi błąd, jednak nie pomogło poprawienie. Za to zauważyłem więcej informacji o błędzie : 
 

YOUR APPLICATION TERMINATED WITH THE EXIT STRING: Segmentation fault (signal 11)
This typically refers to a problem with your application.
Please see the FAQ page for debugging suggestions

 

Zaloguj lub zarejestruj się, aby odpowiedzieć na to pytanie.

Podobne pytania

0 głosów
1 odpowiedź 404 wizyt
pytanie zadane 15 stycznia 2020 w C i C++ przez poldeeek Mądrala (5,980 p.)
+1 głos
1 odpowiedź 486 wizyt
pytanie zadane 14 października 2019 w C i C++ przez tralnia Nowicjusz (150 p.)
0 głosów
1 odpowiedź 779 wizyt
pytanie zadane 14 stycznia 2018 w C i C++ przez must Bywalec (2,980 p.)

93,715 zapytań

142,629 odpowiedzi

323,261 komentarzy

63,258 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.

...