Gibt es eine Möglichkeit für C-Code zu sagen, ob es in einer Architektur kompiliert wird, wo die Multiplikation schnell ist? Gibt es ein Makro __FAST_MULT__
oder etwas, das auf diesen Architekturen definiert ist?Gibt es eine Möglichkeit in C, zur Kompilierzeit zu überprüfen, ob Sie sich in einer Architektur befinden, in der die Multiplikation schnell ist?
Angenommen, Sie implementieren eine Funktion zum Ermitteln der Hamming-Gewichtung einer 64-Bit-Ganzzahl über die Shift-and-Add-Methode *. Es gibt two optimal algorithms for that: man benötigt 17 Rechenoperationen, während die andere nur 12 benötigt, aber eine davon ist eine Multiplikationsoperation. Der zweite Algorithmus ist also 30% schneller, wenn Sie auf Hardware laufen, wo Multiplikation die gleiche Zeit wie Addition benötigt - aber viel, viel langsamer auf einem System, wo die Multiplikation als wiederholte Addition implementiert wird.
Wenn also eine solche Funktion zu schreiben, wäre es sinnvoll sein, um bei der Kompilierung zu überprüfen, ob dies der Fall ist, und wechseln Sie zwischen den beiden Algorithmen entsprechend:
unsigned int popcount_64(uint64_t x) {
x -= (x >> 1) & 0x5555555555555555; // put count of each 2 bits into those 2 bits
x = (x & 0x3333333333333333) + ((x >> 2) & 0x3333333333333333); // put count of each 4 bits into those 4 bits
x = (x + (x >> 4)) & 0x0f0f0f0f0f0f0f0f; // put count of each 8 bits into those 8 bits
#ifdef __FAST_MULT__
return (x * 0x0101010101010101)>>56; // returns left 8 bits of x + (x<<8) + (x<<16) + (x<<24) + ...
#else // __FAST_MULT__
x += x >> 8; // put count of each 16 bits into their lowest 8 bits
x += x >> 16; // put count of each 32 bits into their lowest 8 bits
x += x >> 32; // put count of each 64 bits into their lowest 8 bits
return x & 0x7f;
#endif // __FAST_MULT__
}
Gibt es eine Möglichkeit zu tun Dies?
* Ja, mir sind die __builtin_popcount()
Funktionen bekannt; Dies ist nur ein Beispiel.
ich die meisten Pakete glaube, die so etwas tun, entweder Verwendung Konfigurationsflags vor dem Kompilieren oder irgendeine Art von automatisierten Performance-Tests durchführen richtig diese Flags zu setzen. –
Genau deshalb gibt es Compiler-Built-Ins. – Olaf