我正在Haskell中编写一个游戏,而我在UI上的当前传递涉及很多程序生成的几何体.我目前专注于识别一个特定操作(C-ish伪代码)的性能:
Vec4f multiplier, addend;
Vec4f vecList[];
for (int i = 0; i < count; i++)
vecList[i] = vecList[i] * multiplier + addend;
Run Code Online (Sandbox Code Playgroud)
也就是说,沼泽标准的四个浮点数的乘法加法,这是SIMD优化成熟的事情.
结果将转到OpenGL顶点缓冲区,因此最终必须将其转储到平面C数组中.出于同样的原因,计算可能应该在C'浮点'类型上完成.
我已经找到了一个库或本地惯用解决方案来在Haskell中快速完成这类工作,但我提出的每个解决方案似乎都徘徊在性能的2%左右(即,慢50倍) GCC带有正确的旗帜.当然,我几周前开始使用Haskell,所以我的经验有限 - 这就是为什么我要来找你们.您是否可以为更快的Haskell实现提供建议,或者指向如何编写高性能Haskell代码的文档?
首先,最新的Haskell解决方案(时钟约12秒).我尝试了这个SO帖子中的爆炸模式,但它并没有给AFAICT带来任何影响.将'multAdd'替换为'(\ iv - > v*4)'将执行时间缩短到1.9秒,因此按位(以及随后的自动优化挑战)似乎没有太多错误.
{-# LANGUAGE BangPatterns #-}
{-# OPTIONS_GHC -O2 -fvia-C -optc-O3 -fexcess-precision -optc-march=native #-}
import Data.Vector.Storable
import qualified Data.Vector.Storable as V
import Foreign.C.Types
import Data.Bits
repCount = 10000
arraySize = 20000
a = fromList $ [0.2::CFloat, 0.1, 0.6, 1.0]
m = fromList $ [0.99::CFloat, 0.7, 0.8, 0.6] …Run Code Online (Sandbox Code Playgroud)