主题:[讨论]比较了一下串行、并行中的重载函数效率
alsoran
[专家分:760] 发布于 2012-04-08 17:58:00
比较了以下三种情况,有些疑问
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]
最后更新于:2012-04-18 11:27:00
回复列表 (共21个回复)
11 楼
维迈642系统 [专家分:0] 发布于 2012-04-17 09:19:00
呵呵,我来学习一下
12 楼
维迈642系统 [专家分:0] 发布于 2012-04-17 09:25:00
[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 楼
维迈642系统 [专家分:0] 发布于 2012-04-17 09:27:00
楼主辛苦,我来支持一下。
[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 楼
cgl_lgs [专家分:21040] 发布于 2012-04-17 14:15:00
理论上来说,如果是大矩阵,matmul无论传什么参数,未经优化的版本都是一样慢(或是差不多)
而小矩阵因调用matmul时,前处理太耗时导致试验时效率明显不行。
matmul未优化版本自身会取数组的shape,而这个取shape是被公认的效率瓶颈。至于dgemm等函数,因为本身并未涉及取shape的操作,所以大小都OK:)
15 楼
dongyuanxun [专家分:7180] 发布于 2012-04-17 18:27:00
我记得
intel的matmul只有
/O3和/Qparallel一起用的时候
才会链接到优化的blas库
16 楼
alsoran [专家分:760] 发布于 2012-04-18 11:19:00
ls的两位大哥辛苦了
不过本帖不是说要提高乘法效率,仅仅是在讨论这个现象:
matmul(a(i)%b,c(j)%d)
mt(a(i)%b,c(j)%d)------这里的mt函数里面的内容就是一个matmul函数,没有做任何改变
这个跟 /O3啊 gemm()啊什么的没关系吧,只是一个函数不同的形式。现在的问题是两个函数在同一种情况下的计算效率差别很大,不明其原因
17 楼
dongyuanxun [专家分:7180] 发布于 2012-04-18 11:48:00
你自行profile/debug下吧
我这里无ivf
gfortran的结果和你的不一致
18 楼
dongyuanxun [专家分:7180] 发布于 2012-04-18 15:17:00
提醒lz
比较一下mvp(1).mat3和mvp(2).mat3的值是否一致
我认为后者的值有问题
因为你的mt function是allocatable的,而在主程序里mt没有allocate,也就是还没有分配内存空间,这会造成引用非法(我不知道ivf为啥直接就能编译成功)。我很久没用Fortran,不知道这个合乎道理么,cgl_lgs来瞧瞧
gfortran因为不支持一群“.”,所以我用另外的函数体测试的,前后的结果基本一致。
19 楼
alsoran [专家分:760] 发布于 2012-04-18 17:01:00
dongyuanxun大哥,2楼的代码里都有allocate的,主程序里的mt是在interface里面,mt作为一个外部函数名。
然后我对比了一下mvp(1).mat3和mvp(2).mat3的值,是一样的,也就是说做了同样的乘法。
20 楼
dongyuanxun [专家分:7180] 发布于 2012-04-18 17:08:00
那你只能比较反汇编的异同了
我来回复