Visualizzazione dei risultati da 1 a 7 su 7
  1. #1
    Utente di HTML.it
    Registrato dal
    Jul 2005
    Messaggi
    43

    [C] ottimizzazione codice

    Ciao a tutti,
    ho bisogno di ottimizzare questo codice relativo alla rotazione di un'immagine di dim*dim pixel (con dim multiplo di 32 pixel). La RIDX è una macro così definita.

    #define RIDX(i, j, n) (i*n+j)

    mentre un pixel è definito con questa struct:

    typedef struct{
    unsigned short red;
    unsigned short green;
    unsigned short blue;
    }pixel;


    char naive_rotate_descr[] = "naive_rotate: Naive baseline implementation";
    void naive_rotate(int dim, pixel *src, pixel *dst)
    {
    int i, j;
    for (i = 0; i < dim; i++)
    for (j = 0; j < dim; j++)
    dst[RIDX(dim-1-j, i, dim)] = src[RIDX(i, j, dim)];
    }



    AIUTO!!!!!!!!!!!!!

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Ma il codice cosi' com'e' funziona?

    Lo vuoi ottimizzare in termini di velocita'?

  3. #3
    Utente di HTML.it
    Registrato dal
    Jul 2005
    Messaggi
    43
    si funziona,
    va solo velocizzato.
    la versione finale dovrebbe essere 3 volte più veloce di questa.

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Non credo si possa velocizzare questo codice.

    Del resto l'algoritmo e' molto semplice e quindi non penso ce ne possa essere un altro alternativo.

    Hai due strade ...

    1) lo fai in assembler

    2) intervieni sull'hardware

    La prima strada, dato che i compilatori C/C++ moderni riescono ad ottimizzare il codice (per velocita' maggiore) in maniera molto efficiente, non mi sembra ti possa portare molto avanti ... Puoi esaminare il codice assembler prodotto dal compilatore (c'e' una opzione per generare il listato assembler corrispondente ...) e vedere cosa si puo' fare ... ma non credo tantissimo ...

    La seconda strada ... beh ... su quella non c'e' molto da dire ...

  5. #5
    Utente di HTML.it
    Registrato dal
    Jul 2005
    Messaggi
    43
    Stando a quanto mi è stato spiegato, esistono delle tecniche di unrolling (diminuire il numero di cicli dei loop), oppure si può cercare di sfruttare i registri invece di accedere sempre alla memoria. Ho provato ma non ho raggiunto grandi risultati, ho velocizzato di 1,1 - 1,2.
    comunque grazie lo stesso

  6. #6
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Diminuire il numero di cicli credo che porti ad una incompleta rotazione dell'immagine.

    L'array sta in memoria e quindi devi per forza accedervi ...

    Quello che puoi mettere nei registri sono i due contatori i e j.
    In genere lo fa lo stesso compilatore perche' previsto dal suo ottimizzatore.

    Ti ripeto ... dai un'occhiata al codice assembler generato e poi ne riparliamo ...

  7. #7
    Utente di HTML.it
    Registrato dal
    Jul 2005
    Messaggi
    43
    come faccio a vedere l'assembler?

    come compilatore sto usando gcc con l'opzione -O2

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.