我有一個SSE方法我寫執行音頻處理的問題。我已經實現了基於Intel的紙這裏SSE隨機函數:SSE內在引起正常浮動操作返回-1。#INV
我也有一個使用SSE還執行從浮點轉換到S16的方法,轉換很簡單如下進行:
unsigned int Float_S16LE(float *data, const unsigned int samples, uint8_t *dest)
{
int16_t *dst = (int16_t*)dest;
const __m128 mul = _mm_set_ps1((float)INT16_MAX);
__m128 rand;
const uint32_t even = count & ~0x3;
for(uint32_t i = 0; i < even; i += 4, data += 4, dst += 4)
{
/* random round to dither */
FloatRand4(-0.5f, 0.5f, NULL, &rand);
__m128 rmul = _mm_add_ps(mul, rand);
__m128 in = _mm_mul_ps(_mm_load_ps(data),rmul);
__m64 con = _mm_cvtps_pi16(in);
memcpy(dst, &con, sizeof(int16_t) * 4);
}
}
FloatRand4定義如下:
static inline void FloatRand4(const float min, const float max, float result[4], __m128 *sseresult = NULL)
{
const float delta = (max - min)/2.0f;
const float factor = delta/(float)INT32_MAX;
...
}
sseresult != NULL
如果所述__m128
返回結果,result
未使用。 這在第一環路完全執行,但在下一循環delta
變得-1.#INF
代替1.0
。如果我將這一行註釋掉__m64 con = _mm_cvtps_pi16(in);
,問題就會消失。
我認爲FPU是進入一個未知的狀態或東西。
_mm_cvtps_pi16是一個壞主意。使用_mm_cvtps_epi32,_mm_packs_epi32和_mm_store_si128/_mm_storeu_si128的組合將8個浮點數轉換爲8個int16_t,並且問題消失了! – 2012-01-30 05:08:28