将3D数学转换为SSE或其他SIMD需要多少加速?
3967 观看
7回复
回应 (7)
7像
在我的经验,我通常会看到大约提高了3倍,采取的算法从的x87上交所和更好低于5倍的改善将VMX / AltiVec技术(因为具有与管线深度,日程安排等做复杂的问题)。但是我通常只在我有数百或数千个数字操作的情况下这样做,而不是那些我一次只做一个矢量的情况。
作者: Crashworks 发布者: 22.12.2009 01:203像
这不是整个故事,但是可以使用SIMD进一步优化,看看Miguel关于何时用他在PDC 2008上举行的MONO实施SIMD指令的演讲,
(来源:tirania.org)
2像
对于3D操作,请注意W组件中未初始化的数据。我已经看到SSE操作(_mm_add_ps)由于W中的错误数据而需要10倍正常时间的情况。
作者: Brian Hayes 发布者: 03.10.2013 04:561像
答案很大程度上取决于库正在做什么以及如何使用它。
增益可以从几个百分点增加到“快几倍”,最容易看到增益的区域是那些你不处理孤立向量或值的区域,但是多个向量或值必须在同样的方式。
另一个领域是当你达到缓存或内存限制时,这又需要处理很多值/向量。
增益可能是最激烈的领域可能是图像和信号处理,计算模拟以及网格上的一般3D数学运算(而不是孤立的矢量)。
作者: Eric Grange 发布者: 29.05.2009 10:241像
对于一些非常粗略的数字:我听说ompf.org上的一些人声称对于一些手动优化的光线追踪程序,速度提升了10倍。我也有一些很好的加速。根据问题的不同,我估计我的例行程序介于2x和6x之间,其中许多都有一些不必要的存储和负载。如果您的代码中有大量的分支,请忘记它,但对于自然数据并行的问题,您可以做得很好。
但是,我应该补充一点,您的算法应该设计用于数据并行执行。这意味着如果你有一个你提到的通用数学库那么它应该采用打包向量而不是单个向量,否则你只会浪费你的时间。
例如,像
命名空间SIMD { class PackedVec4d { __m128 x; __m128 y; __m128 z; __m128 w; // ... }; }
性能至关重要的大多数问题都可以并行化,因为您最有可能使用大型数据集。您的问题听起来像是我过早优化的情况。
作者: Rehno Lindeque 发布者: 09.09.2009 01:050像
目前,x86的所有优秀编译器都默认生成SP和DP浮点数学的SSE指令。使用这些指令几乎总是比本地指令快,即使是标量操作,只要你正确安排它们。这对许多人来说都是一个惊喜,他们过去发现SSE“慢”,并认为编译器无法生成快速的SSE标量指令。但现在,您必须使用开关来关闭SSE生成并使用x87。请注意,x87此时已被有效弃用,可能会完全从未来的处理器中删除。这样做的一个缺点是我们可能失去了在寄存器中进行80位DP浮点运算的能力。但是,如果您依靠80位而不是64位DP浮点数来获得精度,那么共识似乎就是这样,您应该寻找更精确的容错算法。
以上所有内容都让我感到非常惊讶。这非常直观。但数据谈判。
作者: user114229 发布者: 29.05.2009 10:41来自类别的问题 :
- optimization 大O,你如何计算/近似它?
- optimization 连接字符串最有效的方法?
- optimization 在C中,i ++和++ i之间是否存在性能差异?
- optimization 哪些C ++编译器进行尾递归优化?
- x86 x86中“非暂时”内存访问的含义是什么?
- x86 将3D数学转换为SSE或其他SIMD需要多少加速?
- x86 System.BadImageFormatException:无法加载文件或程序集(来自installutil.exe)
- x86 EBP帧指针寄存器的用途是什么?
- native 如何重命名DLL但仍然允许EXE找到它?
- native 编译为本机代码并包含电池的编程语言
- native 将C#编译为Native?
- sse 如何确定内存是否对齐?
- sse 如何利用C中的SSE内禀函数计算矢量点积
- simd 如何使用gcc进行矢量化?