双精度数组上的 SIMD?

Posted

技术标签:

【中文标题】双精度数组上的 SIMD?【英文标题】:SIMD on an Array of Doubles? 【发布时间】:2009-02-15 21:41:09 【问题描述】:

我正在做一些需要 SIMD 的工作,我需要对双精度数组进行操作。是否有任何主流架构支持这一点?我只见过浮点运算。

提前致谢, 斯蒂芬

【问题讨论】:

【参考方案1】:

是的,x86 可以通过 SSE2 指令来实现。一个 CELL 也是如此,尽管它在进行双精度计算时的性能非常糟糕。

【讨论】:

嘿,为什么这是唯一获得投票的答案? ;) 其他的看起来一样正确,不是吗? 我只看过 SSE1,这就是我需要的答案。非常感谢! 请注意,使用带双精度的 SSE2 获得的加速也不是很好,因为一次只能处理两个值。等待 AVX,它会将 256 位宽的寄存器带到表中,可能会使吞吐量翻倍。【参考方案2】:

ARM VFP 也可以做双打。

新的 NEON SIMD 扩展(顺便说一句,迄今为止我见过的最好的 SIMD 指令集)只能处理 32 位浮点数。

【讨论】:

【参考方案3】:

Here's VS2008 中的 C++ 编译器支持的 SEE2 内部函数。

正如 jalf 所提到的,CELL 处理器对 SIMD 的双精度支持会严重影响性能(我相信 PS3 中未使用的芯片的后续迭代具有很大改进的行为)。

就主流而言,SSE2 于 2001 年出现在 pentium 4 中,因此在 x86 行业中很普遍。根据steam hardware survey 95% 的人口有 SSE2,所以我认为定位它是安全的。

【讨论】:

【参考方案4】:

以 1.3 或更高的计算能力运行的 CUDA 也可以做到这一点。较新的 GTX 2xx 卡可以做到这一点。

【讨论】:

请注意,大多数具有 1.3 计算能力的 GPU 每个内核只有 1 个双精度 FPU,必须由所有线程共享,而您获得 8 个单精度 FPU,即每个活动线程一个。巨大的性能差异 - 尽可能使用单精度。

以上是关于双精度数组上的 SIMD?的主要内容,如果未能解决你的问题,请参考以下文章

为啥这个 SIMD 乘法不比非 SIMD 乘法快?

如何将 4 个浮点数的 ps 向量转换为 4 个双精度数并存储到 pd 数组?

如何将无符号整数加载到 SIMD 中

是否可以基于 Vector<double> 在 .Net 中创建高效的 SIMD 双精度 Vector3

在 Visual Studio 中以字节数组形式将 64 位双精度转换为 80 位双精度

如何在Java中将浮点数组转换为双精度数组?