gpt4 book ai didi

c - 如何将 SIMD int vector 转换为在 GCC 中 float ?

转载 作者:太空狗 更新时间:2023-10-29 17:07:20 25 4
gpt4 key购买 nike

我正在为一个项目使用 GCC SIMD vector 扩展,一切都运行良好,但强制转换,它们只是重置 vector 的所有组件。

manual状态:

It is possible to cast from one vector type to another, provided they are of the same size (in fact, you can also cast vectors to and from other datatypes of the same size).

这是一个简单的例子:

#include <stdio.h>

typedef int int4 __attribute__ (( vector_size( sizeof( int ) * 4 ) ));
typedef float float4 __attribute__ (( vector_size( sizeof( float ) * 4 ) ));

int main()
{
int4 i = { 1 , 2 , 3 , 4 };
float4 f = { 0.1 , 0.2 , 0.3 , 0.4 };

printf( "%i %i %i %i\n" , i[0] , i[1] , i[2] , i[3] );
printf( "%f %f %f %f\n" , f[0] , f[1] , f[2] , f[3] );

f = ( float4 )i;

printf( "%f %f %f %f\n" , f[0] , f[1] , f[2] , f[3] );
}

使用 gcc cast.c -O3 -o cast 编译并在我的机器上运行我得到:

1 2 3 4
0.100000 0.200000 0.300000 0.400000
0.000000 0.000000 0.000000 0.000000 <-- no no no

我不是那种汇编大师,但我只是在这里看到了一些字节移动:

[...]400454:       f2 0f 10 1d 1c 02 00    movsd  0x21c(%rip),%xmm340045b:       00 40045c:       bf 49 06 40 00          mov    $0x400649,%edi400461:       f2 0f 10 15 17 02 00    movsd  0x217(%rip),%xmm2400468:       00 400469:       b8 04 00 00 00          mov    $0x4,%eax40046e:       f2 0f 10 0d 12 02 00    movsd  0x212(%rip),%xmm1400475:       00 400476:       f2 0f 10 05 12 02 00    movsd  0x212(%rip),%xmm040047d:       00 40047e:       48 83 c4 08             add    $0x8,%rsp400482:       e9 59 ff ff ff          jmpq   4003e0 

I suspect the vector equivalent of the scalar:

*( int * )&float_value = int_value;

你如何解释这种行为?

最佳答案

这就是 vector 转换被定义要做的事情(任何其他事情都将是完全疯狂的,并且会使标准的 vector 编程习语编写起来非常痛苦)。如果你想真正得到一个转换,你可能想要使用某种内在函数,比如 _mm_cvtepi32_ps定义一组可移植的“内在函数”的翻译 header 。

为什么这有用?原因多种多样,但这是最大的原因:

在 vector 代码中,您几乎不想分支。相反,如果你需要有条件地做某事,你会评估条件的两边,并使用掩码逐条选择合适的结果。这些掩码 vector “自然地”具有整数类型,而您的数据 vector 通常是 float ;您想使用逻辑运算将两者结合起来。如果 vector 转换只是重新解释位,那么这种极其常见的习惯用法是最自然的。

诚然,有可能解决这种情况,或任何其他常见 vector 习语,但“vector 是一包位”的观点非常普遍,反射(reflect)了大多数 vector 程序员的思维方式。

关于c - 如何将 SIMD int vector 转换为在 GCC 中 float ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12375159/

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