Fortran Coder

楼主: gps99
打印 上一主题 下一主题

[线性代数] 关于几个数学工具,矩阵运算速度的初步测试

[复制链接]

19

帖子

0

主题

0

精华

专家

F 币
370 元
贡献
122 点
楼主
发表于 2022-4-17 07:49:33 | 显示全部楼层
Julia那个应该是把时间花在类型转换上了。类似的“benchmark”网上有很多,但是大多数都是疑点重重的,关键在于怎么用不同的语言写出等效的代码。比如说你的julia代码,M乘以Mi的时候是一个整数矩阵乘以一个浮点数矩阵,每一个元素相乘的时候都要做一次类型转换。但是如果你提前把M转化成浮点数的矩阵,速度就上来了。python或者是numpy应该是把这一步给包起来了。我测试了一下

(1)Python:
[Python] 纯文本查看 复制代码
import numpy as np

matrix_size = 4000
int_range = (1, 99)
M = np.random.randint(*int_range, (matrix_size, matrix_size))
Mi = np.linalg.inv(M)
Re = np.dot(M, Mi)


(2)Julia:(论坛里貌似没有Julia的高亮)
[Python] 纯文本查看 复制代码
matrix_size = (4000, 4000)
int_range = 1:99
M = rand(int_range, matrix_size...)
Mᵣ = Array{Float32}(M)
Mᵢ = inv(Mᵣ)
Rₑ = Mᵣ * Mᵢ


结果是差不多的julia稍微快一点:
$ time python test.py

real    0m3.473s
user    0m22.469s
sys     0m2.250s

$time julia test.jl

real    0m2.202s
user    0m8.245s
sys     0m2.246s

如果换成Float64 julia速度会降下来一点但是也就是4秒多一点,绝对不至于跌出一个数量级来。然后调用OpenBLAS的时候矩阵超过一定大小应该就会自动超线程了,Julia和python在这个层面上是否做了一样的事情我也不太清楚。

大部分情况下如果代码耗时在同一个硬件上出现了数量级的差距,那基本上都是算法上不等效(当然你如果用纯python不调用任何库那肯定会慢出天际……)。

Fortran那个代码我暂时还没测试,有空了我再来玩玩~

您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

捐赠本站|Archiver|关于我们 About Us|小黑屋|Fcode ( 京ICP备18005632-2号 )

GMT+8, 2024-5-17 09:53

Powered by Tencent X3.4

© 2013-2024 Tencent

快速回复 返回顶部 返回列表