Tag: avx2

将__m256i存储为整数

如何将__m256i数据类型存储为整数? 我知道浮子有: _mm256_store_ps(float *a, __m256 b) 其中第一个参数是输出数组。 对于整数我只发现: _mm256_store_si256(__m256i *a, __m256i b) 其中两个参数都是__m256i数据类型。 做这样的事情就足够了: int * X = (int*) _mm_malloc( N * sizeof (*X) ,32 ); (我使用它作为函数的参数,我想获得它的值) 内部function: __m256i * Xmmtype = (__m256i*) X; //fill output _mm256_store_si256( &Xmmtype[ i ] , T ); //T is __m256i 这个可以吗? – – -更新 – – – – – […]

gdb反向调试avx2

所以我有一个新的花式cpu支持avx2指令集。 这很好,但打破了gdb反向调试。 在没有优化的情况下进行编译时,代码仍然使用共享库,例如调用memset()然后调用memset的avx2优化版本。 这很好,但gdb记录不支持avx2。 进程记录不支持地址0x7ffff690dd80处的指令0xc5。 0xc5是这里的vex前缀。 反向调试适用于不支持avx2的cpu。 如何让libc等不使用avx2优化版本的库调用,以便我可以使用gdb记录,向后退步等? 我试过了 LD_BIND_NOW=1 LD_HWCAP_MASK=0 compiling with -static 如果没有在旧机器上调试,我就没有想法了。

乘以int64_t数组的最快方法?

我想矢量化两个内存对齐数组的乘法。 我没有找到任何方法在AVX / AVX2中乘以64 * 64位,所以我只是循环展开和AVX2加载/存储。 有更快的方法吗? 注意:我不想保存每次乘法的高半结果。 void multiply_vex(long *Gi_vec, long q, long *Gj_vec){ int i; __m256i data_j, data_i; __uint64_t *ptr_J = (__uint64_t*)&data_j; __uint64_t *ptr_I = (__uint64_t*)&data_i; for (i=0; i<BASE_VEX_STOP; i+=4) { data_i = _mm256_load_si256((__m256i*)&Gi_vec[i]); data_j = _mm256_load_si256((__m256i*)&Gj_vec[i]); ptr_I[0] -= ptr_J[0] * q; ptr_I[1] -= ptr_J[1] * q; ptr_I[2] -= ptr_J[2] * q; ptr_I[3] […]

如何执行_mm256_movemask_epi8(VPMOVMSKB)的反转?

内在的: int mask = _mm256_movemask_epi8(__m256i s1) 创建一个掩码,其32位对应于s1的每个字节的最高位。 在使用位操作(例如BMI2 )操作掩码之后,我想执行_mm256_movemask_epi8的反转,即创建__m256i向量,其中每个字节的最高有效位包含uint32_t mask的相应位。 做这个的最好方式是什么? 编辑:我需要执行逆操作,因为内部_mm256_blendv_epi8只接受__m256i类型的掩码而不是uint32_t 。 因此,在生成的__m256i掩码中,我可以忽略每个字节的MSB以外的位。