回 帖 发 新 帖 刷新版面

主题:[讨论]比较了一下串行、并行中的重载函数效率

比较了以下三种情况,有些疑问
1. 串行情况下 matmul
2. OpenMP并行下的matmul
3. OpenMP并行下的matmul的重载函数mt

对附件文件进行编译:
ifort /O3 /Qopenmp mtml_inomp.f90 /link /STACK:50000000,50000000

然后运行 mtml_inomp
在我的电脑上效率是  3>2>1,不明白为什么重载函数效率超过原函数好多

PS:电脑是i7 4核8线程 16G内存
!############################################################
[size=5]###实际问题在2楼###[/size]

回复列表 (共21个回复)

11 楼


呵呵,我来学习一下

12 楼

[url=http://www.80ev.com/]科士威[/url]
[url=http://www.echx.cn/]e科士威[/url]
[url=http://www.642weimai.com/]维迈[/url]
[url=http://www.iecosway.com/]ecosway[/url]

13 楼


楼主辛苦,我来支持一下。
[url=http://www.80ev.com/]科士威[/url]
[url=http://www.echx.cn/]e科士威[/url]
[url=http://www.642weimai.com/]维迈[/url]
[url=http://www.iecosway.com/]ecosway[/url]

14 楼

理论上来说,如果是大矩阵,matmul无论传什么参数,未经优化的版本都是一样慢(或是差不多)
而小矩阵因调用matmul时,前处理太耗时导致试验时效率明显不行。
matmul未优化版本自身会取数组的shape,而这个取shape是被公认的效率瓶颈。至于dgemm等函数,因为本身并未涉及取shape的操作,所以大小都OK:)

15 楼

我记得
intel的matmul只有
/O3和/Qparallel一起用的时候
才会链接到优化的blas库

16 楼

ls的两位大哥辛苦了
不过本帖不是说要提高乘法效率,仅仅是在讨论这个现象:
matmul(a(i)%b,c(j)%d)
mt(a(i)%b,c(j)%d)------这里的mt函数里面的内容就是一个matmul函数,没有做任何改变
这个跟 /O3啊 gemm()啊什么的没关系吧,只是一个函数不同的形式。现在的问题是两个函数在同一种情况下的计算效率差别很大,不明其原因

17 楼

你自行profile/debug下吧

我这里无ivf

gfortran的结果和你的不一致

18 楼

提醒lz

比较一下mvp(1).mat3和mvp(2).mat3的值是否一致

我认为后者的值有问题

因为你的mt function是allocatable的,而在主程序里mt没有allocate,也就是还没有分配内存空间,这会造成引用非法(我不知道ivf为啥直接就能编译成功)。我很久没用Fortran,不知道这个合乎道理么,cgl_lgs来瞧瞧

gfortran因为不支持一群“.”,所以我用另外的函数体测试的,前后的结果基本一致。

19 楼

dongyuanxun大哥,2楼的代码里都有allocate的,主程序里的mt是在interface里面,mt作为一个外部函数名。
然后我对比了一下mvp(1).mat3和mvp(2).mat3的值,是一样的,也就是说做了同样的乘法。

20 楼

那你只能比较反汇编的异同了

我来回复

您尚未登录,请登录后再回复。点此登录或注册