草庐IT

c++ - 如何避免 SSE 管道冲洗?

我在SSE上遇到了一个非常微妙的问题。情况是这样的,我想用SSE优化我的光线追踪器,这样我就可以基本了解如何使用SSE提高性能。我想从这个函数开始。Vector3fAdd(constVector3f&v0,Vector3f&v1);(实际上,我首先尝试优化CrossProduct,为简单起见,此处显示了添加,我知道这不是我的光线追踪器的瓶颈。)这是结构体定义的一部分:structVector3f{union{struct{floatx;floaty;floatz;floatreserved;};__m128data;};问题是这个声明会刷新SSE寄存器,编译器不够智能,无法保留这些ss

c++ - 计算 sse var 最大掩码的最佳方法

(我只对前三个组件感兴趣)例如:[123?]应该生成[00-1?]此外,只设置一个“位”很重要,这样:[122?]不应该产生[0-1-1?]而是[0-10?]或[00-1?](哪个无关紧要)后来的(坏的)解决方案是可能的,例如通过提取水平最大值并与原始的进行比较:__m128abcd;//input__m128ccac=_mm_shuffle_ps(abcd,abcd,0x8A);__m128abcd_ccac=_mm_max_ps(abcd,ccac);__m128babb=_mm_shuffle_ps(abcd,abcd,0x51);__m128abcd_ccac_babb=_mm

c++ - SSE 规范化比简单近似慢?

我正在尝试规范化4dvector。我的第一个方法是使用SSE内在函数——它为我的vector算法提供了2倍的速度提升。这是基本代码:(v.v4是输入)(使用GCC)(所有这些都是内联的)//findsquaresv4sfs=__builtin_ia32_mulps(v.v4,v.v4);//setttosquarev4sft=s;//addthe4squarestogethers=__builtin_ia32_shufps(s,s,0x1B);t=__builtin_ia32_addps(t,s);s=__builtin_ia32_shufps(s,s,0x4e);t=__builti

c++ - 无法在 x86 上以 SSE 类型访问内存,但在 x64 上工作正常

我有一些使用MSVCSSE内在函数编写的代码。__m128zero=_mm_setzero_ps();__m128center=_mm_load_ps(&sphere.origin.x);__m128boxmin=_mm_load_ps(&rhs.BottomLeftClosest.x);__m128boxmax=_mm_load_ps(&rhs.TopRightFurthest.x);__m128e=_mm_add_ps(_mm_max_ps(_mm_sub_ps(boxmin,center),zero),_mm_max_ps(_mm_sub_ps(center,boxmax),ze

c++ - SSE 和 AVX 的 channel / channel 改组?

哪些SSE/AVX指令将channel从a打乱为b和c?float4a={data[0],data[1],data[2],data[3]};float4b={data[1],data[2],data[3],data[0]};//lanesshiftedleftfloat4c={data[3],data[0],data[1],data[2]};//lanesshiftedrightfloat8a={data[0],data[1],data[2],data[3],data[4],data[5],data[6],data[7]};float8b={data[1],data[2],data[3

c++ - 使用 SSE 内在函数时如何确保 NaN 传播?

我最近读到这篇关于SSE算术运算中的NaN值的文章:Theresultofarithmeticoperationsactingontwonotanumber(NAN)argumentsisundefined.Therefore,floating-pointoperationsusingNANargumentswillnotmatchtheexpectedbehaviorofthecorrespondingassemblyinstructions.来源:http://msdn.microsoft.com/en-us/library/x5c07e2a(v=vs.100).aspx这是否意味

c++ - i5-2500k 上的 cpuid 指令 : MMX, SSE,SSE2 位未设置

这是预期的吗?我希望我的SandyBridgeCPU报告它可以处理MMX、SSE和SSE2指令。这些位是否未设置是因为这些“旧”指令集已被一些较新的指令集“取代”?我用了thiscodehere将CPU检测放入我的代码中。#include"CPUID.h"intmain(intargc,char*argv[]){CPUIDcpuid;cpuid.load(0);printf("CPU:%.4s%.4s%.4s",(constchar*)&cpuid.EBX(),(constchar*)&cpuid.EDX(),(constchar*)&cpuid.ECX());charbrand[0x

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)

c++ - 如何使用 SSE 高效地进行 int8/int64 转换?

我正在SSE类型之间实现转换,我发现为SSE4.1之前的目标实现int8->int64扩展转换很麻烦。最直接的实现是:inline__m128iconvert_i8_i64(__m128ia){#ifdef__SSE4_1__return_mm_cvtepi8_epi64(a);#elsea=_mm_unpacklo_epi8(a,a);a=_mm_unpacklo_epi16(a,a);a=_mm_unpacklo_epi32(a,a);return_mm_srai_epi64(a,56);//missinginstrinsic!#endif}但是由于_mm_srai_epi64在A

c++ - SSE 类型的 pow

我使用SSE类型进行了一些显式矢量化计算,例如__m128(在xmmintrin.h等中定义),但现在我需要提高vector的所有元素一些(相同的)力量,即理想情况下我想要类似__m128_mm_pow_ps(__m128,float)的东西,不幸的是它不存在。解决这个问题的最佳方法是什么?我可以存储vector,在每个元素上调用std::pow,然后重新加载它。这是我能做的最好的吗?当自动矢量化代码时,编译器如何实现对std::pow的调用,否则可以很好地矢量化?是否有任何库提供有用的东西?(请注意thisquestion不是重复项,因此肯定没有有用的答案。)