-
38 votesanswersviews
如何在SSE / AVX中使用融合乘法 - 加法(FMA)指令
我了解到一些Intel / AMD CPU可以同时进行多次加法并添加SSE / AVX:FLOPS per cycle for sandy-bridge and haswell SSE2/AVX/AVX2 . 我想知道如何在代码中做到最好,我也想知道它是如何在CPU内部完成的 . 我的意思是超标量架构 . 假设我想做一个很长的总和,如下面的SSE: //sum = a1*b1 + a2*b2 + ... -
1 votesanswersviews
使用SSE / AVX在Ivy Bridge上进行最大SIMD整数乘法运算?
有人能告诉我如何计算出最大数量的32位无符号整数乘法我可以通过SSE / AVX使用SIMD在Ivy Bridge CPU上同时进行吗? 我知道AVX确实有256位寄存器用于乘法,但这是浮点数(AVX2引入了256位整数寄存器) . 因此,我不太确定使用浮点寄存器进行整数乘法是否更好(如果可能的话)? 另外,我不确定寄存器的数量是否重要,或者我是否需要查看CPU的端口 . 看起来端口0和端口5可以... -
10 votesanswersviews
使用未对齐缓冲区进行矢量化:使用VMASKMOVPS:根据未对齐计数生成掩码?或者根本不使用那个insn
gcc 5.3与 -O3 -mavx -mtune=haswell for x86-64使surprisingly bulky code处理代码的潜在错位输入,如: // convenient simple example of compiler input // I'm not actually interested in this for any real program void floa... -
5 votesanswersviews
为什么gcc只用_mm_set_ss添加这个movss指令?
使用SSE考虑这两个函数: #include <xmmintrin.h> int ftrunc1(float f) { return _mm_cvttss_si32(_mm_set1_ps(f)); } int ftrunc2(float f) { return _mm_cvttss_si32(_mm_set_ss(f)); } 对于任何输入,两者的行为完全相同 ... -
4 votesanswersviews
为什么MSVC使用SSE2指令来处理这些微不足道的事情?
代码: double Ret_Value=0; 在默认设置VS2012编译为: 10112128 xorps xmm0,xmm0 1011212E movsd mmword ptr [Ret_Value],xmm0 如果在项目设置中禁用了SSE2,则会将其编译为: 101102AC fldz 101102AE lea eax,[Ret_V... -
1 votesanswersviews
为什么包含在函数中的GAS内联汇编为调用者生成与纯汇编函数不同的指令
我've been writing some basic functions using GCC' s asm 练习实际应用 . 我的函数 pretty , wrap 和 pure 生成相同的指令,将64位整数解包为128位向量 . 分别调用 pretty 和 wrap 的 add1 和 add2 也会生成相同的指令 . 但 add3 的不同之处在于通过将其推送到堆栈而不是将其复制到另一个 xm... -
0 votesanswersviews
为什么编译器为我的SSE类和调试中的内在函数生成不同的指令?
(使用Visual C 19.00.23918,在调试中编译并关闭优化) 我为__m128内在函数创建了一个类包装器,如下所示: class alignas(16) V4Xm { public: inline constexpr V4Xm() : _mFoo({0}){ } inline V4Xm(float X, float Y, float Z, f... -
28 votesanswersviews
使用SSE指令
我有一个用C编写的循环,它是为一个大整数数组的每个元素执行的 . 在循环内部,我屏蔽了整数的一些位,然后找到最小值和最大值 . 我听说如果我使用SSE指令进行这些操作,它将比使用按位AND和if-else条件写入的普通循环运行得快得多 . 我的问题是我应该参加这些SSE指令吗?此外,如果我的代码在不同的处理器上运行会发生什么?它仍然可以工作或这些指令是特定于处理器的吗? -
14 votesanswersviews
使用Ivy Bridge和Haswell循环展开以实现最大吞吐量
我用AVX一次计算八个点产品 . 在我目前的代码中,我做了类似的事情(在展开之前): 常 Spring 藤桥/桑迪桥 __m256 areg0 = _mm256_set1_ps(a[m]); for(int i=0; i<n; i++) { __m256 breg0 = _mm256_load_ps(&b[8*i]); tmp0 = _mm256_ad... -
9 votesanswersviews
为什么GCC和Clang不使用cvtss2sd [内存]?
我'm trying to optimize some code that'应该从内存中读取单精度浮点数并以双精度对它们进行算术运算 . 这正成为一个重要的性能瓶颈,因为将数据作为单一精度存储在内存中的代码基本上比将内存中的数据存储为双精度的等效代码 slower . 下面是一个玩具C程序,它捕捉了我的问题的本质: #include <cstdio> // noinline to ... -
0 votesanswersviews
为什么我的SSE矩阵乘法返回矩阵全0?
我正在编写一个基于SSE的Matrix类,并且在乘法时遇到了一些奇怪的问题 . 最奇怪的部分是它似乎以前工作,但现在它没有 . 即使乘以两个恒等式,我乘以的任何矩阵也会变成全零矩阵 . 矩阵是4x4,列主要,内部定义为 __m128 col0, col1, col2, col3; . 这是我的乘法函数: inline static mat4 multiply(const mat4& lh... -
3 votesanswersviews
Xeon Phi上的loaddup_pd / unpacklo_pd
如果我在512宽SIMD向量中有以下双打,就像在Xeon Phi寄存器中一样: m0 = |b4|a4|b3|a3|b2|a2|b1|a1| 有可能成为: m0_d = |a4|a4|a3|a3|a2|a2|a1|a1| 使用单一指令?此外,由于双打没有按位内在函数,这仍然是实现上述目标的有效方法吗? m0_t = _mm512_swizzle_pd(m9,_MM_SWIZ_REG_CDAB)... -
1 votesanswersviews
Xeon Phi中的分散/聚集
我指的是关于Xeon Phi指令集的Intel手册,并且无法理解散布/收集指令的工作原理 . 假设我有以下双打矢量: A-> |b4|a4|b3|a3|b2|a2|b1|a1| 是否可以创建4个向量,如下所示: V1->|b1|a1|b1|a1|b1|a1|b1|a1| V2->|b2|a2|b2|a2|b2|a2|b2|a2| V3->|b3|a3|b3|a3|b3|a... -
1 votesanswersviews
英特尔C编译器(icc)中的虚假自动向量化
我需要在程序中使用SSE向量化一些巨大的循环 . 为了节省时间,我决定让ICC处理它 . 为此,我准备好数据,考虑到对齐,我使用了编译器指令 #pragma simd ,_ #pragma aligned , #pragma ivdep . 使用多个 -vec-report 选项进行编译时,编译器会告诉我循环是向量化的 . 快速查看编译器生成的程序集似乎可以确认,因为您可以找到大量的矢量指令,... -
7 votesanswersviews
向左和向右移位SSE / AVX寄存器,同时以零移位
我想将左移或右移32位的SSE / AVX寄存器移位为零 . 让我对我感兴趣的转变更加准确 . 对于SSE,我想做四个32位浮点数的以下转换: shift1_SSE: [1, 2, 3, 4] -> [0, 1, 2, 3] shift2_SSE: [1, 2, 3, 4] -> [0, 0, 1, 2] 对于AVX,我想转移做以下转变: shift1_AVX: [1, 2, 3, ... -
8 votesanswersviews
哪个版本的Windows支持/需要哪些CPU多媒体扩展? [关闭]
到目前为止,我已经设法找到: SSE和SSE2对于Windows 8及更高版本(当然对于任何64位操作系统)都是必需的 AVX仅受Windows 7 SP1或更高版本支持 有关在Windows上使用SSE3,SSSE3,SSE4.1,SSE 4.2,AVX2和AVX-512的注意事项吗? 一些澄清:如果我使用其中一个SSE / AVX集合的指令,我需要这个来确定我的程序运行的操作系统 ... -
2 votesanswersviews
最快确定SIMD比较寄存器位置的方法
我有一个已经SIMD比较 __m128i 寄存器,这导致类似的东西: 0, 0, -1, -1, 0, 0, 0, 0 // in shorts 0, -1, 0, 0 // in ints 获取位置的int的位置的最快/最便宜的方法是什么? __m128i 中只有一个int设置为1 . 例: -1, -1, 0, 0, 0, 0, 0, 0 -> 0 0, 0, -1, -1, 0... -
7 votesanswersviews
memset与绑定到每个物理核心的线程并行
我一直在In an OpenMP parallel code, would there be any benefit for memset to be run in parallel?测试代码,我正在观察一些意外的事情 . 我的系统是一个单插槽Xeon E5-1620,它是一个Ivy Bridge处理器,有4个物理内核和8个超线程 . 我使用的是Ubuntu 14.04 LTS,Linux Ker... -
3 votesanswersviews
将常量值添加到x86中的xmm寄存器
如何将 1 或 2 添加到寄存器 xmm0 (双)? 我可以这样做,但肯定必须有一个更简单的方法: movsd xmm0, [ecx] xor eax, eax inc eax cvtsi2sd xmm1, eax addsd xmm0, xmm1 movsd [ecx], xmm0 还可以使用浮点x87指令执行此操作吗? 这对我不起作用: fld dword ptr [ecx] fld1 ... -
44 votesanswersviews
如何在编译时检测SSE / SSE2 / AVX / AVX2 / AVX-512 / AVX-128-FMA / KCVI的可用性?
我正在尝试优化一些矩阵计算,我想知道是否有可能在编译时检测SSE / SSE2 / AVX / AVX2 / AVX-512 / AVX-128-FMA / KCVI [1]是否由编译器?理想情况下,对于GCC和Clang,但我只能管理其中一个 . 我不确定它是否可行,也许我会使用自己的宏,但我更愿意检测它并要求用户选择它 . [1] "KCVI"代表Knights Corn... -
87 votesanswersviews
任何JVM的JIT编译器都会生成使用向量化浮点指令的代码吗?
假设我的Java程序的瓶颈确实是计算一堆矢量点积的一些紧密循环 . 是的我已经分析过,是的,它是瓶颈,是的,它是重要的,是的,这就是算法的方式,是的,我运行Proguard来优化字节码等 . 这项工作基本上是点产品 . 在,我有两个 float[50] ,我需要计算成对产品的总和 . 我知道存在处理器指令集以快速和批量地执行这些操作,如SSE或MMX . 是的我可以通过在JNI中编写一些本机代码来... -
25 votesanswersviews
为什么mulss在Haswell上只用了3个周期,与Agner的指令表不同?
我是指令优化的新手 . 我对一个简单的函数dotp进行了简单的分析,该函数用于获取两个浮点数组的点积 . C代码如下: float dotp( const float x[], const float y[], const short n ) { short i; float suma; ... -
0 votesanswersviews
内部virtualenv:如何获得tensorflow来支持sse 4.2和avx
只是提前说出来,我知道所有需要bazel的答案,但它们对我不起作用 . 我正在使用virtualenv作为tensorflow网站的建议 . (tensorflow27)name@computersname:~$ bazel build --linkopt='-lrt' -c opt --copt=-mavx --copt=-msse4.2 --copt=-msse4.1 --copt=-msse... -
0 votesanswersviews
使用SSE4.2和AVX编译TensorFlow失败并使用bazel
我已经安装了Tensorflow Bazel和MSYS,我尝试使用Win 10命令提示符中的以下命令使Tensorflow编译为支持 CPU extensions, such as SSE4.1, SSE4.2, AVX, AVX2, FMA : bazel build -c opt --copt=-mavx --copt=-mavx2 --copt=-mfma --copt=- mfpma... -
3 votesanswersviews
如何改进编译器对SSE内在函数的处理?
读过this interesting article on the results of intrinsic-guided optimization of SSE code in different C++ compilers后,我决定对自己进行测试,特别是因为这篇文章已有几年了 . 我使用的MSVC在帖子的作者(虽然在VS 2010版本中)执行的测试中表现非常糟糕,并且决定坚持一个非常基本的场景... -
1 votesanswersviews
Intel Xeon Phi中的排列
假设我在Xeon Phi寄存器中有以下4个双精度向量: A-> |a8|a7|a6|a5|a4|a3|a2|a1| B-> |b8|b7|b6|b5|b4|b3|b2|b1| C-> |c8|c7|c6|c5|c4|c3|c2|c1| D-> |d8|d7|d6|d5|d4|d3|d2|d1| 我想将它们置于以下内容中: A_new ->|d2|d1|c2|c1|b... -
0 votesanswersviews
从哪里添加CPU指令从源安装Tensorflow?
我正在尝试从源安装Tensorflow,因为当我使用pip和virtualenv安装时没有安装CPU指令(SSE,AVX ......)的警告: W tensorflow/core/platform/cpu_feature_guard.cc:45] The TensorFlow library wasn't compiled to use SSE4.1 instructions, but thes... -
28 votesanswersviews
SSE指令:哪些CPU可以进行原子16B内存操作?
考虑在x86 CPU上进行单个内存访问(单个读取或单个写入,而不是读取写入)SSE指令 . 该指令访问16字节(128位)的存储器,访问的存储器位置对齐为16字节 . 文档“英特尔®64架构内存订购白皮书”指出,对于“读取或写入地址在8字节边界上对齐的四字(8字节)的指令”,内存操作似乎作为单个内存访问执行,而不管记忆类型 . 问题: Do there exist Intel/AMD/etc x8...