Aber ich verstehe nicht wieso man keine // als Kommentarzeichen in C verwenden kann?
Weil C (die Version von 1989, die noch am weitesten verbreitet ist) keine //-Kommentare unterstützt. Standardkonforme C-Compiler im standardkonformen Modus müssen zumindest irgendeine Meldung ausgeben, wenn du // verwendest; danach dürfen sie den Code gerne kompilieren, wie immer sie möchten. Ich sag nicht, daß du auf keinen Fall // verwenden sollst, aber du solltest dir sicher sein, daß du C schreibst und dein Compiler C von dir erwartet. C mit C++-Compilern übersetzen ist grausig.
fuer den hausgebrauch schon, aber wenn ich so messe, dann habe ich irgendwie das gefuehl ich beschwindle mich selbst. liegt wohl daran dass ich caching generell als cheating empfinde ;). mit caching verliert der begriff "ideale laufzeit" fuer mich so und so jegliche relevanz.
Naja, "ideale Laufzeit" ist die, die rauskommen würde, wenn es keine cache misses und page faults gäbe. Ganz ohne wirds allgemein nicht gehen, aber wenn man das Minimum von mehreren Messungen gibt, kriegt man etwas raus, was auf dem konkreten System sicher möglich ist.
Aber es stimmt schon, man muß wissen, was und wofür man misst. Wenn man wissen will, wie schnell das Programm "üblicherweise" sein wird, oder welche Schranke "fast immer" unterboten wird, sind andere Statistiken besser als das Minimum.
Wie kann man eigentlich herausbekommen wie groß diese Cacheline ist?
Man liest die Developer-Dokumentation seines Prozessors. Aber wie Ringding auch gemeint hat, irgendwann ist der Punkt erreicht, an dem du nur noch auf eine Plattform hin optimierst und Sachen machst, die woanders völlig kontraproduktiv wären.
Zitat
int creatematrix(BLOCK *pos) {
BLOCK shift=0; int BPB = BITS_PER_BLOCK -1;
int row, col;
for(row = 0; row < N; row++) {
for(col = 0; col < N; col++) {
if(col&1)
shift |= (1 << (col & (BPB)));
}
}
return 0;
}
Alles anzeigen
Messungen dieses Codes, und insbesondere des "Einflusses" der Variablen shift, sind völlig unsinnig. Diese Funktion ist semantisch äquivalent:
int creatematrix(BLOCK *ismawurscht)
{
return 0;
}
und der Compiler darf gern entsprechenden Code erzeugen. Ganz so weit geht mein GCC zwar nicht, aber er generiert praktisch keinen Code für den Körper der innersten Schleife, wie wenn ich ihn ganz auskommentiere! Die Zuweisung an shift ist nämlich sogenannter partial dead code---das Ergebnis wird nie wirklich verwendet. Deswegen wird die Zuweisung munter wegoptimiert (bei dir anscheinend nur mit register, oder hast du noch nicht die maximale Optimierungsstufe aktiviert?).
Jedenfalls: Wenn dich die Performance deines echten Codes interessiert, mußt du deinen echten Code messen. Codeskizzen messen sagt nichts über deinen echten Code aus.
Zitat
Aber warum ist diese Operation shift |= (1 << (col & (BPB))); für 32 Bit schneller als für kleinere Blockgrößen?
Ich habe einen 32 Bit Prozessor. Vielleicht füllt der Rechner ja dieses shift mit zusätzlichen Nullen, damit es im 32 Bit Prozessor gut verarbeitet werden kann.
Sowas. Geladen werden üblicherweise ganze Speicherworte, aus denen muß dann noch was rausmaskiert werden.