有没有办法评估__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,一些比较:
未来的猜测:
AVX-512和可能的20核Xeon CPUs 3840 GLOPS(20核* 64 FLOP /周期* 3 Ghz)
Knights Landing 5907 GFLOPS(71芯* 64 FLOP /周期* 1.3 Ghz)
答案 0 :(得分:2)
你的问题非常有趣。您使用现有编译器无法完成所描述的内容。如果覆盖处理256b向量的基本运算符,您可能能够接近所需的功能。
然而我不会说这是SIMD编程与GPGPU 的最大限制。 GPGPU的主要优点是FLOPS计数,但这需要一些成本。一个是GPGPU不能很好地处理分支,不能处理处理大型本地数据的线程等。另一个限制是与传统编码相比,GPGPU编程模型相当复杂。 p>
在CPU上,您可以运行更多通用代码,编译器将在大多数情况下进行向量化,而无需要求程序员编写特定的内在函数。
所以我进一步说,简单代码实际上是CPU的优势。考虑将20年FORTRAN软件移植到GPGPU所需的工作量。如果你有一个好的编译器和一个好的CPU(具有良好的FLOP计数),你可能会获得预期的性能。