Sembra che si desideri eseguire una trasposizione di matrice che è leggermente diversa dalla rotazione. A rotazione, le righe possono diventare colonne, ma le righe o le colonne saranno in ordine inverso a seconda della direzione di rotazione. La trasposizione mantiene l'ordinamento originale delle righe e delle colonne.
Penso che l'utilizzo dell'algoritmo giusto sia molto più importante dell'utilizzo dell'assemblaggio o solo di C. La rotazione di 90 gradi o la trasposizione si riduce effettivamente al solo spostamento della memoria. La cosa più importante da considerare è l'effetto della cache di manca, se si utilizza un algoritmo ingenuo come questo:
for(int x=0; x<width; x++)
{
for(y=0; y<height; y++)
out[x][y] = in[y][x];
}
Ciò causerà un sacco di cache di manca, perché si sta saltare nella memoria molto. È più efficiente utilizzare un approccio basato su blocchi. Google per "Transpose Matrix Transpose".
Un luogo in cui è possibile fare dei guadagni è usare le istruzioni SSE per spostare più di un pezzo di dati alla volta. Questi sono disponibili in assemblaggio e in C. Controllare anche this link. Circa a metà strada hanno una sezione sul calcolo di una trasposizione a matrice veloce.
edit: Ho appena visto il tuo commento che si sta facendo questo per una classe in assemblea in modo probabilmente si può ignorare la maggior parte di quello che ho detto. Immaginavo che stavi cercando di spremere le migliori prestazioni da quando stavi usando l'assemblaggio.
fonte
2010-05-21 18:19:58
Quindi, sono curioso, perché dovresti fare una cosa del genere in assemblea? – WhirlWind
Poiché si tratta di un progetto per un corso che sto prendendo in Assembly;) – Nick
è necessario aggiungere il tag compiti a domande come questa, ma questo sembra abbastanza ragionevole, poiché è ad un livello elevato, e non ci stai chiedendo di fare i compiti per te. – WhirlWind