Fortran与C:Mandelbrot基准测试



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

我们能解释一下Fortran中缺少的哪一个功能是为了获得像C示例中那样的速度所必需的吗?(这里的比特操作似乎在增强代码。)

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


对Peter Cordes的回答进行补充:有一篇关于Fortran应用程序矢量化基础的论文,也简要讨论了Fortran编程中的SIMD。英特尔编译器:Fortran 中的显式矢量编程

该基准站点上获胜的C++版本是为x86手动向量化的,使用SIMD内部函数(SSE、AVX或AVX512),例如使用_mm256_movemask_pd(v1 <= v2);获得比较结果的整个向量的位掩码,让它并行检查4个像素是否越界。GNU C原生向量语法用于SIMD乘法等等,比如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++源代码,它们也很不错。

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

相关内容

  • 没有找到相关文章

最新更新