我正在尝试将SIMD整数变量转换为双精度型。但是我看不到此操作的结果。
例:

int arr[8]={12345678,12333333,12344444,12355555,12366666,12377777,12388888,12399999};
__m256i temp = _mm256_load_si256((__m256i *) arr);
__m256d temp2 = _mm256_castsi256_pd (temp);


作为此操作的结果,我的temp2中有哪些成员?

最佳答案

简短答案

temp2中的成员将是:

{4.014635e-305, 4.062922e-305, 4.111209e-305, 4.159495e-305}


如何获得价值

只需将SIMD数据写回double数组并打印即可。

#include <stdio.h>
#include <immintrin.h>

int main(void) {
    int hoge[4]; /* hack that worked on tested environment to avoid Segmentation Fault */
    double result[4];
    int i;

    int arr[8]={12345678,12333333,12344444,12355555,12366666,12377777,12388888,12399999};
    __m256i temp = _mm256_load_si256((__m256i *) arr);
    __m256d temp2 = _mm256_castsi256_pd (temp);

    _mm256_storeu_pd(result, temp2);
    for (i = 0; i < 4; i++) printf("result[%d] = %.6e (%.15a)\n", i, result[i], result[i]);
    return 0;
}


I ran this code on Wandbox并得到以下输出:

result[0] = 4.014635e-305 (0x1.c311500bc614e00p-1012)
result[1] = 4.062922e-305 (0x1.c87e300bc5c7c00p-1012)
result[2] = 4.111209e-305 (0x1.cdeb100bcb34a00p-1012)
result[3] = 4.159495e-305 (0x1.d357f00bd0a1800p-1012)


您可以通过double将SIMD数据写入_mm256_storeu_pd()数组。

当未对齐32字节的地址传递给_mm256_load_si256()时,可能会生成异常,因此您应该进行对齐。实际上,分割错误发生在Wandbox上,因此我插入了虚拟数组hoge进行对齐。

为什么获得价值

_mm256_castsi256_pd()实际上只是复制字节并更改其解释。

假设使用little-endian,并且int为4字节长,
arr中的数据在字节寻址的存储器中是这样的:

data in arr[8]:
|   12345678|   12333333|   12344444|   12355555|   12366666|   12377777|   12388888|   12399999|
byte data in arr[8] (in little endian):
|4e 61 bc 00|15 31 bc 00|7c 5c bc 00|e3 87 bc 00|4a b3 bc 00|b1 de bc 00|18 0a bd 00|7f 35 bd 00|
data seen as 64-bit hex:
|     0x00bc311500bc614e|     0x00bc87e300bc5c7c|     0x00bcdeb100bcb34a|     0x00bd357f00bd0a18|


然后,假设在double中使用了64位的IEEE754,则64位的数据由1位符号,11位指数和52位有效数字组成。

以第一个元素0x00bc311500bc614e为例,符号位为0(正/零),指数为0x00b(11-1023 = -1012),有效位数为0xc311500bc614e

这与上面的示例代码中通过%.15a打印的内容匹配。
(打印了两个额外的0,因为指定了打印15位,而仅对13位的数据进行了重新排序,因此其余部分用0填充。)
其他元素也这样匹配。

关于c++ - SIMD __m256i至__m256d转换结果,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54911407/

10-11 18:37