Fortran vs C:Mandelbrot基准

paw*_*zig 6 c performance benchmarking fortran

我偶然发现了基准游戏(代码页)并比较了Fortran和C.我对Mandelbrot测试的计算时间差异感到非常惊讶(Fortran慢了4.3倍!)因为两种语言都有非常相似的功能集.此外,Fortran应该能够更加激进地进行优化(例如,"对于重度计算,Fortran是否比C更容易优化?").

可以解释Fortran中缺少哪些功能,以获得速度,例如在C示例中?(似乎这里的位操作正在提升代码.)

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


附加由彼得·科德斯答案:有在一张纸上为Fortran应用程序矢量化基础也即将讨论SIMD在FORTRAN编程.对于英特尔编译器:Fortran中的显式向量编程

Pet*_*des 6

该基准站点上获胜的C++版本使用SIMD内在函数(SSE,AVX或AVX512)为x86 手动矢量化,例如使用 _mm256_movemask_pd(v1 <= v2);获取比较结果的整个矢量的位掩码,让它并行检查4个像素边界 用于SIMD乘法的GNU C本机向量语法等等,比如r2 + i2用普通的C/C++运算符添加或乘以SIMD向量.

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).
Run Code Online (Sandbox Code Playgroud)

Fortran只是使用OpenMP进行自动并行化,编译器的自动向量化不会创建任何与手动调整的循环条件一样好的东西,这种情况一直在做源代码没有的冗余工作(因为它比更频繁地检查).


该程序的许多C和C++版本与Fortran版本的速度相似. 它们非常适用于未手动矢量化的C/C++源代码.

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

  • 所以基本上是用C语法伪装的程序集. (4认同)