Beiträge von escitalopram

    Falls es jemanden interessiert: Hab mich jetzt ein bisschen in die Dokumentation eingegraben und folgendes implementiert, scheint noch schneller zu sein:

    Code
    inline unsigned char q32(register unsigned int x) {
            register unsigned char result;
            asm("xor %%ecx,%%ecx; xlatb; movb %%al,%%cl; shr $8, %%eax; xlatb; add %%al,%%cl; shr $8, %%eax; xlatb; add %%al,%%cl; shr $8, %%eax; xlatb; add %%al,%%cl; ":"=c" (result):[tabelle] "b" (quersumme_8), [wert] "a" (x));
            return result;
        }

    Hmm... na gut, zum ersten kann ich PPC-Assembler noch weniger lesen und zum zweiten hat der einen ganz anderen Registersatz... Aber ich glaub es reicht mir 4 Milliarden Bit-Quersummen in ~30 Sekunden berechnen zu können (ist das gut bei 1,6 GHz?)... Im Notfall kann ich mein Programm ja noch später optimieren...

    Seltsam, das liefert bei mir längeren Code, mit zusätzlichen ANDs, wieder einem unnötigen shr (das müsste man ja mit den h- und l-registern machen können) und auf dem Stack pfuscht er erst wieder herum (das scheint wohl ohne inline-assembler nicht zu vermeiden zu sein):

    Was für eine GCC-Version verwendest du, und wie sieht dein Assembler-Code aus?

    Edit: Langsamer ist der Code auch

    Edit2: mit -fomit-frame-pointer lässt er den Stack in Ruhe und der Code schrumpft auf 50 Byte und wird auch entsprechend schneller *freu*

    Hi Leute,
    Ich möchte die Binäre Quersumme einer 32 Bit-Zahl möglichst effizient berechnen.
    Ich arbeite auf einem Athlon XP Model 8 Prozessor mit angeblich 128kB split L1 Cache.

    Ich habe mich vorläufig für die folgende Variante entschieden:
    Ich denke mal im L1-Cache ist Platz für eine Lookup-Tabelle der Quersummen aller 8-Bit-Zahlen, und da könnte man ja 4 mal pro 32-Bit zahl nachschauen und das Ergebnis zusammenaddieren.
    Leider bin ich nicht ganz so sattelfest in Assembler wie ich mir das wünsche, deshalb hab ich angefangen die Funktion in C zu programmieren und dann durch hinschauen auf den generierten Assembler-Code zu optimieren.

    Mein GCC macht mit -march=athlon-xp -O3 dann folgendes draus:

    Jetzt frage ich mich: ist dieser Code wirklich optimal? Wenn ich da hinsehe, sehe ich 2 shr, wo eigentlich nur eins benötigt würde? Und überhaupt, was fummelt der da am Stack herum?

    Kann mir vielleicht jemand von den technischen Informatikern (oder sonstigen Assembler-Programmieren) helfen das effizienter in C-inline-assembler hinzukriegen (das sollte mit dem GCC ja gehen..)?
    Vielen Dank!

    Hi,
    Irgendwie scheint bei meinem Rechner was kaputt zu sein:
    Ich habe auf dem ersten IDE-Kanal zwei Platten hängen. Auf der ersten ist eine kleine Windows-Partition, und auf der zweiten ist Linux installiert.

    Mit der zweiten Festplatte hab ich schon seit Ewigkeiten das Problem, dass sie beim Starten ungefähr 90 Sekunden hängt, und dann kommt erst der Bootloader. Allerdings gabs sonst nie ein gröberes Problem mit dieser Platte.

    Neuerdings macht jetzt aber die erste Platte große Probleme. Das Windows startet nur mehr im abgesicherten Modus, und das Linux kann die Partitionstabelle der ersten nicht mehr lesen.

    Ich hab mir das ganze genauer angesehen und die Partitionstabelle mit dd eingelesen und mit hexdump ausgegeben, und bin draufgekommen, dass die Festplatte zwar alles liest, aber anscheinend bei jeder Leseoperation ungefähr 14 Nullbytes voranstellt. Witzigerweise tritt dieses Problem aber nur im DMA-Modus auf. Wenn ich im PIO-Modus einlese, sind alle Daten korrekt. Die zweite Platte arbeitet im DMA-Modus einwandfrei.

    Offensichtlich hat es da irgendwas gröberes, und ich muss was neu kaufen - entweder eine neue Festplatte oder einen neuen Controller == neues Mainboard. Nur hab ich endlich viel Geld, da Student und kann/will nix unnötiges kaufen.

    Hat jemand schon mal sowas gehabt? irgendeine Idee, was da hin sein könnte?

    Hi,
    Ich versuche ein Programm zu schreiben, das mir eine bestimmte Stelle in einem bestimmten X-Fenster automatisch anklickt. Allerdings scheine ich da irgendwas falsch zu machen, denn das Programm läuft zwar klaglos durch, aber der Klick wird nicht ausgeführt. (Ja ich rechne auch die Hex-Fensternummer vom xwininfo in dezimal um)

    Vielleicht gibt's ja hier jemanden im Forum, der mit sowas schon Erfahrung hat und mir da ein bisschen weiterhelfen könnte. Vielen Dank!

    Naja, das wär die Headerdatei:

    und die Klasse verwende ich folgendermaßen:

    Code
    using namespace Tuft;
    int main(int argc, char* argv[]) {
    	boost::shared_ptr<FileManager> fm(new FileManager());
    	ShaderManager sm(fm);
    [...]

    Die Fehlermeldung sieht dann so aus:

    Code
    BspTest.cc: In function `int main(int, char**)':
    BspTest.cc:8: Fehler: keine passende Funktion für Aufruf von »Tuft::ShaderManager::ShaderManager(boost::shared_ptr<Tuft::FileManager>&)«
    TuftBsp.h:22: Anmerkung: Kandidaten sind: Tuft::ShaderManager::ShaderManager()
    TuftBsp.h:22: Anmerkung:                  Tuft::ShaderManager::ShaderManager(const Tuft::ShaderManager&)


    achja, und natürlich

    Code
    typedef boost::shared_ptr<FileManager> Karl;


    ;)

    Hi.
    Ich arbeite gerade an einem etwas größeren C++-Projekt und bei mir treten seltsame Phänomene auf; zunächst mal war da ein Problem, dass der compiler (g++) eine deklarierte Klasse nicht gefunden hat, obwohl der Header eingebunden war. Die Lösung für dieses Problem habe ich schon gefunden, und zwar war in ein paar Headern nach dem namespace Y {...} ein Strichpunkt, der wegmusste.

    Jetzt hab ich ein ähnliches Problem:
    Ich hab eine Klasse ShaderManager mit einem Konstruktor ShaderManager(Karl x). Wenn ich diesen Konstruktor nun aber verwenden will, meldet mir g++ es gäbe keinen derartigen Konstruktor, sondern nur den Default- und den Kopierkonstruktor. (Wenn ich das richtig verstanden habe, sollten beide nicht mehr vorhanden sein, wenn ich einen anderen Konstruktor definiert hab....?) Wie kann es sein, dass eine Klassendefinition vom Compiler akzeptiert wird, dieser aber den Konstruktor trotzdem ignoriert?

    Es geht darum, dass eine Klasse keine const members (die man im Konstruktor initialisieren muss) haben kann die arrays sind*, weil man die nicht initialisieren darf. Und mich würde interessieren, warum das so festgelegt wurde, weil irgendwie behindert einen das bei der Arbeit ;)

    *) außer es handelt sich um static members

    Zitat von sauzachn

    Es geht für einen ctor nicht - also auch nicht für mehrere.
    Abgesehen davon ist das Array wohl nicht mehr konstant, wenn es in verschiedenen ctors verschiedene Werte besitzen soll.

    Ein Objekt wird nur einmal konstruiert, demnach können (nichtstatische) const members verschiedener Instanzen verschiedene Werte haben, unabhängig davon wieviele Konstruktoren die entsprechende Klasse hat - es sei denn es handelt sich um arrays.......

    Hi, ich habe ein Problem. Wenn man ein nichtstatisches const-member initialisiert kann man ja nicht folgendes schreiben:

    Code
    class Karl {
      public:
      const int zahl=1;
    };

    sondern man muss das stattdessen so formulieren:

    Code
    class Karl {
      public:
      const int zahl;
      Karl() : zahl(1) {}
    };

    Soweit so gut, was ist jetzt aber wenn "zahl" ein array ist?

    Code
    class Karl {
      public:
      const int zahlen[2];
      Karl() : zahlen({1,2}) {}
    };

    An dieser Stelle bricht mein g++ ab mit der Fehlermeldung

    Zitat

    error: expected primary-expression before '{' token

    Wie mach ich das jetzt richtig? Außerhalb einer Klasse würd ich ja einfach schreiben:

    Code
    const int zahlen[]={1,2};


    aber in einer Klasse darf ich das ja nicht. Kann mir da bitte jemand weiterhelfen?