Schnelle Doppel -> kurze Umrüstzeit mit Spann SSE mit?
Frage
Gibt es eine schnelle Möglichkeit, doppelte Werte zu kurzen Hosen (16 Bit signed) zu werfen, die derzeit so etwas wie dies ich tue:
double dval = <sum junk>
int16_t sval;
if (val > int16_max) {
sval = int16_max;
} else if (val < int16_min) {
sval = int16_min;
} else
sval = (int16_t)val;
Ich vermute, es gibt eine schnelle Möglichkeit, dies mit SSE zu tun, dass wesentlich effizienter sein wird.
Lösung
Sehen Sie minsd, maxsd und cvtsd2si, oder wenn Sie wollen 2 parallel dann Gebrauch minpd, maxpd und cvtpd2dq tun.
Der einzige wirkliche Bonus die erste Methode ist, dass Sie speichern die Zweige. Der SSE2-Code generiert wird, ziemlich viel, so schnell wie Doppel mit Code sowieso SSE2 zusammengestellt ... Der wahre Sieg kommt zu einem Zeitpunkt, 2 von ihnen zu tun.
Edit: Wenn Sie es mit Visual Studio intrinsics tun wollte dann glaube ich, den Code wie folgt aussehen würde:
__m128d sseDbl = _mm_set_sd( dbl );
sseDbl = _mm_min_sd( dbl, _mm_set_sd( 32767.0 ) );
sseDbl = _mm_max_sd( dbl, _mm_set_sd( -32768.0 ) );
short shrtVal = (short)_mm_cvtsd_si32( sseDbl );
Und Arbeit geleistet. Doing it Assembler ist ziemlich ähnlich wie gut, aber die oben würden Sie auf jeden Fall eine bessere Leistung mit Visual Studio geben.