2012-03-26 7 views
12

In unserer eingebetteten Architektur haben wir einen 64-Bit-IAB (Instruction Alignment Buffer). Um die Abrufsequenz zu optimieren, ist es erforderlich, dass der Körper einer Schleife mit einer 8-Byte-Grenze ausgerichtet beginnt.Wie wird C For-Loop-Körper mit GCC ausgerichtet?

Es ist einfach, dies in Assembly mit der .balign Direktive zu erreichen, aber ich kann keine Syntax finden, die den C-Compiler anweisen wird, den Code auszurichten.

Der Vorlauf der for-Schleife mit Inline-Assembly mit der Direktive .balign funktioniert nicht, da der for loop-Prolog (Setup) und nicht der Schleifenkörper selbst ausgerichtet wird.

Das Gleiche tun, wo die asm() Linie innerhalb der Schleife ist, fügt nop -s dem Schleifenkörper hinzu, der wertvolle Zyklen kostet.

EDIT 1: nimm den Code:

__asm__ volatile("nop"); 
    __asm__ volatile("nop"); 

    for (j0=0; j0<N; j0+=4) 
    { 
     c[j0+ 0] = a[j0+ 0] + b[j0+ 0]; 
     c[j0+ 1] = a[j0+ 1] + b[j0+ 1]; 
     c[j0+ 2] = a[j0+ 2] + b[j0+ 2]; 
     c[j0+ 3] = a[j0+ 3] + b[j0+ 3]; 
    } 

Ich mag die erste c=a+b auf eine 8-Byte-Adresse auszurichten. Ich kann die nop -s wie oben nach einer vorläufigen Kompilierung hinzufügen, aber dies ist eine Ad-hoc-Lösung, die mit der ersten Codeänderung brechen wird.

EDIT 2: Dank @R .., ist die Lösung -falign-loops=8 Compiler-Option zu verwenden.

+0

Also im Wesentlichen wollen Sie 'nop'-s, dass die Schleife * Körper * ausgerichtet werden soll, aber Sie wollen diese' nop'-s vor der Schleife gehen * prolog *? – ruakh

+0

@ruakh - ja, obwohl es mir egal ist, ob die 'nop'-s im Prolog selbst generiert werden, solange der Verzweigungsbefehl am Ende der Schleife auf einen ausgerichteten Speicherplatz zeigt. – ysap

+0

Verstanden. Das ist eine gute Frage! – ruakh

Antwort

3

Umm, ist das nicht die Option -falign-loops von GCC?

+0

Ja, aber was, wenn Sie nur eine einzelne Schleife beeinflussen möchten. Hat GCC eine Lösung? –

+1

Für eine einzelne Funktion können Sie '#pragma GCC optimieren' oder die entsprechenden Attribute verwenden. Ich weiß nicht, ob Sie es auf der Single-Loop-Ebene tun können. Wenn es keinen anderen Weg gibt, könnten Sie dies mit einem schrecklichen Hack erreichen, indem Sie die Schleife in eine verschachtelte Funktion setzen und das Attribut auf die verschachtelte Funktion setzen ...? –

+0

Gezielte Einzelfunktionsoptimierung ist immer noch viel besser als projektweite Option, da sie unter Umständen gut (Hot-Loops) und schlecht in anderen (seltene Loops) sein kann. Leider "weder #pragma GCC optimieren" align-loops = xx "noch" __attribut __ (optimize ("align-loops = xx"))) scheinen in meinen Tests (gleich 'md5sum') zu wirken generierte Binärdateien). – Cyan

Verwandte Themen