Articles of insortingnsics

La conversion de __m128 en __m128i donne une valeur incorrecte

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] […]

Comment utiliser vindex et mettre à l’échelle avec _mm_i32gather_epi32 pour rassembler des éléments?

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 […]

Shifiting des valeurs de registre entier xmm utilisant des instructions non-AVX sur une architecture Intel x86

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 […]

OpenMP atomic _mm_add_pd

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 = […]

Compter les positifs du vecteur float en utilisant _mm_cmpgt_pd

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.

En-tête pour _blsr_u64 avec GCC fourni par Sun sous Solaris 11?

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 […]

Extraire 4 entiers SSE à 4 caractères

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 […]

Trouver 4 valeurs minimales dans 4 registres __m256d

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; } […]

Moyen le plus rapide de multiplier deux vecteurs d’entiers 32 bits en C ++, avec SSE

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 […]

C: Utilisation insortingnsèque d’Intel x86 de _mm_log2_ps () -> erreur: type incompatible ‘int’

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); // […]