草庐IT

c++ - SSE2、Visual Studio 2010 和调试版本

编译器能否在禁用优化时自动使用SSE2?当禁用优化时,/arch:SSE2标志有什么意义吗?我的任务是从我们的软件中榨取更多的性能。不幸的是,发布构建是使用调试设置完成的,迄今为止,为优化案例争论的尝试都没有成功。使用编译器标志编译x86/ZI/Od/arch:SSE2/FAs.生成的程序集显示编译器没有使用SSE2.这是因为优化被禁用了吗?在代码中,有几个类似这样的情况:char*begin=&bufferObject;char*end=begin+sizeof(bufferObject);charresult;while(begin!=end){result^=*begin++;}

c++ - SSE/AVX 对齐内存上的 valarray

有没有办法确保valarray使用对齐内存,以便它可以用SSE和AVX进行矢量化?据我所知,STL不保证对齐,您可以不将分配器传递给valarray。还有其他方法可以实现吗?提前致谢! 最佳答案 我通常使用std::vector使用我自己的分配器,它将对齐作为模板参数并调用_mm_malloc()或_aligned_malloc().这非常有效,也适用于AVX(32字节对齐)。适当编写的模板化用户代码会自动选择所需的对齐方式。下面的代码为AlignmentAllocator和helper。在gcc和icpc下测试。///alloca

c++ - 如何使用 SSE 更有效地乘以 A*B^T 或 A^T*B^T(T 表示转置)矩阵?

我一直在用这个问题折磨自己。我有一个基于SSE的算法,用于将矩阵A乘以矩阵B。我还需要实现A、B或两者转置的操作。我做了一个简单的实现,下面表示的4x4矩阵代码(我认为这是非常标准的SSE操作),但是A*B^T操作花费的时间大约是A*B。ATLAS实现为A*B返回相似的值,并且乘以转置的结果几乎相同,这对我来说表明有一种有效的方法可以做到这一点。MM-乘法:m1=(mat1.m_>>2)>2)>2)el_[i]+j;_mm_storeu_ps(c0,_mm_add_ps(_mm_add_ps(cX1,cX2),_mm_loadu_ps(c0)));}{//secondrowofresu

c++ - 我应该如何将 SSE 数据传递给我的函数/运算符(operator)?

我正在为SSEIntrinsics编写几个包装类-主要是为了获得类型安全的几何操作,但也添加了一些方便的功能。我所有的函数和运算符都是内联的。理论上,它们都将直接编译为原始SSE程序集(无函数调用),并且我的电子永远不会离开XMM寄存器。如何将我的SSE类作为参数传递以确保此结果?我从不修改我的参数,所以选择主要是在按值传递或按常量引用传递之间进行选择。我假设一个好的编译器会优化同一代码的两种样式。但我不确定。在该领域有更多经验的人可以阐述最佳做法吗?提前致谢! 最佳答案 对于大多数编译器来说,两者都可以,但如果您希望代码使用Vis

c++ - 使用 SSE 将 8 位整数除以 4(或移位)

如何使用SSE内在函数将16个8位整数除以4(或将它们向右移动2)? 最佳答案 不幸的是,没有针对8位元素的SSE移位指令。如果元素是8位unsigned那么您可以使用16位移位并屏蔽不需要的高位,例如v=_mm_srli_epi16(v,2);v=_mm_and_si128(v,_mm_set1_epi8(0x3f));对于8位signed元素,它有点复杂,但仍然有可能,尽管解包为16位可能更容易,进行移位,然后打包回8位。 关于c++-使用SSE将8位整数除以4(或移位),我们在St

c++ - 编写可移植的 SSE/AVX 版本的 std::copysign

我目前正在使用SSE和AVX内在函数编写QR分解(线性系统求解器)的矢量化版本。其中一个子步骤需要选择与另一个值相反/相等的值的符号。在串行版本中,我为此使用了std::copysign。现在我想为SSE/AVX寄存器创建一个类似的函数。不幸的是,STL为此使用了一个内置函数,所以我不能只复制代码并将其转换为SSE/AVX指令。我还没有尝试过(所以我现在没有代码可以展示),但我的简单方法是创建一个所有值都设置为-0.0的寄存器,以便只设置有符号位。然后我会在源上使用AND操作来查明它的符号是否已设置。此操作的结果将是0.0或-0.0,具体取决于源的符号。结果,我将创建一个位掩码(使用逻

c++ - 将 SSE 翻译成 Neon : How to pack and then extract 32bit result

我必须将以下指令从SSE翻译成Neonuint32_ta=_mm_cvtsi128_si32(_mm_shuffle_epi8(a,SHUFFLE_MASK));地点:staticconst__m128iSHUFFLE_MASK=_mm_setr_epi8(3,7,11,15,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1);所以基本上我必须从寄存器中取出第4、8、12和16个字节并将其放入uint32_t。看起来像一个打包指令(在SSE中我似乎记得我使用了shuffle因为它比打包节省了一个指令,thisexample显示了打包指令的使用)。这个操作在Neon

c++ - 强制 AVX 内在函数改用 SSE 指令

不幸的是我有一个AMD打桩机cpu,它似乎有AVX指令的问题:Memorywriteswiththe256-bitAVXregistersareexceptionallyslow.Themeasuredthroughputis5-6timesslowerthanonthepreviousmodel(Bulldozer),and8-9timesslowerthantwo128-bitwrites.根据我自己的经验,我发现mm256内部函数比mm128慢得多,我假设这是因为上述原因。不过,我真的很想为最新的指令集AVX编写代码,同时仍然能够以合理的速度在我的机器上测试构建。有没有办法强制m

iphone - iPhone 支持 SSE2 吗?

我的代码中有很多语句包含__m128i、_mm_loadu_si128、_mm_avg_epu8等等。这东西在Mac上工作但无法在ios中编译。IOS中有哪些替代品? 最佳答案 SSE是iOS设备的ARM芯片上不可用的英特尔技术。看看Accelerateframework用于这些类型计算的Apple多平台API。ARM架构还提供了自己的SIMD(单指令多数据)指令集,称为NEON,可在armv7设备(iPhone3GS及更高版本)上使用。 关于iphone-iPhone支持SSE2吗?,

hadoop - 使用 KMS 在配置单元中进行列级加密

我正在寻求帮助,使用KMS在Hive中实现列级加密(与https://issues.apache.org/jira/browse/HIVE-7934完全相似)。虽然我清楚所引用URL中的第二部分,但我不清楚设置KMS和创建表脚本中的“TBLPROPERTIES('hive.encrypt.keynames'='hive.k1')”部分。非常感谢您的帮助。我搜索了stackoverflow,但找不到解决方案。谢谢尤瓦 最佳答案 hive.k1是将用于加密和解密配置单元列的kmskey名称。