FORTRAN为啥要将数据区分类型

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了FORTRAN为啥要将数据区分类型相关的知识,希望对你有一定的参考价值。

参考技术A 据我个人的经验,编程语言之所以区分类型,
1:便于编程人员的理解,就是把数字对象化,比方说说Age,一般就是整型,不会是浮点型或者
字符串等其它类型。
2:有利于节省资源,如果都用统一的类型,或者部分类型,那你定义某个变量的时候,系统
一般都会分配资源去存储他们,那么这样一来,所有的变量都会用统一大小的空间,会造成
一定的资源浪费。
3:考虑到溢出的问题,如果分了类型,针对每一个类型,都会有一个限度,或者说区间大小,
这样当你的变量大小超过某一个限度时,在编译时就会检查出来,不会成为隐患。
4:利于变量的计算,以及转换等操作,我们希望运算:字符(1.25)+整形(10)=1.2510,
而不是:统一类型(1.25)+统一类型(10)=11.25.
希望对你有所帮助!

为啥 Julia 代码性能比 Fortran 低很多?

【中文标题】为啥 Julia 代码性能比 Fortran 低很多?【英文标题】:why Julia code performance is much lower than Fortran one?为什么 Julia 代码性能比 Fortran 低很多? 【发布时间】:2021-08-07 10:14:57 【问题描述】:

我在几个地方读到 Julia 代码的性能(在某些条件下)可以与 Fortran 的性能进行比较。我在 Julia 中编写了以下代码:

Pi = 3.141592653589793238462643
n = 100000 
function integration_2d(n,Pi,sum)
       h = Pi/n
       for i=1:n
           x = h*(i-0.5)
           for j=1:n
               y = h*(j-0.5)
               sum = sum + cos(x + y)
           end
       end
       sum*h*h
end

平均执行时间为 180 秒。与使用-O3 选项编译的Fortran 代码相比,结构非常接近的Fortran 代码的执行时间为0.013 秒。我想知道 Julia 代码在哪里失去性能,任何评论都值得赞赏。谢谢。

【问题讨论】:

对于这样的声明,最好知道 1) 用于比较的 Fortran 版本,以及 2) 您如何对此进行基准测试的代码。 您正在计算cos 的总数为 100000^2 = 10^10 次。您声称在 Fortran 中这需要 0.013 秒。这意味着每个余弦评估需要 1.3*10^(-12) 秒。 CPU 可以在每纳秒 10^(-9) 秒内执行非常近似的一次操作。很明显,Fortran 代码并没有完成您认为它在运行时所做的工作。对于基准测试来说,这是一个持续存在的危险。你必须确保你测量的是你认为你正在测量的东西。 顺便说一句,不需要手动定义Pi,因为pi已经是Julia的内置常量了。 Fortran 编译器是否有可能使用 O3 优化重新排列代码,天真地编写为 O(N^2),类似于 @Vitality 发布的 O(N) 代码?如果是这样,Julia 是否可以实现同样的优化? 嗨,这是我在 Fortran 代码中犯的一个错误。我收集了部分金额,但没有打印出结果。因此,编译器忽略了整个计算。 【参考方案1】:

由于您没有提供 Fortran 代码,我假设您的代码使用 Fortran 实现的方式不同。您的 O(N^2) 算法需要 CPU 每秒 > ~10^12 次操作(即使使用汇编程序),我猜您没有使用超级计算机进行此测试:)。 我们可以以需要 O(N) 性能的方式实现您的算法。 Julia 代码如下所示:

function integration_2d(n, sum=0.0)
    h = π / n
    multiplier = 1
    for i = 2:2n
        z = h * (i - 0.5)
        sum = sum + multiplier * cos(z)
        if i <= n
            multiplier += 1
        else
            multiplier -= 1
        end
    end
    sum * h * h
end

julia> @time integration_2d(100000)
  0.002846 seconds

在我的笔记本电脑上,Wich 是 0.002846 秒(> 是您使用的 Fortran 时间的 4 倍)(因为您没有提供 Fortran 代码,所以我无法正确比较同一台机器上的性能)

【讨论】:

以上是关于FORTRAN为啥要将数据区分类型的主要内容,如果未能解决你的问题,请参考以下文章

为啥要将类型放在未命名的命名空间中?

请问mysql数据类型是不是区分大小写?

派生数据类型中的 Fortran、参数和静态表

fortran中逻辑数据类型,在内存中的存储情况?

在 Fortran 中多次循环后访问派生数据类型

如何在Fortran中复制未知类型的数据?