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.

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top