Merge ordinato e parallelo

di il
5 risposte

Merge ordinato e parallelo

Ciao a tutti,

vorrei poter ottenere un merge con quello illustrato in figura

dove ciascun nodo rappresenta un processo.

Poiché ogni nodo ha un pezzo di testo, ho bisogno che venga mantenuto l'ordine ogni qualvolta i testi vengono uniti:

  • testo 0
  • testo 1
  • testo 2
  • testo 3
  • testo 4

Il problema è che dopo la prima iterazione non riesco a capire se un nodo deve inviare nuovamente o attendere e ricevere, quindi calcolare chi spedisce e chi riceve.

Questo magari è un algoritmo noto, ne conoscete il nome? Oppure avete qualche suggerimento per aiutarmi a risolvere il problema?

Sto sviluppando il programma in C e per la parallelizzazione utilizzo MPI. Poiché ciascun pezzo di testo ha una lunghezza variabile spedisco la un array di char allocato dinamicamente con un int che mi da la lunghezza della stringa, facendo uso di MPI_Pack ed MPI_Unpack. Ho letto online che la MPI_Reduction non è un'opzione quando si ha a che fare con variabili allocate dinamicamente, e non sono sicuro che sarebbe in grado di garantirmi l'ordine. Per questo motivo sto cercando di scrivermi l'algoritmo da solo.

Vi ringrazio.

5 Risposte

  • Re: Merge ordinato e parallelo

    Non sarebbe meglio fare trasferimenti lineari?

    Tipo se hai 100 processi e 4 core, fai in parallelo

    99 - > 98 - > 97 - > …  - > 75

    74 - > 73 -  > 72 - > …  - > 50

    49 - > 48 -  > 47 - > …  - > 25

    24 - > 23 - > 22 -  > … – > 0

    e quando finiscono tutte e quattro le catene unisci gli ultimi pezzi

    75 - 50  - 25 - 0

  • Re: Merge ordinato e parallelo

    Se ho capito bene, non credo che la cosa si possa applicare.

    Nel mio caso ho un numero variabile di processi, facciamo finta che siano 9, ciascun processo ha un pezzo di testo.

    Per ottenere il testo in modo ordinato io devo in pratica fare l'append a ritroso, da 9 a 0. Ciascun processo ha gia' il testo in ordine.

    Nel tuo esempio, è come se io fossi già all'ultimo step, con 5 catene invece di 4.

    Il sistema è distribuito, ciascun processo è isolato.

  • Re: Merge ordinato e parallelo

    Infatti ci sono 4 catene che vanno a ritroso. Alla fine di quelle c'è un'ultima catena che va sempre a ritroso con i 4 parziali. Dove verrebbe violato l'ordine? Forse dovresti fare un esempio concreto

  • Re: Merge ordinato e parallelo

    Io ho questi 5 processi, ciascuno dei quali, per semplicità, ha un carattere, quello che vorrei ottenere è la stringa filane, contenente tutti i caratteri di ciascun processo, in ordine “ABCDE”.

    Poichè il numero di processi è dispari, le iterazioni dovrebbero essere le seguenti:

    iterazione 0:
    // processi 3 e 4
    MPI_Send(E, 3);
    MPI_Recv(E, 4);
    merge(D, E)
    
    // processi 1 e 2
    MPI_Send(C, 1)
    MPI_Recv(C, 2);
    merge(B, C)
    
    iterazione 1:
    // processi 1 e 3
    MPI_Send(DE, 1);
    MPI_Recv(DE, 3);
    merge(BC, DE);
    
    iterazione 2:
    // processi 0 e 1
    MPI_Send(BCDE, 0);
    MPI_Recv(BCDE, 1);
    merge(A, BCDE);

    L'iterazione 0 è abbastanza facile, basta guardare se il numero di processi è divisibile per 2.

    Ma dall'iterazione 1 in poi non so come calcolare:

    • chi deve spedire a chi deve spedire;
    • chi deve ricevere da chi deve ricevere.
  • Re: Merge ordinato e parallelo

    Sei comunque limitato dal numero di core del processore, quindi non avrai guadagni a farlo in quel modo

Devi accedere o registrarti per scrivere nel forum
5 risposte