草庐IT

c++ - 使用 C/C++ 在同一可执行文件中进行不同的优化(普通、SSE、AVX)

我正在为我的3D计算开发优化,我现在有:使用标准C语言库的“plain”版本,SSE优化版本,使用预处理器编译#defineUSE_SSE,AVX优化版本,使用预处理器编译#defineUSE_AVX是否可以在3个版本之间切换而不必编译不同的可执行文件(例如,具有不同的库文件并动态加载“正确”的库文件,不知道inline函数是否“对”)?我还会考虑在软件中使用这种开关的性能。 最佳答案 对此有多种解决方案。一个基于C++,您可以在其中创建多个类-通常,您实现一个接口(interface)类,并使用工厂函数为您提供正确类的对象。例如c

c++ - AVX2 在 Haswell 上比 SSE 慢

我有以下代码(正常、SSE和AVX):inttestSSE(constaligned_vector&ghs,constaligned_vector&lhs){intresult[4]__attribute__((aligned(16)))={0};__m128ivresult=_mm_set1_epi32(0);__m128iv1,v2,vmax;for(intk=0;kmymax){mymax=result[k];}}returnmymax;}inttestAVX(constaligned_vector&ghs,constaligned_vector&lhs){intresult[8

c++ - g++-4.8 中缺少 AVX 日志内在函数 (_mm256_log_ps)?

我试图在我的代码中使用一些AVX内在函数,但遇到了对数内在函数的障碍。使用适用于Linux的IntelIntrinsicsGuidev3.0.1,我看到内在_mm256_log_ps(__m256)被列为“immintrin.h”的一部分,并且在我当前的arch上也受支持。然而,尝试编译这个简单的测试用例失败并显示“错误:‘_mm256_log_ps’未在此范围内声明”这个例子是用g++-4.8-march=native-mavxtest.cpp编译的#includeintmain(){__m256i;_mm256_log_ps(i);}我是否遗漏了一些基本的东西?某些内在函数是否不受

c++ - 将 AVX 与 GCC 一起使用 - 缺少 avxintrin.h

我在Ubuntu-64位12.04LTS上运行我的笔记本电脑(coreI5)。我正在尝试进入AVX以生成一些随机数。在Eclipse-CDT中,我使用LinuxGCC创建了一个新的C++“HelloWorld”项目。我包含了immintrin.h并尝试加载__m256类型的东西。编译器抛出一个错误:在此范围内未声明类型“__m256”我查看了immintrin.h并查找了avxintrin.h,以防万一,有拼写错误。单击avxintrin.h上的打开声明时,Eclipse说:Couldnotfindincludefile'avxintrin.h'onincludepaths无论如何,该

c++ - 使用 AVX 后 SSE 运行缓慢

这个问题在这里已经有了答案:WhyisthisSSEcode6timesslowerwithoutVZEROUPPERonSkylake?(2个答案)关闭11个月前。此帖于11个月前编辑提交审核,未能重开帖子:原始关闭原因未解决我在处理一些SSE2和AVX代码时遇到了一个奇怪的问题。我正在使用运行时cpu功能检测的GCC构建我的应用程序。目标文件是为每个CPU功能使用单独的标志构建的,例如:g++-c-oConvertSamples_SSE.oConvertSamples_SSE.cpp-std=c++11-fPIC-O0-g-Wall-I./include-msseg++-c-oCo

c++ - 如何检查编译后的代码是否使用了 SSE 和 AVX 指令?

我写了一些代码来做一堆数学运算,它需要运行得很快,所以我需要它来使用SSE和AVX指令。我正在使用带有标志-O3和-march=native的g++编译它,所以我认为它使用的是SSE和AVX指令,但我不确定。我的大部分代码如下所示:for(inti=0;i有什么方法可以判断我的代码(编译后)是否使用SSE和AVX指令?我想我可以看汇编看看,但我不会汇编,我不知道如何查看编译器输出的汇编。 最佳答案 在Linux下,您还可以反编译您的二进制文件:objdump-dYOURFILE>YOURFILE.asm然后找到所有SSE指令:awk

c++ - 如何解决 AVX 加载/存储操作的 32 字节对齐问题?

我在使用ymm时遇到对齐问题注册,带有一些我觉得不错的代码片段。这是一个最小的工作示例:#include#includeinlinevoidones(float*a){__m256out_aligned=_mm256_set1_ps(1.0f);_mm256_store_ps(a,out_aligned);}intmain(){size_tss=8;float*a=newfloat[ss];ones(a);delete[]a;std::cout当然,sizeof(float)是4在我的架构(Intel(R)Xeon(R)CPUE5-2650v2@2.60GHz)上,我正在编译gcc使用

windows - MinGW64 无法进行 32 字节堆栈对齐(Windows x64 上的 AVX 需要),轻松解决或切换编译器?

我正在尝试使用AVX指令和64位Windows。我对g++编译器很满意,所以我一直在使用它,但是,报告了一个大错误here并提出了非常粗略的解决方案here.基本上,m256变量不能在堆栈上对齐以正确使用avx指令,它需要32字节对齐。在我链接的另一个堆栈问题中提出的解决方案真的很糟糕,特别是如果你考虑到性能的话。一个python程序,你每次想要调试时都必须运行它,它用次优未对齐的指令替换指令,或者过度分配并在代码中做一堆昂贵的hacky指针数学以获得正确的对齐。如果您执行指针数学解决方案,我认为甚至还有可能出现段错误,因为您无法控制分配或r-values/temporaries。我正

c++ - 如何在 Windows 上使用 SSE 和 AVX 指令编译 Tensor Flow?

随着最新版本的TensorFlow现在在Windows上运行,我正在努力让一切尽可能高效地工作。然而,即使从源代码编译时,我似乎仍然无法弄清楚如何启用SSE和AVX指令。默认流程:https://github.com/tensorflow/tensorflow/tree/r0.12/tensorflow/contrib/cmake没有提到如何做到这一点。我找到的唯一引用是使用Google的Bazel:HowtocompileTensorflowwithSSE4.2andAVXinstructions?有人知道使用MSBuild启用这些高级指令的简单方法吗?我听说他们至少提供了3倍的加速

c - 运行任何英特尔 AVX 函数后,数学函数需要更多周期

这个问题在这里已经有了答案:UsingAVXinstructionsdisablesexp()optimization?(1个回答)关闭8年前。我注意到数学函数(如ceil、round等)在运行任何英特尔AVX函数后需要更多的CPU周期。请看下面的例子:#include#include#includestaticunsignedlongintget_rdtsc(void){unsignedinta,d;asmvolatile("rdtsc":"=a"(a),"=d"(d));return(((unsignedlongint)a)|(((unsignedlongint)d)编译:gcc-