Fortran Coder

查看: 444|回复: 5

[子程序] 看不懂别人用blas和lapack的某种写法……

[复制链接]

146

帖子

13

主题

0

精华

大宗师

F 币
3761 元
贡献
693 点
发表于 2020-3-13 09:02:05 | 显示全部楼层 |阅读模式
看到人家写的程序中有如下语句:
call dgemm('T', 'N', nfeat2(itype), num(itype), nfeat0(itype), 1.d0, pv(1,1,itype), nfeat0m, feat_type(1,1,itype), nfeat0m, 0.d0, feat2_type(1,1,itype), nfeat2m)




完全不理解这里边像pv(1,1,itype)这种东西是啥子用法……
是和c里边一样只是作为一个地址指针用的么?
回复

使用道具 举报

145

帖子

0

主题

0

精华

版主

World Analyser

F 币
290 元
贡献
283 点

新人勋章美女勋章元老勋章热心勋章规矩勋章管理勋章

QQ
发表于 2020-3-13 09:10:41 | 显示全部楼层
如果pv是一个函数,则表示调用pv函数,其中 1 , 1 , itype 是函数的参数。并把 pv 函数的返回值传递给dgemm
如果pv是一个数组,则表示引用该数组的第1,1,itype个元素。(类似C语言的 pv[iType][1][1])

146

帖子

13

主题

0

精华

大宗师

F 币
3761 元
贡献
693 点
 楼主| 发表于 2020-3-13 10:53:59 | 显示全部楼层
kyra 发表于 2020-3-13 09:10
如果pv是一个函数,则表示调用pv函数,其中 1 , 1 , itype 是函数的参数。并把 pv 函数的返回值传递给dgemm ...

pv是一个矩阵无疑
但是不可能是通常的指其某个元素的意义
因为从dgemm这个函数的参数列表来说,这个地方应该是一个矩阵

145

帖子

0

主题

0

精华

版主

World Analyser

F 币
290 元
贡献
283 点

新人勋章美女勋章元老勋章热心勋章规矩勋章管理勋章

QQ
发表于 2020-3-13 11:16:36 | 显示全部楼层
本帖最后由 kyra 于 2020-3-13 11:18 编辑

传这个首地址。后面的按内存顺序对应。

所以有可能是等效于 pv(:,:,itype),具体要看 dgemm 的内部取了多少数。我没记错的话,应该取决于 nfeat2(itype), num(itype), nfeat0(itype) 这几个数。(dgemm用它们来决定后面矩阵的大小)

这种方式不推荐。

517

帖子

1

主题

0

精华

大宗师

F 币
2576 元
贡献
1647 点
发表于 2020-3-13 15:59:06 | 显示全部楼层
查mkl帮助可知,此参数应为二维数组。这里给出的用法比较老旧,不符合现在的标准,但由于fortran默认地址传递,实际使用是ok的。详情可阅读《三种数组传递方式》。

146

帖子

13

主题

0

精华

大宗师

F 币
3761 元
贡献
693 点
 楼主| 发表于 2020-3-13 22:29:01 | 显示全部楼层
li913 发表于 2020-3-13 15:59
查mkl帮助可知,此参数应为二维数组。这里给出的用法比较老旧,不符合现在的标准,但由于fortran默认地址传 ...

嗯,后来想明白了,这用法和C对数组的处理类似
觉得这个方法很不fortran,不是个好办法……
您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

QQ|捐赠本站|Archiver|关于我们 About Us|群聊|Fcode

GMT+8, 2020-6-6 10:39

Powered by Discuz! X3.2

© 2001-2017 Comsenz Inc.

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