代码之家  ›  专栏  ›  技术社区  ›  pawel_winzig

Fortran与C:Mandelbrot基准

  •  3
  • pawel_winzig  · 技术社区  · 6 年前

    我偶然发现 Benchmark Game (code page) 比较了fortran和c.i,我对Mandelbrot测试中计算时间的差异感到非常惊讶。( Fortran慢了4.3倍! )因为两种语言都有非常相似的特性集。 此外,Fortran应该能够优化更激进的(参见 "Is Fortran easier to optimize than C for heavy calculations?" )

    有人能解释一下Fortran中缺少哪些特性,而在C示例中,这些特性是获得速度所必需的吗?(似乎钻头操作 here 正在增加代码。)

    编辑:问题不在于哪种编程语言更好(总是有很多方面起作用)。在这个例子中,这是一个关于优化差异的基本问题。


    添加 彼得·考兹的回答是:有一篇关于 Basics of Vectorization for Fortran Applications 这也很快在Fortran编程中讨论了SIMD。对于英特尔编译器: Explicit Vector Programming in Fortran

    1 回复  |  直到 6 年前
        1
  •  5
  •   Peter Cordes    6 年前

    在该基准站点上获胜的C++版本是 手动矢量化 对于x86,使用simd intrinsics(SSE、AVX或AVX512) ,例如使用 _mm256_movemask_pd(v1 <= v2); 为了得到一个比较结果的整个向量的位掩码,让它检查4个像素是否超出界限。以及用于simd multiple等的gnu c本机向量语法 r2 + i2 将SIMD向量与正常C/C++算子相乘或相乘。

    C++版本有一个为SIMD优化的循环条件:

     // Do 50 iterations of mandelbrot calculation for a vector of eight
     // complex values.  Check occasionally to see if the iterated results
     // have wandered beyond the point of no return (> 4.0).
    

    Fortran只是使用OpenMP来实现自动并行化,而编译器的自动矢量化并不会创造出比手动调节循环条件更好的效果,因为手动调节循环条件可以继续执行源代码没有的冗余工作(因为这比更频繁地检查要便宜)。


    有很多C和C++版本的程序和FORTRAN版本有类似的速度。 它们甚至对于C/C++源并不是手动矢量化的。

    我不确定英特尔Fortran或其他编译器是否支持手动矢量化扩展。