Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/143.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用SIMD范例对256位向量应用给定函数_C++_C_Optimization_Compiler Optimization_Simd - Fatal编程技术网

C++ 使用SIMD范例对256位向量应用给定函数

C++ 使用SIMD范例对256位向量应用给定函数,c++,c,optimization,compiler-optimization,simd,C++,C,Optimization,Compiler Optimization,Simd,有没有办法沿着\uuum256d/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.0

有没有办法沿着
\uuum256d/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;
}
#包括
内联m256d func(uuuuM256D*a、uuuuM256D*b)
{
返回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);
返回0;
}
我想使用SIMD范式评估任何给定的数学函数。 如果这是不可能的,这不是SIMD编程与GPGPU最大的限制吗? 我的意思是,我已经意识到CPU的计算能力越来越接近GPU,一些比较:

  • Nvidia Quadro K6000~5196 GFLOPS
  • Nvidia Quadro K5000~2169 GFLOPS
  • 英特尔至强E5-2699 v3~1728千兆次(18核*32次/周期*3 Ghz)
未来的猜测:

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

  • 骑士着陆5907千兆次(71核*64次/周期*1.3千兆赫)


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

      但是我不会说这是SIMD编程相对于GPGPU的最大限制。GPGPU的主要优点是浮点计数,但这需要付出一定的代价。一个是GPGPU不能很好地处理分支,不能很好地处理处理大量本地数据的线程等。另一个限制是GPGPU编程模型与传统编码相比相当复杂

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


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

      内部函数实际上总是特定于编译器的,所以你应该公布你正在使用的编译器。不,你不能只“使用SIMD范式”运行任意函数。您只能运行目标CPU支持的SIMD指令。@DanielKamilKozar g++或cl@user3379939如果您使用CL,那么可以使用@Mgetz,我认为CL还意味着visualstudioc/c++编译器。