我一直在使用英特尔的SSE内部函数,并获得了很好的性能提升。 因此,我期望AVX内部函数能够进一步加速我的程序。 不幸的是,直到现在,情况并非如此。 也许我犯了一个愚蠢的错误,所以如果有人能帮助我,我将不胜感激。 我使用Ubuntu 11.10与g ++ 4.6.1。 我编译我的程序(见下文) g++ simpleExample.cpp -O3 -march=native -o simpleExample testing系统有一个Intel i7-2600 CPU。 这里是代表我的问题的代码。 在我的系统上,我得到了输出 98.715 ms, b[42] = 0.900038 // Naive 24.457 ms, b[42] = 0.900038 // SSE 24.646 ms, b[42] = 0.900038 // AVX 请注意,计算sqrt(sqrt(sqrt(x)))只是为了确保内存带宽不限制执行速度; 这只是一个例子。 simpleExample.cpp: #include <immintrin.h> #include <iostream> #include <math.h> #include <sys/time.h> using namespace std; […]
以下代码是否有效,以检查CPU是否支持SSE3指令集? 使用IsProcessorFeaturePresent()函数显然在Windows XP上不起作用(请参阅http://msdn.microsoft.com/zh-cn/library/ms724482(v=vs.85).aspx )。 bool CheckSSE3() { int CPUInfo[4] = {-1}; //– Get number of valid info ids __cpuid(CPUInfo, 0); int nIds = CPUInfo[0]; //– Get info for id "1" if (nIds >= 1) { __cpuid(CPUInfo, 1); bool bSSE3NewInstructions = (CPUInfo[2] & 0x1) || false; return bSSE3NewInstructions; } return false; }
我的C ++代码使用SSE,现在我想改进它以支持AVX。 所以我检测AVX何时可用,并调用一个使用AVX命令的函数。 我使用Win7 SP1 + VS2010 SP1和一个带有AVX的CPU。 要使用AVX,有必要包含这一点: #include "immintrin.h" 然后你可以使用像_mm256_mul_ps函数,如_mm256_mul_ps , _mm256_add_ps等。问题是,默认情况下,VS2010产生的代码工作非常缓慢,并显示警告: 警告C4752:find英特尔(R)高级vector扩展; 考虑使用/ arch:AVX 看来VS2010实际上并不使用AVX指令,而是模拟它们。 我添加/arch:AVX的编译器选项,并取得了良好的效果。 但是这个选项告诉编译器在可能的地方使用AVX命令。 所以我的代码可能会在不支持AVX的CPU上崩溃! 所以问题是如何使VS2010编译器生成AVX代码,但只有当我直接指定AVX内部函数。 对于SSE它可以工作,我只是使用SSE内在函数,它产生的SSE代码没有像/arch:SSE这样的编译器选项。 但是对于AVX来说,由于某种原因它不起作用。
两个数组的点积 for(int i=0; i<n; i++) { sum += x[i]*y[i]; } 不重用数据,所以它应该是一个内存绑定操作。 因此,我应该能够从点积测量存储带宽。 使用为什么向量化循环没有提高性能 的代码,我的系统带宽为9.3 GB / s 。 但是,当我尝试使用点积来计算带宽时,我使用multithreading(我的系统有四个内核/八个超线程)来获得单线程速率的两倍以及超过三倍的速率。 这对我来说没有意义,因为内存绑定操作不应该从多个线程中受益。 以下是以下代码的输出: Xeon E5-1620, GCC 4.9.0, Linux kernel 3.13 dot 1 thread: 1.0 GB, sum 191054.81, time 4.98 s, 21.56 GB/s, 5.39 GFLOPS dot_avx 1 thread 1.0 GB, sum 191043.33, time 5.16 s, 20.79 GB/s, 5.20 […]
我很困惑,Sandy-Bridge和Haswell可以完成每个核心每个周期的触发器数量。 就我所了解的SSE而言,对于AVX / AVX2来说,SSE每个内核每个周期应该有4个触发器,而每个内核每个周期应该有8个触发器。 这似乎在这里得到validation, 我怎样才能达到每个周期4 FLOP的理论最大值? ,以及Sandy-Bridge CPU规格 。 然而,下面的链接似乎表明,Sandy-bridge每个内核每个周期可以执行16个触发器,而每个内核每个周期可以执行Haswell 32个触发器http://www.extremetech.com/computing/136219-intels-haswell-is-an-universe威慑nvidia-amd 。 谁可以给我解释一下这个? 编辑:我现在明白为什么我感到困惑。 我认为术语FLOP只涉及单浮点(SP)。 我现在看到,testing如何达到每个周期4 FLOP的理论最大值? 实际上是双浮点(DP),因此它们为SSE实现4个DP FLOP /周期,为AVX实现8个DP FLOP /周期。 在SP上重做这些testing会很有趣。