2010-11-01 7 views
35

Wie kann ich GCC sagen, eine bestimmte Schleife abzurollen? Ich habe das CUDA SDK verwendet, wo Schleifen manuell unter Verwendung #pragma unroll entrollt werden können. Gibt es eine ähnliche Funktion für gcc? Ich habe ein wenig gegoogelt, konnte aber nichts finden.Erlaube gcc, eine Schleife speziell zu entrollen

+6

Ich kann nicht glauben, dass ich das sagen werde. Wenn du nichts anderes findest, gibt es immer ... Duffs Gerät. Nun, wo * habe * ich die Peitsche des Peinigers gemacht? Ich kenne es hier irgendwo ... – dmckee

+0

Heh kannst du es mit Makros machen? Wahrscheinlich nicht, also ist es das Einzige, was übrig geblieben ist? – Nils

+6

In aller Ernsthaftigkeit würde ich vorschlagen, die separate Kompilation genau dieses Bits mit '-Funktions-Loops' zu untersuchen, bevor du Duff's Device benutzt: es ist eine schöne Sache zu studieren, aber eine hässliche Sache in deinem Code. – dmckee

Antwort

43

GCC Sie ein paar verschiedene Möglichkeiten der Handhabung ergibt dies:

  • Verwendung #pragma Richtlinien, wie #pragma GCC optimize ("string"...), wie man sehen in der GCC docs. Beachten Sie, dass das Pragma die Optimierungen global für die restlichen Funktionen vornimmt. Wenn Sie #pragma push_options und pop_options Makros geschickt, könnte man wahrscheinlich diese um definieren nur eine Funktion wie folgt:

    #pragma GCC push_options 
    #pragma GCC optimize ("unroll-loops") 
    
    //add 5 to each element of the int array. 
    void add5(int a[20]) { 
        int i = 19; 
        for(; i > 0; i--) { 
         a[i] += 5; 
        } 
    } 
    
    #pragma GCC pop_options 
    
  • Beschriften einzelnen Funktionen mit GCC Attribut Syntax: überprüfen Sie die GCC function attribute docs für eine ausführlichere Dissertation über die Gegenstand. Ein Beispiel:

    //add 5 to each element of the int array. 
    __attribute__((optimize("unroll-loops"))) 
    void add5(int a[20]) { 
        int i = 19; 
        for(; i > 0; i--) { 
         a[i] += 5; 
        } 
    } 
    

Hinweis: Ich bin nicht sicher, wie gut GCC ist bei Abrollen Reverse-iterativ Schleifen (ich habe es Abschriften zu bekommen mit meinem Code schön zu spielen). Die Beispiele sollten jedoch gut kompiliert werden.

+1

Sehr cool, dass es ein Funktionsattribut dafür gibt, es wird jedoch von Apples neuestem GCC für iOS ignoriert: "Warnung: 'optimieren' Attribut-Direktive ignoriert". (Ich weiß, dass sie auf LLVM umgestiegen sind, aber ich benutze immer noch GCC, da es manchmal schnelleren Code produziert.) Wer weiß, warum es ignoriert wird? Ist Apples GCC-Zweig zu alt? Nebenbei, in der Funktion, in der ich es benutzt habe, werden Loops sowieso ausgerollt, solange ich -O3 benutze. – Simplex

+0

Ich habe gerade '__attribut __ ((optimize (" unroll-loops "))) mit etwas eingebettetem Code versucht und es hat die Geschwindigkeit um nur 3% verbessert. Manuelles Abrollen um das Achtfache verbesserte die Geschwindigkeit um 12% und erhöhte die Programmgröße nicht so sehr. – endolith

+0

Mein GCC sagt Warnung: Ignorieren #pragma optimieren ... Ist das immer verfügbar? – neodelphi

3

-funroll-loops kann hilfreich sein (obwohl es Loop-Unrolling global aktiviert, nicht pro Schleife). Ich bin nicht sicher, ob es eine #pragma ist das gleiche zu tun ...

+0

ich habe das auch gefunden, aber ich möchte nur eine bestimmte Schleife ausrollen – Nils

+0

bmei von broadcom haben eine Reihe von Patches um die "#pragma entroll" Unterstützung für gcc hinzuzufügen. – osgx

+1

@Jerry Coffin, wie kann ich es benutzen? Können Sie mir einen Befehl geben, der -funroll-loop verwendet? –