草庐IT

c - MSVC 生成的符号表中 __real、__imp、__xmm 符号的含义

我是一名UNIX开发人员,负责帮助维护一些Windows软件,我正在查看.DEF生成器同时修复错误。它不包括__xmm,__real和__imp-来自导出的前缀符号。我一直在努力弄清楚这些符号到底是什么。很明显,它们不需要出现在.DEF中。文件(如果它们需要在DLL接口(interface)上导出,编译器将__declspec(dllexport)对其自身进行注释)但是......它们是什么?看起来排除__imp的目的前缀是排除functioncallthunks.正确吗?搜索MSDN未提供有关__xmm的信息或__real(顺便说一句,使用social.msdn.microsoft.

c++ - 为什么缓存行仅适用于模拟化?

我正在学习simd指令和内存缓存。我写了一个简单的测试来比较标量和SIMDizedsqrt计算:#include#includeusingnamespacestd;#include#include"xmmintrin.h"#includeconstintN=16;constintNIter=10000;floata[N][N]__attribute__((aligned(16)));floatb[N][N]__attribute__((aligned(16)));floatb_simd[N][N]__attribute__((aligned(16)));intmain(){//fill

c++ - 编译器为内部函数生成程序集的问题

我正在使用英特尔SSE/AVX/FMA内在函数为某些数学函数实现完美的内联SSE/AVX指令。给定以下代码#include#includeautostd_fma(floatx,floaty,floatz){returnstd::fma(x,y,z);}float_fma(floatx,floaty,floatz){_mm_store_ss(&x,_mm_fmadd_ss(_mm_load_ss(&x),_mm_load_ss(&y),_mm_load_ss(&z)));returnx;}float_sqrt(floatx){_mm_store_ss(&x,_mm_sqrt_ss(_mm

c++ - MASM 使用 VS 击败未优化的 .cpp 但不是未优化的 .c

我有一个非常简单的函数,它使用行主矩阵(float**)转换vector(float*):intvector_by_matrix(float**m,float*v,float*out,intsize){inti,j;floattemp;if(!m||!v||!out)return-1;for(i=0;i代码最初是使用VisualStudio(2013)C++编译器编译为C++(x64);并且没有优化非常慢(该函数在运行期间被调用数百次/数千次并且系统的大小通常很大c.size=10000)。通过将优化设置为高(O2)并将浮点模式设置为快速,性能提升非常大(x20)。但是,我决定将文件转

c++ - 将单个 float 移动到 xmm 寄存器

我想将存储在一个xmm寄存器中的数据与一个浮点值相乘,并将结果保存在一个xmm寄存器中。我制作了一张小图来更好地解释它。如您所见,我有一个xmm0寄存器,其中包含我的数据。例如它包含:xmm0=|4.0|2.5|3.5|2.0|每个float存储在4个字节中。我的xmm0寄存器是128位,16字节长。效果还不错。现在我想将0.5存储在另一个xmm寄存器中,例如xmm1,并将该寄存器与xmm0寄存器相乘,使xmm0中存储的每个值都乘以0.5。我完全不知道如何在XMM寄存器中存储0.5。有什么建议吗?顺便说一句:它是C++中的内联汇编程序。voidfilter(image*src_imag

c++ - 在 Visual Studio 2010/2012 和 Release 模式下使用 SSE 内部函数时结果不正确

我正在使用SSE内在函数计算数组的均值和方差。基本上,这是可以在以下程序中说明的值及其平方的总和:intmain(intargc,constchar*argv[]){unionu{__m128m;floatf[4];}x;//Allocatememoryandinitializedata:[1,2,3,...stSize+1]constsize_tstSize=1024;float*pData=(float*)_aligned_malloc(stSize*sizeof(float),32);for(size_ts=0;s现在,当我在Debug模式下编译和运行程序时,我得到以下(正确的)

c++ - 如何截断 XMM 寄存器中的浮点值

如何只获取float的整数部分?所以,我有一个float组:x[4]={5.0,13.0,25.0,41.0};我把它放在xmm0中,然后用它做sqrt。我还需要一个命令来帮助仅获取此sqrt的一部分。例如5的sqrt将是2.236068,我只需要2.0的答案代码:__asm{movupsxmm0,xsqrtpsxmm0,xmm0//hereneedsomecommandmovupsx,xmm0} 最佳答案 使用roundps是最简单的。舍入模式表在其他地方,但您需要舍入模式3(接近零)。只有当输入保证在某个范围内(大约0到4.6e

c++ - 向右移动4个整数不同的值SIMD

SSE没有提供将打包整数移位可变数量的方法(我可以使用任何AVX及更早版本的指令)。您只能进行统一轮类。我试图为vector中的每个整数实现的结果是这样的。i[0]=i[0]&0b111111;i[1]=(i[1]>>6)&0b111111;i[2]=(i[2]>>12)&0b111111;i[3]=(i[3]>>18)&0b111111;本质上是尝试在每个整数中隔离6位不同的组。那么最佳的解决方案是什么?我想到的事情:您可以模拟可变的右移,可变的左移和统一的右移。我考虑过将打包整数分别乘以不同的量(因此模拟左移)。然后,使用该结果,您可以执行统一的右移操作以获得答案。我将用于乘法的特

C++ 性能 std::array 与 std::vector

晚上好。我知道C风格数组或std::array并不比vector快。我一直使用vector(而且我用得很好)。但是,在某些情况下,使用std::array比使用std::vector性能更好,我不知道为什么(使用clang7.0和gcc8.2测试)。让我分享一个简单的代码:#include#include//somesizeconstantconstsize_tN=100;//somevectorsandarraysusingvec=std::vector;usingarr=std::array;//arraysareconstructedfasterhereduetoknownsiz

c++ - 为什么我的直接四元数乘法比 SSE 快?

我经历了几个不同的四元数乘法实现,但我很惊讶地发现引用实现是迄今为止我最快的实现。这是有问题的实现:inlinestaticquatmultiply(constquat&lhs,constquat&rhs){returnquat((lhs.w*rhs.x)+(lhs.x*rhs.w)+(lhs.y*rhs.z)-(lhs.z*rhs.y),(lhs.w*rhs.y)+(lhs.y*rhs.w)+(lhs.z*rhs.x)-(lhs.x*rhs.z),(lhs.w*rhs.z)+(lhs.z*rhs.w)+(lhs.x*rhs.y)-(lhs.y*rhs.x),(lhs.w*rhs.w)