使用SIMD范例在256位向量上应用给定函数

时间:2014-11-11 19:31:45

标签: c++ c optimization compiler-optimization simd

有没有办法评估__m256d/s向量的函数?像这样:

#include <immintrin.h>

inline __m256d func(__m256d *a, __m256d *b)
{
    return 1 / ((*a + *b) * (*a + *b));
}

int main()
{
    __m256d a = _mm256_set_pd(1.0f, 2.0f, 3.0f, 4.0f);
    __m256d b = _mm256_set_pd(1.0f, 2.0f, 3.0f, 4.0f);
    __m256d c = func(a, b);

    return 0;
}

我想使用SIMD范例评估任何给定的数学函数。 如果这不可能,这不是SIMD编程Vs GPGPU的最大限制吗? 我的意思是我已经意识到CPU的FLOPS计算能力越来越接近GPU,一些比较:

  • Nvidia Quadro K6000~5196 GFLOPS
  • Nvidia Quadro K5000~2169 GFLOPS
  • Intel Xeon E5-2699 v3~1728 GFLOPS(18核* 32 FLOP /周期* 3 Ghz)

未来的猜测:

  • AVX-512和可能的20核Xeon CPUs 3840 GLOPS(20核* 64 FLOP /周期* 3 Ghz)

  • Knights Landing 5907 GFLOPS(71芯* 64 FLOP /周期* 1.3 Ghz)

1 个答案:

答案 0 :(得分:2)

你的问题非常有趣。您使用现有编译器无法完成所描述的内容。如果覆盖处理256b向量的基本运算符,您可能能够接近所需的功能。

然而我不会说这是SIMD编程与GPGPU 的最大限制。 GPGPU的主要优点是FLOPS计数,但这需要一些成本。一个是GPGPU不能很好地处理分支,不能处理处理大型本地数据的线程等。另一个限制是与传统编码相比,GPGPU编程模型相当复杂。 p>

在CPU上,您可以运行更多通用代码,编译器将在大多数情况下进行向量化,而无需要求程序员编写特定的内在函数。

所以我进一步说,简单代码实际上是CPU的优势。考虑将20年FORTRAN软件移植到GPGPU所需的工作量。如果你有一个好的编译器和一个好的CPU(具有良好的FLOP计数),你可能会获得预期的性能。