Estoy usando la extensión de vector GCC SIMD para un proyecto, todo funciona bastante bien pero se lanza, simplemente restablecen todos los componentes de un vector.Cómo lanzar vectores SIMD int para flotar en GCC?
Los manual estados:
Es posible lanzar desde un tipo de vector a otro, siempre que sean del mismo tamaño (de hecho, también se pueden lanzar vectores hacia y desde otros tipos de datos de la misma tamaño).
Aquí está un ejemplo sencillo:
#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]);
}
Compilar con gcc cast.c -O3 -o cast
y funcionando en mi máquina me sale:
1 2 3 4
0.100000 0.200000 0.300000 0.400000
0.000000 0.000000 0.000000 0.000000 <-- no no no
No soy ese guru ensamblador, pero acabo de ver algunos movimientos byte aquí:
[...] 400454: f2 0f 10 1d 1c 02 00 movsd 0x21c(%rip),%xmm3 40045b: 00 40045c: bf 49 06 40 00 mov $0x400649,%edi 400461: f2 0f 10 15 17 02 00 movsd 0x217(%rip),%xmm2 400468: 00 400469: b8 04 00 00 00 mov $0x4,%eax 40046e: f2 0f 10 0d 12 02 00 movsd 0x212(%rip),%xmm1 400475: 00 400476: f2 0f 10 05 12 02 00 movsd 0x212(%rip),%xmm0 40047d: 00 40047e: 48 83 c4 08 add $0x8,%rsp 400482: e9 59 ff ff ff jmpq 4003e0
I s use el vector equivalente al escalar:
*(int *)&float_value = int_value;
¿Cómo se puede explicar este comportamiento?
Sí, eso es lo que parece que está sucediendo - una conversión de bit a bit. (o más bien, no hay conversión en absoluto) Así que obtienes 4 flotadores desnormalizados en lugar de una conversión de valor real. – Mysticial
Eso es lo que los moldes de vectores están definidos para hacer (cualquier otra cosa sería completamente loca, y haría que las expresiones de programación de vectores estándar fueran muy dolorosas de escribir). Si desea obtener una conversión, probablemente desee utilizar un tipo de intrínseco, como '_mm_cvtepi32_ps' (esto rompe la buena independencia arquitectónica de su código de vector, por supuesto, que también es molesto, un enfoque común es usar un encabezado de traducción que define un conjunto portátil de "intrínsecos"). –
Puedo ver su punto, pero la pregunta es: ¿cuándo será útil este _cast_? – cYrus