Tag: sse

为什么strcmp不是SIMD优化的?

我试图在x64电脑上编译这个程序: #include <cstring> int main(int argc, char* argv[]) { return ::std::strcmp(argv[0], "really really really really really really really really really" "really really really really really really really really really" "really really really really really really really really really" "really really really really really really really really really" "really really really really really really really really […]

开始使用SSE

我想了解更多关于使用SSE的信息 。 除了显而易见的英特尔®64和IA-32架构软件开发人员手册之外,还有什么方法可以学习? 主要是我有兴趣使用GCC X86内置函数 。

使用AVX intrinsics而不是SSE不会提高速度 – 为什么?

我一直在使用英特尔的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; […]

在C#中如何处理非规范化的花车?

只要阅读这篇引人入胜的文章 ,就可以在具有非规格化浮点数(浮点数非常接近于0)的Intel CPU上获得20x-200x的速度减速。 SSE有一个选项将它们舍入为0,当遇到这样的浮点值时恢复性能。 C#应用程序如何处理这个? 有没有启用/禁用_MM_FLUSH_ZERO的选项?

如何确定内存是否alignment? (*testing*alignment,不alignment)

我是新来的优化代码SSE / SSE2指示,直到现在我还没有得到很远。 据我所知,一个通用的SSE优化函数看起来像这样: void sse_func(const float* const ptr, int len){ if( ptr is aligned ) { for( … ){ // unroll loop by 4 or 2 elements } for( ….){ // handle the rest // (non-optimized code) } } else { for( ….){ // regular C code to handle non-aligned memory } } } […]

如何检查CPU是否支持SSE3指令集?

以下代码是否有效,以检查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; }

SSE内在函数参考

有谁知道一个引用,列出了gcc的SSE内部函数的操作,即<* mmintrin.h>头文件中的函数? 谢谢。

x86 SIMD内部函数的头文件

哪些头文件为不同的x86 SIMD指令集扩展(MMX,SSE,AVX,…)提供了内在的function? 在网上find这样的清单似乎是不可能的。 如我错了请纠正我。

使用AVX CPU指令:没有“/ arch:AVX”

我的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来说,由于某种原因它不起作用。

为什么妈妈在Haswell上只有3个周期,与Agner的指令表不同?

我是一个新手在指令优化。 我简单的分析了一个简单的函数dotp,用来得到两个float数组的点积。 C代码如下: float dotp( const float x[], const float y[], const short n ) { short i; float suma; suma = 0.0f; for(i=0; i<n; i++) { suma += x[i] * y[i]; } return suma; } 我使用networkingtesting中的Agner Fog提供的testing框架。 在这种情况下使用的数组是alignment的: int n = 2048; float* z2 = (float*)_mm_malloc(sizeof(float)*n, 64); char *mem = (char*)_mm_malloc(1<<18,4096); char *a = […]