C99 restrict: beispielcode?



  • hi,

    ich suche ein klitzi kleines beispielprogramm, dem einer im generierten assembler ansieht, dass restrict qualifiers benutzt wurden. mein bisheriger versuch scheiterte kläglich (s.u.).

    das kann daran liegen, dass ich

    a) falsch suche.

    b) restrict noch nicht richtig verstanden habe; kann ich nicht sagen, die beschreibungen, die ich gelesen habe, sind insofern theoretisch, als sie keinen praktischen code zeigen ... 🙂

    c) ich gehe die sache falsch an. bisher habe ich die source kompiliert, und mittels objdump -C -S ein dump erzeugt. das programm ist (so ungefähr) vom c2 wiki:

    #define RESTRICT restrict
    
    int munge (int * RESTRICT x, int * RESTRICT y) {
            int result = *x;
            *y = 10;        // might set *x, too.
            result += *x;
            return result;
    }
    
    int main (void) {
            int a=4, b=8;
            munge (&a, &b);
    }
    

    im wiki steht noch:

    The compiler can't optimize away the second load through *x.

    ich schließe, dass eine optimierung stattfinden kann, je nachdem, ob mit restrict qualifiziert wurde oder nicht. nach der oben beschriebenen methode ist der inhalt der erzeugten objektdateien aber identisch, egal, ob RESTRICT nu leer ist oder zu restrict expandiert - also hat keine optimierung stattgefunden 😕

    compiler: gcc version 3.3 20030226 (prerelease) (SuSE Linux)

    nicht auszuschließen ist die möglichkeit, dass dieser code einfach nicht geeignet ist, da er zu einfach ist, und in jedem fall wegoptimiert wird.

    meine idee war am anfang, dass ich irgendeine veränderung feststelle ... 😉

    -- leuchtturm



  • Da musst du dir die Compilerdoku ansehen. Denn restrict ist ja nur eine Information an den Compiler, was er damit macht, ist seine Sache.

    Ich nehme aber nicht an, dass es viel Performance bringt.

    Natürlich darf der Compiler in deinem Beispiel das zweite *x wegoptimieren.
    Ich nehme mal an, dass dein Compiler noch nicht so weit ist - obwohl mich das bei dem gcc doch sehr wundert...



  • Shade Of Mine schrieb:

    Da musst du dir die Compilerdoku ansehen. Denn restrict ist ja nur eine Information an den Compiler, was er damit macht, ist seine Sache.

    da hätte ich gerne mal einen pointer. es gibt in der doku zwei interessante links Qualifiers und Restricting Pointer Aliasing - ersterer enthält keine informationen, lezterer keine relevanten...

    Shade Of Mine schrieb:

    Ich nehme aber nicht an, dass es viel Performance bringt.

    hmm. tatsächlich erhalte ich nun ein (zufriedenstellendes?) ergebnis. mit -On, n>=2, differieren die objektdateien.

    mit restrict qualifier:

    int munge (int * RESTRICT x, int * RESTRICT y) {
       0:   55                      push   %ebp
       1:   89 e5                   mov    %esp,%ebp
        int result = *x;
       3:   8b 45 08                mov    0x8(%ebp),%eax
        *y = 10;    // might set *x, too.
       6:   8b 55 0c                mov    0xc(%ebp),%edx
       9:   8b 00                   mov    (%eax),%eax
       b:   c7 02 0a 00 00 00       movl   $0xa,(%edx)
        result += *x;
      11:   01 c0                   add    %eax,%eax
        return result;
    }
    

    ohne:

    int munge (int * RESTRICT x, int * RESTRICT y) {
       0:   55                      push   %ebp
       1:   89 e5                   mov    %esp,%ebp
       3:   8b 55 08                mov    0x8(%ebp),%edx
        int result = *x;
        *y = 10;    // might set *x, too.
       6:   8b 4d 0c                mov    0xc(%ebp),%ecx
       9:   8b 02                   mov    (%edx),%eax
       b:   c7 01 0a 00 00 00       movl   $0xa,(%ecx)
        result += *x;
      11:   03 02                   add    (%edx),%eax
    
        return result;
    }
    

    das sieht doch ganz gut aus.

    3:   8b 55 08                mov    0x8(%ebp),%edx
    

    ich kann diese zeile leider nicht "lesen". es sieht so aus, als ob %edx genau der zwischenspeicher ist, der durch das restrict wegoptimiert werden kann. keine ahnung, warum ich nun eine veränderung sehe ... wahrscheinlich unterlief mir gestern irgendein offensichtlich nicht offensichtlicher fehler ... 😉

    danke.



  • das sollte vielleicht für dich interessant sein, wenn du den Code besser verstehen willst, den der GCC generiert.

    http://www.nondot.org/sabre/os/files/Booting/CompilingBinaryFilesUsingACompiler.pdf



  • hi,

    danke, das sieht sehr vielversprechend aus 🙂
    btw das wird teil eines vortrages über ETs, FETs, und eben jenem restrict.


Anmelden zum Antworten