Thu
27
Nov 2008
Pod hasłem Compiler Intrinsics kryje się w MSDN Library bardzo ciekawy rozdział. Opisuje niskopoziomowe funkcje, których dostarcza sam kompilator i które pozwalają wykorzystywać różne instrukcje asemblera bez sięgania po wstawki w tym trudnym języku, zwyczajnie jako funkcje C++. Pośród tych funkcji są np. wspomagające programowanie równoległe (jak _ReadWriteBarrier, _InterlockedCompareExchange), __emul mnożąca liczby 32-bitowe do liczby 64-bitowej, _rotl przesuwająca bity z zawinięciem czy __cpuid zwracająca informacje o możliwościach procesora.
Także wiele funkcji biblioteki standardowej C posiada swoje implementaje jako intrinsics, które powinny zamieniać się na instrukcje asemblera zamiast wywołań. Należą do nich np. abs, sin, pow, strlen, strcpy. Trzeba tylko je włączyć za pomocą #pragma intrinsic lub /Oi (Generate Intrinsic Functions).
W praktyce to nie jest takie proste. Zadeklarowanie strcpy jako intrinsic przyspieszyło wprawdzie mój test z 2.5439 do 2.4976 sekundy, ale ta funkcja kompiluje się do asemblerowego rep movs w konfiguracji Release niezależnie od jej zadeklarowania jako intrinsic. Z kolei cosf tak czy siak zamienia się na wywołanie call.
Comments | #c++ #visual studio Share