首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >临时数组创建和例程GEMM

临时数组创建和例程GEMM
EN

Stack Overflow用户
提问于 2021-06-20 22:45:09
回答 1查看 74关注 0票数 0

当我运行Fortran代码时,我得到这样的警告:

Fortran运行时警告:为过程'zgemm‘的参数'_formal_11’创建了临时数组

与这部分代码相关

代码语言:javascript
复制
                   do iw=w0,w1
                   !
                    do a=1,nmodes
                            Vw(a,:)=V(a,:)*w(iw,:)
                    end do
                    
                    call zgemm('N', 'C',&
                                nmodes, nmodes, nbnd*nbnd, &
                                (1.d0,0.0d0),&
                                Vw, nmodes, &
                                V, nmodes, &
                                (0.d0,0.0d0), VwV(iw,:,:), nmodes)
                                
                   end do             
                   !                    

如果我理解得很好,该警告与传递可能影响性能的非争用数组有关。我想处理这件事。然而,我并不清楚这里到底是什么问题,以及我可以做些什么来解决它。

EN

回答 1

Stack Overflow用户

发布于 2021-06-22 00:46:24

所发生的事情是,您激活了编译标志,这些标志将在运行时警告您临时数组创建。在得到更多解释之前,我们必须更好地了解数组是什么。数组是内存中的一个区域,以及正确解释它所需的信息。这些信息包括但不限于元素的数据类型、维度的数量、每个维度的起始索引和结束索引,以及最重要的是,两个连续元素之间的间隔。用非常简单的术语来说,Fortran 77和更低版本没有内置的机制来传递连续元素之间的间隙。因此,当调用的子例程没有显式接口时,编译器通过将数据复制到临时连续数组来确保连续元素之间没有间隙。这是一种确保子例程行为的可预测性的安全机制。

使用模块时,Fortran 90及更高版本使用描述符将这些信息传递给被调用的子例程;该子例程与数组的假定形状声明一起工作。这也是一种简单化的描述。

总而言之,只有当表现像弗拉基米尔说的那样受到影响时,这才是一个重要的警告。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68056977

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档