【发布时间】:2015-10-28 12:51:14
【问题描述】:
我正在尝试将位向量算法改造成使用浮点数而不是整数。听起来很荒谬,但我们的想法是使用 AVX 优化,对于当前的许多处理器来说,这将允许同时处理四倍的数据量。
现在浮点数缺少 |、& 和 ^ 操作,所以我认为可能我必须将位向量解释为整数才能应用这些操作。 (并且希望仍然可以从算法的其余部分获得足够的速度。)
澄清:我基本上想将 |,^,& 应用于双打。我知道这些是结构化数据类型,并且这些操作对浮点数没有任何意义。我知道摆弄位可能必须限制在有效位上。我知道很难控制浮点的变化(我可能需要一些前导零。)。我对汇编语言一无所知。重点是使用larger parallelism/throughput in floating point SIMD calculations。
我的问题是如何以最佳方式做到这一点,以及在速度方面是否可行。 (毕竟我是在与原始的基于整数的算法竞争。)
鉴于我是 C 编程方面的相对菜鸟,我也非常感谢有关这项工作的一般建议。
编辑:代码可能会在 Ivy 或 Sandy Bridge 处理器上运行。
进一步说明: 假设原始算法有这一步:
X
现在我用双精度数重新创建这一步,注意指数等于零,并且在隐含的第一个零之后有一个前导零。
X
在这种情况下,我的双打尾数的最后 51 位经历与原始整数的 64 位相同的过程。不同之处在于,我可以同时处理四个数据点。 IE。 204 位而不是 64 位(好吧,这是两个操作,所以可能只有 102 位)。 但下一步需要 X
当然,这个概念可能存在许多误解和错误。毕竟这是一个相对初学者的相当复杂的想法。
【问题讨论】:
-
您应该展示一些代码,至少是您感兴趣的操作的相关部分。AVX 是否有任何相关说明?此外,在不指定处理器或确切代码的情况下询问循环计数会使问题很难回答。
-
在 AVX 指令集中对浮点数进行按位运算,因此您甚至不必转换任何内容。
-
这听起来很奇怪。 float 是一种结构化数据类型,而 bitops 对位域进行操作。所以
1.5 & 4e-7毫无意义。 -
为什么不使用嵌入式程序集呢?这将更容易实现。
-
等等,你要模拟双精度整数?这是没有意义的。那就用SSE4吧。
标签: c floating-point bit-manipulation