Sto usando l'estensione vettoriale GCC SIMD per un progetto, tutto funziona abbastanza bene ma, al contrario, ripristinano semplicemente tutti i componenti di un vettore.Come convertire i vettori int per renderli mobili in GCC?
I manual stati:
E 'possibile lanciare da un tipo di vettore a un altro, a condizione che siano della stessa dimensione (in realtà, si possono anche lanciare vettori da e per altri tipi di dati dello stesso dimensione).
Ecco un semplice esempio:
#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]);
}
Compilare con gcc cast.c -O3 -o cast
e in esecuzione sulla mia macchina ottengo:
1 2 3 4
0.100000 0.200000 0.300000 0.400000
0.000000 0.000000 0.000000 0.000000 <-- no no no
Io non sono quel guru assembler, ma ho solo vedere alcuni movimenti di byte qui:
[...] 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 utilizzare l'equivalente vettoriale dello scalare:
*(int *)&float_value = int_value;
Come si può spiegare questo comportamento?
Sì, questo è quello che sembra che sta accadendo - una conversione bit per bit. (o meglio, nessuna conversione) Quindi ottieni 4 float denormalizzati invece di una conversione di valore reale. – Mysticial
Questo è ciò che i cast di vettore sono definiti da fare (qualsiasi altra cosa sarebbe completamente disonesta, e renderebbe molto penoso scrivere degli idiomi di programmazione vettoriali standard). Se si vuole effettivamente ottenere una conversione, probabilmente si vorrà usare un intrinseco di qualche tipo, come '_mm_cvtepi32_ps' (questo rompe la bella indipendenza architettonica del codice vettoriale, naturalmente, che è anche fastidioso; un approccio comune è utilizzare un'intestazione di traduzione che definisce un set portatile di "intrinseci"). –
Posso vedere il tuo punto, ma la domanda diventa: quando questo _cast_ sarebbe utile? – cYrus