Thread lentissimo

di Marchetto il
17 risposte

Stò parallelizzando il mio prog e funziona nel senso che si compila, esegue e l' output è quello corretto ma i tempi sono cento volte più lunghi rispetto a prima

void pxrec1(int r, int c, bitmap_image imager) {
                                                rgb_t colour;
                                                
                                                imager.get_pixel(c, r, colour);
                                                px[r][c] = colr((unsigned int)colour.red, (unsigned int)colour.green, (unsigned int)colour.blue);
                                                
                                                }
void pxrec2(int r, int c, bitmap_image imager) {
                                                rgb_t colour;
                                                
                                                imager.get_pixel(c, r, colour);
                                                px2[r][c] = colr((unsigned int)colour.red, (unsigned int)colour.green, (unsigned int)colour.blue);

                                                }
bitmap_image image("input.bmp");
for (r = 0; r <= 499; r++) {
                            for (c = 0; c <= 499; c++) {
                                                        std::thread first(pxrec1, r, c, image);
                                                        c++;
                                                        std::thread secon(pxrec2, r, c, image); 
                                                        first.join(); secon.join();
                                                        }
                            }
reset && c++  desc.cpp -O3 -march=native -pthread  -lpthread -o desc && ./desc > out.log

le funzioni devono essere indipendenti tra loro? perchè le mie condividono qualche dato.

grazie

17 Risposte

  • Ma ti sembra corretto quello che hai scritto?

    Quando hai imparato ad usare i thread?

  • Non lo sò se è corretto l' ho letto sui siti

  • 10/09/2024 - Marchetto ha scritto:


    Non lo sò se è corretto l' ho letto sui siti

    Ma non l'hai compreso. 

    In quel modo non ha alcun senso.

    Quindi non devi chiedere se è lento ma se è corretto.

    Ti dò uno spunto ma solo per questa volta. Non conosci le basi del C e del C++ e vuoi usare i thread … altro che usare un libro e studiare … non ti sembra assurdo?

    #include <thread>
    
    using namespace std;
    
    void pxrec(int fromr, int fromc, int tor, int toc, bitmap_image *imager)
    {
       int r, c;
       rgb_t colour;
    
       for (r = fromr; r <= tor; r++)
           for (c = fromc; c <= toc; c++)
           {
               imager->get_pixel(c, r, colour);
               px[r][c] = colr((unsigned int)colour.red, (unsigned int)colour.green, (unsigned int)colour.blue);
           }
    }
    
    int main()
    {
       bitmap_image imager("input.bmp");
       
       thread th1(pxrec, 0, 0, 249, 499, &imager);
       thread th2(pxrec, 250, 0, 499, 499, &imager);
    
    
       th1.join();
       th2.join();
       
       return 0;
    }

    P.S. Non so nulla di questa funzione colr, nè se siano necessari quei cast, nè se possa essere semplificata o addirittura eliminata e sostituita con del codice … Fra l'altro la cosa normale sarebbe che la colr accettasse un solo argomento di tipo rgb_t 

  • Non e' “thread lentissimo” 

    MA

    l'inutile uso di “infiniti thread” per fare “”operazioni elementari”"".

    .

    DEVI ragionare in QUESTO modo:

    devo eseguire una certa operazione 1000 volte, ma voglio usare 10 thread.

    ALLORA 

    ogni thread deve eseguire SOLO 100 operazioni, scelte in modo INTELLIGENTE in modo che 

    alla FINE siano state eseguite TUTTE 1000.

    Nota/1: ESATTAMENTE come nell'esempio di Oregon!

    .

    MA NON E' ASSICURATO al 100% che in questo modo il tuo programma venga eseguito in 1/10 del tempo!

    Ci sono un SACCO di considerazioni al contorno da fare. 
    La spiegazione richiede, mediamente, libri da 300 pagine!

    Nota/2: la programmazione “multithreading” NON SI IMPARA “leggendolo sui siti”!

  • Ma che c'entra? Tu eseguivi due thread per ogni punto dell'immagine perdendo il doppio del tempo. Fra l'altro con due funzioni uguali che sono inutili.

    La questione che hai scritto della CPU non c'entra nulla. Puoi far eseguire al sistema più thread che saranno assegnati alla CPU secondo le capacità della stessa ÷ i core disponibili

    Puoi provare come ti ho mostrato due thread che trattano ognuno metà immagine. Ma puoi provare anche con 4 thread che si occupano ognuno di un quarto dell'immagine. Controlla i tempi di esecuzione e determina il numero di thread adeguati.  

  • Fatto. ma non è più veloce anche con 4 thread, non funziona lasciamo perdere grazie a tutti.

    non è che con un altro computer magari 16 core le cose combiano oppure non dipende dall' hardware ma del prog?

  • Con il tuo hw edue thread dovrebbe essere meglio di un solo thread. Con un hw più potente già solo per questo sarà più veloce.

    Non hai detto nulla sulla funzione colr e perchè fai quel cast nè cosa stai facendo. Potrebbe essere fatto meglio?  

  • Si potrebbe essere fatto meglio con una cache ad esempio, lo farò. per adesso volevo fare la parallelizzazione se ci riusciamo.

    mi pare di aver capito che è un prob di compatibilità tra codice e hardware, o no?

  • Ti avevo chiesto di mostrare la funzione colr perchè sicuramente è scrittamale e impiega tempo inutile.   

  • Si è vero si può migliorare e lo farò, non la mostro è un segreto.

  • Ma non mi fare ridere

  • E si, ho avuto quello che cercavo per adesso sono apposto, più in là mi faro sentire se serve

  • 10/09/2024 - Marchetto ha scritto:


    Si è vero si può migliorare e lo farò, non la mostro è un segreto.

    Mi sembra il progetto di Giovanni in “così è la vita”.

Devi accedere o registrarti per scrivere nel forum
17 risposte