gpt4 book ai didi

c++ - SSE 内在函数导致正常的浮点运算返回 -1.#INV

转载 作者:可可西里 更新时间:2023-11-01 18:27:33 25 4
gpt4 key购买 nike

我在编写执行音频处理的 SSE 方法时遇到问题。我在这里根据英特尔的论文实现了一个 SSE 随机函数:

http://software.intel.com/en-us/articles/fast-random-number-generator-on-the-intel-pentiumr-4-processor/

我还有一个方法也使用 SSE 执行从 Float 到 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 正在进入未知状态或其他状态。

最佳答案

混合 SSE 整数运算和(常规)浮点运算。可能会产生奇怪的结果,因为两者都在相同的寄存器上运行。如果您使用:

_mm_empty()

FPU 被重置为正确的状态。微软有 Guidelines for When to Use EMMS

关于c++ - SSE 内在函数导致正常的浮点运算返回 -1.#INV,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9052551/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com