xuss个人博客分享 http://blog.sciencenet.cn/u/xussnjupt Spinor

博文

fortran编译器效率

已有 928 次阅读 2023-9-16 22:40 |个人分类:科研笔记|系统分类:科研笔记

最近在购置一台高性能的计算机,2颗96核CPU(AMD EPYC 9654),192G内存。只买了机器,没有额外的软件服务,价格相对比较便宜。主要是做矩阵的计算,在计算矩阵元素的时候循环也很多,所以一方面在考虑用哪个linux操作系统,另一方面是测试在AMD平台下两大编译器的性能。

作为计算服务器使用,主要是稳定,可能要用很多年,软件能用就不会更新它。可能更新一个软件就会导致出问题。查了一些资料和评论,主要用的免费系统有centos, debian, ubuntu server。不过centos已经宣布到2024年停止维护。debian系统在虚拟机中测试了一下,ifort的安装比较困难。新版的ifort只支持debian11,而debian系统一般也只支持较老版本的软件。也了解到,中科大计算中心的三组集群,其中最新的一组用的是ubuntu再加上ubuntu之前用过,决定还是用ubuntu。ubuntu安装新版本的软件比较容易。

现在新计算机还没到,在macOS上测试下fortran编译器(intel core i9处理器)。以前对gfortran和ifort进行过测试,当时的程序ifort的效率比gfortran高出很多。因为矩阵运算用得较多,今天又专门测试了fortran的内置的矩阵相乘函数matmul,发现gfortran的效率比ifort要高。都是在-O3参数下编译,

双精度实数矩阵大小n*nifort运算时间(s)gfortran运算时间(s)
3000*30005.783.25
4000*400013.527.71
5000*500026.0414.94

可以看到,gfortran的效率接近ifort的两倍。

另外,又测试了用三重循环写的矩阵相乘,进一步对比编译器的效率

C(1:n,1:n)=0.0D0
do i=1,n
  do j=1,n
    do k=1,n
      C(i,j)=C(i,j) + A(i,k)*B(k,j)
    enddo
  enddo
enddo
双精度实数矩阵大小n*nifort运算时间(s)gfortran运算时间(s)
2000*20001.69846.33
3000*30005.75208.7
4000*400013.57540.6

从这张表上可以看到,gfortran的运行效率比ifort慢得太多了。而再对比两张表格,可以看到,ifort用两种算法的效率几乎相同,而gfortran差别巨大。

三重循环计算矩阵相乘,如果写得不好,ifort也可能会很慢。比如

 do i=1,n
    do j=1,n
        tc=0.0D0
        do k=1,n
        tc=tc + A(i,k)*B(k,j)
        enddo
        C(i,j)=tc
    enddo
  enddo

这段代码,只是将C(i,j)用一个变量代替,最后再把结果赋给C(i,j)。用ifort的效率就会大幅下降。

单纯矩阵的运算matmul函数使用gfortran进行编译运行更好,而多重循环用ifort编译会更好。对于一个综合性的大程序,ifort的综合效率会更高。



https://blog.sciencenet.cn/blog-3427588-1402859.html

上一篇:面上项目失利
下一篇:讲授电动力学-第二轮
收藏 IP: 223.65.128.*| 热度|

0

该博文允许注册用户评论 请点击登录 评论 (0 个评论)

数据加载中...
扫一扫,分享此博文

Archiver|手机版|科学网 ( 京ICP备07017567号-12 )

GMT+8, 2024-4-27 15:27

Powered by ScienceNet.cn

Copyright © 2007- 中国科学报社

返回顶部