草庐IT

c++ - SSE 内在函数 : masking a float and using bitwise and?

基本上这个问题与x86汇编器有关,您有一个数字,您希望使用and将其设置为零或数字本身。.如果你andnumber为负数你会得到number本身,但如果你and它与零你得到零。现在我在使用SSEinstrinsics时遇到的问题是float在二进制中与double不同(或者我弄错了)。无论如何,这是代码,我尝试使用各种float来掩盖第二个和第三个数字(分别为127.0f和99.0f),但没有成功。#include#includevoidprint_4_bit_num(constchar*label,__m128var){float*val=(float*)&var;printf("%

c++ - SSE版本的差平方和算法的累积计算误差

我正在尝试优化以下代码(两个数组的平方差之和):inlinefloatSquare(floatvalue){returnvalue*value;}floatSquaredDifferenceSum(constfloat*a,constfloat*b,size_tsize){floatsum=0;for(size_ti=0;i所以我使用CPU的SSE指令进行了优化:inlinevoidSquaredDifferenceSum(constfloat*a,constfloat*b,size_ti,__m128&sum){__m128_a=_mm_loadu_ps(a+i);__m128_b=

c++ - 如果数据已经在缓存中,非临时存储会发生什么情况?

当您使用非临时存储时,例如movntq,并且数据已经在缓存中,存储会更新缓存而不是写出到内存吗?或者它会更新缓存行并将其写出,驱逐它吗?或者什么?这是一个有趣的难题。假设线程A正在加载包含x和y的缓存行。线程B使用NT存储写入x。线程A写入y。如果B对x的存储可以在A的加载发生时传输到内存,则这里存在数据竞争。如果A看到x的旧值,但X的写入已经发生,那么稍后写入y并最终写回缓存行将破坏不相关的值x。我假设处理器以某种方式阻止了这种情况的发生?如果允许的话,我看不出任何人如何使用NT存储构建可靠的系统。 最佳答案 在多核CPU上(即比

c++ - 两个8位数组协方差的快速实现

我需要比较大量相似的小尺寸图片(最大200x200)。所以我尝试实现SSIM(结构相似性参见https://en.wikipedia.org/wiki/Structural_similarity)算法。SSIM需要计算两个8位灰度图像的协方差。一个简单的实现如下所示:floatSigmaXY(constuint8_t*x,constuint8_t*y,size_tsize,floataverageX,floataverageY){floatsum=0;for(size_ti=0;i但是性能很差。所以我希望用SIMD或者CUDA来改进一下(听说可以)。不幸的是,我没有这样做的经验。它看起

c++ - 没有 AVX2 的 32 位整数的 SSE 整数 2^n 次幂

我找不到用于计算2^n的SSE指令对于vector__m128i32位整数。是否有执行以下伪代码的指令或函数?__m128ipower_of_two(__m128ib){__m128r;for(inti=0;i_mm_sll_epi32指令只计算r[i]=a[i]. 最佳答案 AVX2之前没有单一指令,但即使只有SSE2,也有一个技巧可以滥用浮点格式来生成2的幂,方法是使用整数算法生成指数字段,然后将其从float转换为整数.可能有更快的选择。__m128ipower_of_two(__m128ib){__m128iexp=_mm_

c++ - 有没有比添加 0.5f 和截断转换更直接的方法来将 float 转换为 int 并进行舍入?

在处理浮点数据的C++代码中,从float到int的舍入转换经常发生。例如,一种用途是生成转换表。考虑这个代码片段://ConvertapositivefloatvalueandroundtothenearestintegerintRoundedIntValue=(int)(FloatValue+0.5f);C/C++语言将(int)转换定义为截断,因此必须添加0.5f以确保向上舍入到最接近的正整数(当输入为正时)。对于以上,VS2015的编译器生成如下代码:movssxmm9,DWORDPTR__real@3f000000//0.5faddssxmm0,xmm9cvttss2siea

c++ - __declspec(align(16)) 不将指针对齐到 16 个字节

所以我正在尝试使用SSE函数__mm_load_128,我是SSE的新手,如果我在某处犯了一些愚蠢的错误,请原谅我。这是代码voidone(__m128i*arr,char*temp){//SSEneeds16bytealignment._declspec(align(16))__m128i*tmp=(__m128i*)temp;if(((uintptr_t)tmp&15)==0)printf("Alignedpointer");elseprintf("%d",((uintptr_t)tmp&15));//Thisprintsas12arr[0]=_mm_load_si128(tmp)

c++ - 检查运行时是否支持 SSE

这个问题在这里已经有了答案:HowtocheckifaCPUsupportstheSSE3instructionset?(7个答案)cpudispatcherforvisualstudioforAVXandSSE(3个答案)关闭7年前。我想检查运行时是否支持SSE4或AVX,以便我的程序可以利用处理器特定指令,而无需为每个处理器创建二进制文件。如果我可以在运行时确定它,我可以使用一个接口(interface)并在不同的指令集之间切换。

c++ - 微小的 SSE addpd 循环比 AMD Phenom II 上的标量稍慢?

是的,我读了SIMDcoderunsslowerthanscalarcode.不,这不是真正的重复。我使用二维数学已有一段时间了,并且正在将我的代码库从C移植到C++。我在使用C时遇到了一些问题,这意味着我确实需要多态性,但那是另一回事了。不管怎样,我之前考虑过这个,但它提供了一个使用2Dvector类的绝好机会,包括常见数学运算的SSE实现。是的,我知道那里有图书馆,但我想自己尝试一下以了解发生了什么,而且我没有使用比+=更复杂的东西。.我的实现是通过,用一个union{__m128dss;struct{doublex;doubley;}}SSE似乎很慢,所以我查看了它生成的ASM输

c++ - SSE 内联汇编和可能的 g++ 优化错误

让我们从代码开始。我有两种结构,一种用于vector,另一种用于矩阵。structAVector{explicitAVector(floatx=0.0f,floaty=0.0f,floatz=0.0f,floatw=0.0f):x(x),y(y),z(z),w(w){}AVector(constAVector&a):x(a.x),y(a.y),z(a.z),w(a.w){}AVector&operator=(constAVector&a){x=a.x;y=a.y;z=a.z;w=a.w;return*this;}floatx,y,z,w;};structAMatrix{//Row-ma