我正在尝试将一点矢量算法重写为使用浮点数而不是整数。听起来很荒谬,但我们的想法是使用AVX优化,这对于许多当前的处理器来说将允许同时处理四倍的数据量。
现在花车缺乏|,&和^操作,所以我认为可能我必须将bitvectors解释为整数来应用这些操作。 (并且希望仍能从算法的其余部分获得足够的速度。)
澄清:我基本上想申请|,^,&加倍。我知道那些是结构化数据类型,并且这些操作对浮点数没有任何意义。我知道这个小提琴可能不得不局限于有效数字。我知道很难控制浮点的移位(我可能需要一些前导零)。我对汇编语言一无所知。重点是使用larger parallelism/throughput in floating point SIMD calculations。
我的问题是如何以最佳方式执行此操作以及在速度方面是否可行。 (毕竟我正在与原始的基于整数的算法竞争。)
鉴于我是C编程中的相对noob,我也很感谢有关这项努力的一般建议。
编辑:代码可能会在Ivy或Sandy Bridge处理器上运行。
进一步说明: 假设原始算法有这一步:
X < - A + B
现在我用双精度重新创建这一步,小心指数等于零,并且在隐含的第一个零之后有一个前导零。
X < - A + B - 1.0
在这种情况下,我的双打尾数的最后51位经历与原始整数的64位相同的过程。不同的是,我可以同时为四个数据点做到这一点。即204位而不是64位(好吧,它是两个操作,所以可能只有102位)。 但是下一步要求X < - A | B,或A&amp; B,或A ^ B ...... 怎么办?
当然,在这个概念中可能存在任何数量的误解和错误。毕竟,这是一个相对初学者的非常复杂的想法。
答案 0 :(得分:1)
为什么不使用VORPS,VANDPS和VXORPS指令,它们是精确按位的,或者和AVX向量上的xor?没有必要限制52位有效数字或玩任何其他有趣的游戏;虽然这些指令位于浮点域中,但它们只是对256b向量的按位运算。你方式过于复杂了。