gpt4 book ai didi

c++ - SSE:将 __m128 转换为 float

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:11:24 25 4
gpt4 key购买 nike

我有以下一段 C 代码:

__m128 pSrc1 = _mm_set1_ps(4.0f);
__m128 pDest;
int i;
for (i=0;i<100;i++) {
m1 = _mm_mul_ps(pSrc1, pSrc1);
m2 = _mm_mul_ps(pSrc1, pSrc1);
m3 = _mm_add_ps(m1, m2);
pDest = _mm_add_ps(m3, m3);
}

float *arrq = (float*) pDest;

for 循环结束之前的一切都有效。我现在要做的是将 __m128 类型转换回 float。因为它存储了 4 个 float ,所以我想我可以很容易地将它转换回 float *。我究竟做错了什么? (这是一个测试代码,所以不要怀疑)。我基本上尝试了所有我能想到的可能的转换。感谢您的帮助。

最佳答案

您可以使用_mm_store_ps__m128 vector 存储到 float 组中。

alignas(16) float result [4];
_mm_store_ps (result, pDest);

// If result is not 16-byte aligned, use _mm_storeu_ps
// On modern CPUs this is just as fast as _mm_store_ps if
// result is 16-byte aligned, but works in all other cases as well
_mm_storeu_ps (result, pDest);

然后您可以访问该临时数组中的任何/所有元素,如果幸运的话,如果效率更高,编译器会将其转换为随机播放而不是存储/重新加载。 (如果目的地不仅仅是临时的,并且您实际上希望将所有 4 个元素都存储在某个地方,那么 _mm_storeu_psstore 正是您想要的。)

如果您只需要低元素,float _mm_cvtss_f32(__m128) 就不错。

如果您想在对数组求和或进行点积的循环之后将 vector 元素组合成单个 float ,请参阅 Fastest way to do horizontal SSE vector sum (or other reduction)

关于c++ - SSE:将 __m128 转换为 float ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14367553/

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