funktionsaufruf optimieren, max speed performance
-
Hallo liebes Forum,
Eine kleine Funktion wird immer nur an einer bestimmten Stelle eines Programms aufgerufen. Das Problem dabei ist: es geht nicht schnell genug wg. stack-operation und jump Aufruf. Hier verliere ich bei jedem Aufruf der Funktion Rechen-Zeit.
void numbercruncher(short *array) { // sehr CPU intensive operationen return; } void main() { // erzeuge ein array for(i=0;i<1000000;i++) { //bestücke das array und rufe den rechenknecht numbercruncher(array); } return; }
Frage:
- wie müsste die funktion deklariert sein damit der Compiler gleich den Code der Funktion in die Hauptroutine einfügt?
- kann ich die funktion so deklarieren dass sie persistent im L1 Cash im CPU Register gehalten wird? (ich brauche maximale echtzeit performance)
- ich könnte natürlich den Code manuell einfügen. Das würde die main() aber unleserlich machenGrüße,
Kevin
-
Unter C++ hast du die Möglichkeit, sie als 'inline' zu definieren (aber dann entscheidet der Compiler immer noch selbst, ob sich die Umsetzung lohnt). Unter C könntest du aus der Funktion ein #define Makro machen (das ist allerdings nicht universell einsetzbar).
Ansonsten solltest du eher ansetzen, in der Funktion nach Optimierungsmöglichkeiten zu suchen.
-
Falls Du C++ verwenden kannst, kannst Du bei bestimmten Compilern auch das (inoffizielle) Schlüsselwort __forcinline verwenden (MS VC++), damit wird die Methode auf jeden Fall inline.
- kann ich die funktion so deklarieren dass sie persistent im L1 Cash im CPU Register gehalten wird? (ich brauche maximale echtzeit performance)
Nein explizit geht das IMHO nicht. Du kannst zur Optimierung vllt einige Varialben als register-Variablen definieren (-> Gibts die schon in C ?! - bin ich mir mal grad nicht so sicher *g*). Ob diese aber später wirklich im CPU-Register landen entscheidet der Compiler. Wenn Du noch mehr Performance brauchst, lohnt es sich vllt auch rechenintensive Codeabschnitte in Assembler zu schreiben, wenn Du das kannst.
Ansonsten kann ich mich dem nur anschließen:
CStoll schrieb:
Ansonsten solltest du eher ansetzen, in der Funktion nach Optimierungsmöglichkeiten zu suchen.
-
- inline gibt es seit C99
- register mindestens seit C89
-
Ah okay danke; sowas hab ich nit im Kopf^^
Haste mal n Link, wo man sowas nachschlagen/einsehen kann ?
-
Tim schrieb:
- inline gibt es seit C99
- register mindestens seit C89Bei register gibt der VStudio.NET 2003 folgende Warnung aus: invalid storage class
..da bleiben ja nicht mehr viele Möglichkeiten übrig. Grüße, KO
-
lovepulse schrieb:
Tim schrieb:
- inline gibt es seit C99
- register mindestens seit C89Bei register gibt der VStudio.NET 2003 folgende Warnung aus: invalid storage class
..da bleiben ja nicht mehr viele Möglichkeiten übrig. Grüße, KO
Dann machst du was falsch.
-
register steht schon in K&R. Aber jeder der sich damit auskennt, beschwört
mir, dass es nutzlos ist.Bei register gibt der VStudio.NET 2003 folgende Warnung aus: invalid storage class
Es können nur kleine Objekte vom Typ register sein (sie müssen ja auch hineinpassen), also typischerweise chars, ints und Zeiger. Ob ein GNU long long oder eine Struktur hineingehen, muss man probieren.
Es ist gar nicht so unüblich, Makros zu verwenden, um Funktionsaufrufe zu vermeiden: siehe z.b:
#define getc(_stream) (--(_stream)->_cnt >= 0 \ ? 0xff & *(_stream)->_ptr++ : _filbuf(_stream))
-
Ob die register-Variable passt oder nicht ist aber schnuppe. Das entscheidet der Compiler! Passt sie nicht wird sie automatisch auto.
-
lovepulse schrieb:
- ich könnte natürlich den Code manuell einfügen. Das würde die main() aber unleserlich machen[/b]
wenn das hilft, dann mach es so
...oder als makro (hat schon jemand erwähnt).
soll das auf dem prozessor laufen, der in deiner signatur steht? wenn ja, vielleicht kannste die funktion parallelisieren....