首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >OpenMDAO PetscTgtVecWrapper TypeError

OpenMDAO PetscTgtVecWrapper TypeError
EN

Stack Overflow用户
提问于 2016-05-14 16:44:00
回答 2查看 101关注 0票数 0

我正在尝试运行一个并行工作流,在该工作流中,我将在ParallelGroup中评估超过1000个并行案例。如果我在较低数量的核上运行,它不会崩溃,但是在某个点增加节点数会引发一个错误,这表明它与问题的分区方式有关。

据我所知,我从OpenMDAO和PETSc的深地牢中得到了一个错误,在设置通信表时与目标索引有关。下面是错误跟踪的打印:

代码语言:javascript
复制
File "/home/frza/git/OpenMDAO/openmdao/core/group.py", line 454, in _setup_vectors
impl=self._impl, alloc_derivs=alloc_derivs)
File "/home/frza/git/OpenMDAO/openmdao/core/group.py", line 1456, in _setup_data_transfer
self._setup_data_transfer(my_params, None, alloc_derivs)
File "/home/frza/git/OpenMDAO/openmdao/core/petsc_impl.py", line 125, in create_data_xfer
File "/home/frza/git/OpenMDAO/openmdao/core/petsc_impl.py", line 397, in __init__
tgt_idx_set = PETSc.IS().createGeneral(tgt_idxs, comm=comm)
File "PETSc/IS.pyx", line 74, in petsc4py.PETSc.IS.createGeneral (src/petsc4py.PETSc.c:74696)
tgt_idx_set = PETSc.IS().createGeneral(tgt_idxs, comm=comm)
File "PETSc/arraynpy.pxi", line 121, in petsc4py.PETSc.iarray (src/petsc4py.PETSc.c:8230)
TypeError: Cannot cast array data from dtype('int64') to dtype('int32') according to the rule 'safe'

这个答案是:

https://scicomp.stackexchange.com/questions/2355/32bit-64bit-issue-when-working-with-numpy-and-petsc4py/2356#2356

引导我查找设置tgt_idxs向量的位置,看看它是否用正确的dtype PETSc.IntType定义。但到目前为止,我只在尝试设置数组的d类型时才会得到Petsc has generated inconsistent data错误,我认为这可能会导致错误。

我还没有按照我链接到的答案中的建议,尝试用--with-64-bit-indices重新安装--with-64-bit-indices。您是否以这种方式运行PETSc?

编辑:我现在已经设置了一个简化的问题版本,它复制了我得到的错误:

代码语言:javascript
复制
import numpy as np

from openmdao.api import Component, Group, Problem, IndepVarComp, \
                         ParallelGroup


class Model(Component):

    def __init__(self, nsec, nx, nch):
        super(Model, self).__init__()

        self.add_output('outputs', shape=[nx+1, nch*6*3*nsec])

    def solve_nonlinear(self, params, unknowns, resids):

        pass

class Aggregate(Component):

    def __init__(self, nsec, ncase, nx, nch, nsec_env=12):
        super(Aggregate, self).__init__()

        self.ncase = ncase

        for i in range(ncase):
            self.add_param('outputs_sec%03d'%i, shape=[nx+1, nch*6*3*nsec])

        for i in range(nsec):
            self.add_output('aoutput_sec%03d' % i, shape=[nsec_env, 6])


    def solve_nonlinear(self, params, unknowns, resids):

        pass


class ParModel(Group):

    def __init__(self, nsec, ncase, nx, nch, nsec_env=12):
        super(ParModel, self).__init__()

        pg = self.add('pg', ParallelGroup())

        promotes = ['aoutput_sec%03d' % i for i in range(nsec)]
        self.add('agg', Aggregate(nsec, ncase, nx, nch, nsec_env), promotes=promotes)

        for i in range(ncase):
            pg.add('case%03d' % i, Model(nsec, nx, nch))
            self.connect('pg.case%03d.outputs'%i, 'agg.outputs_sec%03d'%i)

if __name__ == '__main__':

    from openmdao.core.mpi_wrap import MPI

    if MPI:
        from openmdao.core.petsc_impl import PetscImpl as impl
    else:
        from openmdao.core.basic_impl import BasicImpl as impl

    p = Problem(impl=impl, root=Group())
    root = p.root

    root.add('dlb', ParModel(20, 1084, 36, 6))
    import time
    t0 = time.time()
    p.setup()
    print 'setup time', time.time() - t0

完成了这些工作之后,我还可以看到,由于我们评估的许多情况,数据大小最终变得巨大。我看看我们能不能以某种方式缩小数据大小。我现在根本无法让它运行,因为它要么崩溃,要么出错:

代码语言:javascript
复制
petsc4py.PETSc.Errorpetsc4py.PETSc.Error: error code 75
[77] VecCreateMPIWithArray() line 320 in /home/MET/Python-2.7.10_Intel/opt/petsc-3.6.2/src/vec/vec/impls/mpi/pbvec.c
[77] VecSetSizes() line 1374 in /home/MET/Python-2.7.10_Intel/opt/petsc-3.6.2/src/vec/vec/interface/vector.c
[77] Arguments are incompatible
[77] Local size 86633280 cannot be larger than global size 73393408
: error code 75

或者TypeError

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-05-15 17:57:28

您正在运行的数据大小肯定大于32位索引所能表示的数据大小,因此,如果无法缩小数据大小,则使用--with-64-bit-indices重新编译是有意义的。OpenMDAO在内部使用PETSc.IntType作为索引,因此如果重新编译,它们的大小应该是64位。

票数 1
EN

Stack Overflow用户

发布于 2016-05-14 17:01:27

我从来没有在petsc上使用过这个选项。一段时间以前,我们确实遇到了一些问题,扩大到更多的核心,但我们确定,对我们来说,问题是OpenMPI编译。重新编译OpenMDAO解决了我们的问题。

因为这个错误出现在安装程序上,所以我们不需要运行来测试代码。如果您可以提供显示问题的模型,并且我们可以运行它,那么我们至少可以验证同样的问题是否发生在我们的集群中。

最好知道你能成功地运行多少个核心,在什么时候它也会崩溃。

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

https://stackoverflow.com/questions/37229308

复制
相关文章

相似问题

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