我偶然发现Benchmark Game (code page),并比较了Fortran和C。我对Mandelbrot测试的计算时间差异感到惊讶( Fortran慢4.3倍!),因为两者语言具有非常相似的功能集。 此外,Fortran应该能够优化更多的基本功能(例如,参见"Is Fortran easier to optimize than C for heavy calculations?")。
是否可以解释一下Fortran中缺少的哪些功能,例如C语言示例中那样,它需要提高速度? (看来here的位运算正在增强代码。)
编辑:哪种编程语言更好(这总是有很多方面起作用)不是问题。在这个示例中,这是关于优化差异的一个基本问题。
附加件:彼得·科德斯(Peter Cordes)的答案:Basics of Vectorization for Fortran Applications上有一篇论文,该论文也简短讨论了Fortran编程中的SIMD。对于英特尔编译器:Explicit Vector Programming in Fortran
答案 0 :(得分:5)
使用SIMD内在函数(SSE,AVX或AVX512)针对x86,对该基准站点上获胜的C ++版本进行了手动矢量化 ,例如使用_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).
Fortran仅使用OpenMP进行自动并行化,而编译器进行的自动矢量化将无法创建与手动调整的循环条件几乎一样好的东西,而这种情况会继续执行源代码没有做的多余工作(因为比经常检查便宜。)
该程序的许多C和C ++版本的速度与Fortran版本相似。即使对于未手动矢量化的C / C ++源,它们也相当漂亮。
>我不确定Intel Fortran或任何其他编译器是否支持手动矢量化扩展。