gpt4 book ai didi

c++ - 从double转换为__m128

转载 作者:行者123 更新时间:2023-12-02 09:54:48 25 4
gpt4 key购买 nike

我正在寻找一种将 double 型转换为_m128的方法,以利用内部指令的优势。

我尝试使用:

double d = 7654321.1234567;
_m128 ret = *reinterpret_cast<__m128*>(d);

但是我当然知道了:
error: invalid cast from type ‘double’ to type ‘__m128* {aka __vector(4) float*}’

任何帮助将不胜感激,内联组装解决方案很好〜

最佳答案

假设您实际上想要的是double(__m128d)的 vector ,那么您正在寻找 _mm_set_sd(d)将double零扩展为__m128d,例如_mm_set_pd(0, d)

参见Intel's intrinsics guide。我通过搜索(double来找到带有double(或double*)arg的内在函数的方法。
__m128是4个float的 vector ;您是否想要double-> float转换为 vector 的低位元素?像_mm_set_ps(0.f, 0.f, 0.f, d);
您不希望将__m128d*指向标量 double ,因为 vector 的宽度是double的两倍。如果有什么用的话,那就是(__m128d)d或它的静态或reinterpret_cast版本。

但是,不幸的是,即使标量float / double和__m128d自然地存在于XMM寄存器中,也无法将double转换为带有未定义的上层元素AFAIK的__m128d。参见How to merge a scalar into a vector without the compiler wasting an instruction zeroing upper elements? Design limitation in Intel's intrinsics?

如果仅使用标量内在函数然后提取标量结果,则某些编译器(很可能仍然只是clang)可以优化零扩展或广播到__m128d vector 中。其他编译器实际上在上层元素上浪费了指令。

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

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