发信人: huicai (老灰菜), 信区: Fortran
标 题: 高效使用FORTRAN数组
发信站: 瀚海星云 (2002年10月10日23:06:02 星期四), 站内信件
高效使用FORTRAN数组
1、数组整体访问
最快的数组操作发生在连续访问整个数组或大部分数组的时候。对整个数组或大部分数组实施一个或者几个数组操作要比对分散的数组元素经行庞大的操作效率高得多。
与其使用显式的数组循环访问不如使用数组的基本操作,例如需要把数组变量A的每个元素都增加1:
A=A+1
读写一个数组时,应该使用数组名而不是指定每一个元素编号的DO循环或者隐DO循环。
2、使用列为主的数组访问和存储
引用所谓FORTRAN数组时,要保证使用正确的引用语法并注意列为主的“正常”增加顺序。对于列为主的顺序,数组最左边的下标变化最快。
行为主的顺序(例如C语言)或任意顺序的多维数组访问常常会使CPU高速缓存的使用效率低下,所以应该避免行为主的顺序。
3、尽量使用FORTRAN90内在数组过程
4、多维数组的维的宽度
在分散访问数组元素的多维数组中,应避免最左侧的数组维的宽度为2的幂次方,比如512。
因为高速缓存的大小是2的幂次方,如果数组的大小也是2的幂次方,那么分散访问数组元素时就会降低高速缓存的使用效率。在alpha系统上,如果数组最左侧的维宽度正好是高速缓存的倍数的话,则这个程序坑几乎无法利用高速缓存。
如果是顺序访问或者整体访问数组则不存在这个问题。
一种改善的方法是增加维的宽度,允许存在一些没用的元素,从而使最左侧的宽度变成非2的幂次方,,例如把最左侧512变为520就能更有效地利用高速缓存。
在较高级的优化中(三级以上),编译系统会填补由2的幂次方问题可能引起的高速缓存的使用效率低下。
--
※ 来源:·瀚海星云 bbs.ustc.edu.cn·[FROM: 210.45.124.65]
--
标 题: 高效使用FORTRAN数组
发信站: 瀚海星云 (2002年10月10日23:06:02 星期四), 站内信件
高效使用FORTRAN数组
1、数组整体访问
最快的数组操作发生在连续访问整个数组或大部分数组的时候。对整个数组或大部分数组实施一个或者几个数组操作要比对分散的数组元素经行庞大的操作效率高得多。
与其使用显式的数组循环访问不如使用数组的基本操作,例如需要把数组变量A的每个元素都增加1:
A=A+1
读写一个数组时,应该使用数组名而不是指定每一个元素编号的DO循环或者隐DO循环。
2、使用列为主的数组访问和存储
引用所谓FORTRAN数组时,要保证使用正确的引用语法并注意列为主的“正常”增加顺序。对于列为主的顺序,数组最左边的下标变化最快。
行为主的顺序(例如C语言)或任意顺序的多维数组访问常常会使CPU高速缓存的使用效率低下,所以应该避免行为主的顺序。
3、尽量使用FORTRAN90内在数组过程
4、多维数组的维的宽度
在分散访问数组元素的多维数组中,应避免最左侧的数组维的宽度为2的幂次方,比如512。
因为高速缓存的大小是2的幂次方,如果数组的大小也是2的幂次方,那么分散访问数组元素时就会降低高速缓存的使用效率。在alpha系统上,如果数组最左侧的维宽度正好是高速缓存的倍数的话,则这个程序坑几乎无法利用高速缓存。
如果是顺序访问或者整体访问数组则不存在这个问题。
一种改善的方法是增加维的宽度,允许存在一些没用的元素,从而使最左侧的宽度变成非2的幂次方,,例如把最左侧512变为520就能更有效地利用高速缓存。
在较高级的优化中(三级以上),编译系统会填补由2的幂次方问题可能引起的高速缓存的使用效率低下。
--
※ 来源:·瀚海星云 bbs.ustc.edu.cn·[FROM: 210.45.124.65]
--