Je dois convertir un vecteur float (__m128) en un vecteur entier (__m128i). J’utilise _mm_cvtps_epi32 , mais je n’obtiens pas la valeur attendue. Voici un exemple très simple: __m128 test = _mm_set1_ps(4.5f); __m128i test_i = _mm_cvtps_epi32(test); La sortie du débogueur que je reçois: (lldb) po test ([0] = 4.5, [1] = 4.5, [2] = 4.5, [3] […]
Le guide insortingnsèque d’Intel dit: __m128i _mm_i32gather_epi32 (int const* base_addr, __m128i vindex, const int scale) Et: La description Rassemblez des entiers 32 bits à partir de la mémoire en utilisant des index 32 bits. Les éléments 32 bits sont chargés à partir d’adresses commençant par base_addr et décalés par chaque élément 32 bits dans vindex […]
J’ai le problème suivant que je dois résoudre en utilisant autre chose que AVX2. J’ai 3 valeurs stockées dans une variable m128i (la 4ème valeur n’est pas nécessaire) et j’ai besoin de décaler ces valeurs de 4,3,5. J’ai besoin de deux fonctions. Un pour le décalage logique droit par ces valeurs et un autre pour […]
J’essaie d’utiliser OpenMP pour la parallélisation d’un code déjà vectorisé avec des éléments insortingnsèques, mais le problème est que j’utilise un registre XMM en tant que “variable” extérieure pour laquelle j’incrémente chaque boucle. Pour l’instant j’utilise la clause shared __m128d xmm0 = _mm_setzero_pd(); __declspec(align(16)) double res[2]; #pragma omp parallel for shared(xmm0) for (int i = […]
J’essaie de créer un programme utilisant des éléments insortingnsèques qui compte les éléments> 0 d’un vecteur float Merci à tous pour votre temps.
Nous avons du code qui fonctionne sur plusieurs plates-formes. Le code utilise les éléments insortingnsèques BMI / BMI2 lorsqu’ils sont disponibles, comme un Core i7 5ème génération. GCC fourni par Sun sous Solaris 11.3 définit __BMI__ et __BMI2__ , mais il a des difficultés à localiser les éléments insortingnsèques BMI / BMI2: $ cat test.cxx […]
Supposons que j’ai un __m128i contenant 4 valeurs entières de 32 bits. Est-il possible de le stocker dans un caractère char[4] , où le caractère le plus bas de chaque valeur int est stocké dans une valeur de caractère? Résultat désiré: r1 r2 r3 r4 __m128i 0x00000012 0x00000034 0x00000056 0x00000078 | V char[4] 0x12 0x34 […]
Je n’arrive pas à comprendre comment mettre en œuvre: __m256d min(__m256d A, __m256d B, __m256d C, __m256d D) { __m256d result; // result should contain 4 minimal values out of 16 : A[0], A[1], A[2], A[3], B[0], … , D[3] // moreover it should be result[0] <= result[1] <= result[2] <= result[2] return result; } […]
J’ai deux vecteurs non signés, tous deux de taille 4 vector v1 = {2, 4, 6, 8} vector v2 = {1, 10, 11, 13} Maintenant, je veux multiplier ces deux vecteurs et en obtenir un nouveau vector v_result = {2*1, 4*10, 6*11, 8*13} Quelle est l’opération à utiliser? Est-ce multi-plateforme ou seulement sur certaines plateformes […]
J’essaie d’appliquer le log2 sur une variable __m128. Comme ça: #include int main (void) { __m128 two_v = {2.0, 2.0, 2.0, 2.0}; __m128 log2_v = _mm_log2_ps(two_v); // log_2 := log(2) return 0; } Essayer de comstackr cela retourne cette erreur: error: initializing ‘__m128’ with an expression of incompatible type ‘int’ __m128 log2_v = _mm_log2_ps(two_v); // […]