Erreur: transfert des types de données définis par l’utilisateur dans c

Ceci est une vue plus simple de mon problème. Je souhaite convertir une valeur float en type défini v4si (je souhaite utiliser l’opération SIMD pour l’optimisation.) Veuillez aider à convertir les valeurs float / double en un type défini.

#include typedef double v4si __atsortingbute__ ((vector_size (16))); int main() { double stoptime=36000; float x =0.5*stoptime; float * temp = &x; v4si a = ((v4si)x); // Error: Incompatible data types v4si b; v4si *c; c = ((v4si*)&temp); // Copies address of temp, b = *(c); printf("%f\n" , b); // but printing (*c) crashes program } 

Vous n’avez pas besoin de définir un type de vecteur SIMD personnalisé ( v4si ) ni de déconner avec les conversions et le type punning – utilisez simplement les éléments insortingnsèques fournis dans l’en-tête *insortingn.h approprié, par exemple

 #include  // use SSE insortingnsics int main(void) { __m128 v; // __m128 is the standard SSE vector type for 4 x float float x, y, z, w; v = _mm_set_ps(x, y, z, w); // use insortingnsic to set vector contents to x, y, z, w // ... return 0; } 

Vous semblez utiliser des extensions vectorielles GCC . Le code suivant montre comment faire des émissions, vector + scalaire, vector * scalaire, charger et stocker en utilisant des extensions vectorielles. #comprendre

 #if defined(__clang__) typedef float v4sf __atsortingbute__((ext_vector_type(4))); #else typedef float v4sf __atsortingbute__ ((vector_size (16))); #endif void print_v4sf(v4sf a) { for(int i=0; i<4; i++) printf("%f ", a[i]); puts(""); } int main(void) { v4sf a; //broadcast a scalar a = ((v4sf){} + 1)*3.14159f; print_v4sf(a); // vector + scalar a += 3.14159f; print_v4sf(a); // vector*scalar a *= 3.14159f; print_v4sf(a); //load from array float data[] = {1, 2, 3, 4}; a = *(v4sf*)data; //a = __builtin_ia32_loadups(data); //store to array float store[4]; *(v4sf*)store = a; for(int i=0; i<4; i++) printf("%f ", store[i]); puts(""); } 

Clang 4.0 et ICC 17 prennent en charge un sous-ensemble des extensions de vecteur GCC. Cependant, aucun d’entre eux ne prend en charge les opérations vector + scalar ou vector*scalar que GCC prend en charge. Une solution pour Clang consiste à utiliser les extensions vectorielles OpenCL de Clang. Je ne connais pas de solution de rechange pour ICC. MSVC ne prend en charge aucun type d’extension vectorielle à ma connaissance.

Avec GCC, même s'il prend en charge vector + scalar et vector*scalar vous ne pouvez pas vector = scalar (mais vous le pouvez avec les extensions vectorielles OpenCL de Clang). Au lieu de cela, vous pouvez utiliser cette astuce .

 a = ((v4sf){} + 1)*3.14159f; 

Je ferais comme le suggère Paul R et utiliserais des composants insortingnsèques compatibles avec les quatre principaux compilateurs C / C ++: GCC, Clang, ICC et MSVC.

Voici un tableau de ce que chaque compilateur prend en charge en utilisant les extensions vectorielles de GCC et les extensions vectorielles OpenCL de Clang.

  gcc g++ clang icc OpenCL unary operations [] yes yes yes yes yes +, – yes yes yes yes yes ++, -- yes yes no no no ~ yes yes yes yes yes ! no yes no no yes binary vector op vector +,–,*,/,% yes yes yes yes yes &,|,^ yes yes yes yes yes >>,<< yes yes yes yes yes ==, !=, >, <, >=, <= yes yes yes yes yes &&, || no yes no no yes binary vector op scalar +,–,*,/,% yes yes no no yes &,|,^ yes yes no no yes >>,<< yes yes no no yes ==, !=, >, <, >=, <= yes yes no no yes &&, || no yes no no yes assignment vector = vector yes yes yes yes yes vector = scalar no no no no yes ternary operator ?: no yes no no ? 

Nous voyons que Clang et ICC ne supportent pas les opérations vector operator scalar de GCC. GCC en mode C ++ supporte tout sauf le vector = scalar . Les extensions vectorielles OpenCL de Clang supportent tout sauf peut-être l'opérateur ternaire. La documentation de Clang le prétend, mais je ne le fais pas fonctionner. GCC en mode C supplémentaire ne prend pas en charge les opérateurs logiques binarys ni l’opérateur ternaire.