28得票3回答
如何在256位AVX(YMM)寄存器中交换低128位和高128位?

我正在将SSE SIMD代码移植为使用256位AVX扩展,并且似乎找不到可以混合/洗牌/移动高128位和低128位的任何指令。 背景故事: 我真正想要的是VHADDPS / _mm256_hadd_ps像HADDPS/_mm_hadd_ps一样工作,只是用256位字。不幸的是,它的行为类似...

27得票4回答
如何使用SSE/AVX高效地执行double/int64转换?

SSE2有指令可用于在单精度浮点数和32位整数之间进行向量转换。 _mm_cvtps_epi32() 可将单精度浮点数向量转换为 32 位整数向量。 _mm_cvtepi32_ps() 可将32位整数向量转换为单精度浮点数向量。 但是双精度和64位整数没有相应的指令可用,也就是说,缺少...

27得票2回答
为什么执行浮点数矩阵乘法比整数矩阵乘法更快?

拥有两个int矩阵A和B,超过1000行和1万列,我经常需要将它们转换为浮点矩阵以获得加速(4倍或更多)。 我想知道这是为什么?我意识到有很多优化和矢量化,例如AVX等与浮点矩阵乘法相关的内容。但是,如果我没有弄错的话,还有像AVX2这样的整数指令。那么,不能使用SSE和AVX进行整数计算吗?...

26得票2回答
AVX2中的gather指令是如何实现的?

假设我正在使用AVX2的VGATHERDPS,这应该使用8个DWORD索引来加载8个单精度浮点数。 当要加载的数据存在于不同的高速缓存行中时会发生什么?该指令是否作为硬件循环实现,逐个获取高速缓存行?还是它可以一次发出多个高速缓存行的加载? 我阅读了几篇论文,其中提到了前者(并且这是我更能...

26得票5回答
如何执行 _mm256_movemask_epi8 (VPMOVMSKB) 的反操作?

内在价值:int mask = _mm256_movemask_epi8(__m256i s1) 创建一个掩码,其32位对应于s1每个字节的最高有效位。使用位操作(例如BMI2)操作掩码后,我想执行_mm256_movemask_epi8的反操作,即创建一个__m256i向量,其中每个字节的最...

26得票2回答
如何最快地对 int64_t 类型的数组进行乘法运算?

我想将两个内存对齐的数组向量化相乘。我没有找到AVX / AVX2中64*64位相乘的方法,所以我只是展开循环并使用AVX2加载/存储。有更快的方法吗? 注意:我不想保存每次乘法的高半部分结果。void multiply_vex(long *Gi_vec, long q, long *Gj_...

25得票1回答
不更改代码,使用gcc的函数多版本控制是否可行?

根据大多数基准测试,英特尔的Clear Linux比其他发行版快得多,主要得益于GCC特性“函数多版本”。现在他们使用的方法是编译代码、分析哪个函数包含向量化循环,然后使用FMV属性修补代码并重新编译。 GCC自动执行这项操作有多可行呢?例如,通过传递-mmultiarch=sandybrid...

23得票3回答
使用AVX指令进行水平向量求和的最快方法

我有一个包含四个64位浮点数值的紧凑型向量。 我希望获取该向量元素的总和。 使用SSE(并使用32位浮点数),我可以执行以下操作:v_sum = _mm_hadd_ps(v_sum, v_sum); v_sum = _mm_hadd_ps(v_sum, v_sum); 很遗憾,即使AVX具有...

23得票5回答
如何在Mac OS X上使用AVX/pclmulqdq技术

我正在尝试编译一个使用新Intel处理器中的pclmulqdq指令的程序。我使用macports安装了GCC 4.6,但是当我编译使用内在_mm_clmulepi64_si128的程序时,我遇到了问题。 /var/folders/ps/sfjmtgx5771_qbqnh4c9xclr0000...

23得票2回答
GCC中的FMA3:如何启用

我有一台i5-4250U处理器,支持AVX2和FMA3指令集。我在Linux上编写了一些稠密矩阵乘法的代码,并使用GCC 4.8.1进行了测试。下面是我编译的三种不同方式:SSE2: gcc matrix.cpp -o matrix_gcc -O3 -msse2 -fopenmp AV...