Fortran Coder

标题: 看不懂别人用blas和lapack的某种写法…… [打印本页]

作者: liudy02    时间: 2020-3-13 09:02
标题: 看不懂别人用blas和lapack的某种写法……
看到人家写的程序中有如下语句:
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里边一样只是作为一个地址指针用的么?

作者: kyra    时间: 2020-3-13 09:10
如果pv是一个函数,则表示调用pv函数,其中 1 , 1 , itype 是函数的参数。并把 pv 函数的返回值传递给dgemm
如果pv是一个数组,则表示引用该数组的第1,1,itype个元素。(类似C语言的 pv[iType][1][1])
作者: liudy02    时间: 2020-3-13 10:53
kyra 发表于 2020-3-13 09:10
如果pv是一个函数,则表示调用pv函数,其中 1 , 1 , itype 是函数的参数。并把 pv 函数的返回值传递给dgemm ...

pv是一个矩阵无疑
但是不可能是通常的指其某个元素的意义
因为从dgemm这个函数的参数列表来说,这个地方应该是一个矩阵
作者: kyra    时间: 2020-3-13 11:16
本帖最后由 kyra 于 2020-3-13 11:18 编辑

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

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

这种方式不推荐。

作者: li913    时间: 2020-3-13 15:59
查mkl帮助可知,此参数应为二维数组。这里给出的用法比较老旧,不符合现在的标准,但由于fortran默认地址传递,实际使用是ok的。详情可阅读《三种数组传递方式》。
作者: liudy02    时间: 2020-3-13 22:29
li913 发表于 2020-3-13 15:59
查mkl帮助可知,此参数应为二维数组。这里给出的用法比较老旧,不符合现在的标准,但由于fortran默认地址传 ...

嗯,后来想明白了,这用法和C对数组的处理类似
觉得这个方法很不fortran,不是个好办法……




欢迎光临 Fortran Coder (http://bbs.fcode.cn/) Powered by Discuz! X3.2