Jvm Firrtl使用大输入耗尽堆内存

Jvm Firrtl使用大输入耗尽堆内存,jvm,out-of-memory,chisel,Jvm,Out Of Memory,Chisel,我试图在110MB Firrtl文件上运行一个verilog编译器传递,尽管给了它一个宽敞的12G堆空间可供使用,但始终会出现内存不足的错误。问题似乎在于解析器,特别是ANTLR,生成了太多的ArrayList。110MB对于Firrtl电路定义是否被认为太大 该文件是使用凿子通过Firrtl以--compiler=high生成的。我的第一个RRTL版本是1.2-SNAPSHOT(本地构建),而凿子是3.2-SNAPSHOT(也本地构建) 这是解析器的已知限制,有两种解决方法,如中所示: 用作凿

我试图在110MB Firrtl文件上运行一个verilog编译器传递,尽管给了它一个宽敞的12G堆空间可供使用,但始终会出现内存不足的错误。问题似乎在于解析器,特别是ANTLR,生成了太多的ArrayList。110MB对于Firrtl电路定义是否被认为太大

该文件是使用凿子通过Firrtl以
--compiler=high
生成的。我的第一个RRTL版本是
1.2-SNAPSHOT
(本地构建),而凿子是
3.2-SNAPSHOT
(也本地构建)


这是解析器的已知限制,有两种解决方法,如中所示:

  • 用作凿子和FIRRTL之间的接口。不要使用
    凿毛3.Driver.dumpFirrtl
    ,而是使用
    凿毛3.Driver.dumpProto
    。FIRRTL命令行实用程序将自动推断
    .pb
    文件为protobuf,并使用与ANTLR解析器相反的适当反序列化程序

  • 使用
    3.Driver
    直接调用FIRRTL,而不是使用FIRRTL命令行实用程序。这仍然会导致发出FIRRTL供您检查,但在内部,凿子表示直接转换为FIRRTL,而无需进行解析。尝试:

  • val args=Array(“-o”,“mnist\u cnn\u v4.v”,
    “-X”,“verilog”,
    “--无检查梳循环”,
    “--无dce”,
    “--信息模式=忽略”,
    “-ll跟踪”)
    3.Driver.execute(args,()=>newfoo)/*将Foo更改为顶级模块*/
    

    在中添加了后一种内存转换,并在中添加了protobuf支持。杰克在那里做了一些实验。总之,如果您有大的FIRRTL文件,请尽量避免使用解析器。

    您可以尝试将这一行添加到
    bashrc
    文件中:
    export JAVA_OPTS=“-XX:+cmsclasssUnloadingEnabled-XX:+useCommarksweepgc-Xmx8G-XX:MaxPermSize=1G-xs2m”
    注意:当您运行
    scave
    时,会抛出一条警告,提示
    OpenJDK 64位服务器VM警告:忽略选项MaxPermSize=1G;支持在8.0版中被删除,但它对我来说工作得完美无缺
    
    $ JAVA_OPTS="-Xms8G -Xmx12G" ../firrtl/utils/bin/firrtl -i mnist_cnn_v4.fir -o mnist_cnn_v4.v -X verilog --no-check-comb-loops --no-dce --info-mode=ignore -ll Trace
    > Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
        at java.base/java.util.Arrays.copyOf(Arrays.java:3688)
        at java.base/java.util.ArrayList.grow(ArrayList.java:236)
        at java.base/java.util.ArrayList.grow(ArrayList.java:241)
        at java.base/java.util.ArrayList.add(ArrayList.java:466)
        at java.base/java.util.ArrayList.add(ArrayList.java:479)
        at org.antlr.v4.runtime.ParserRuleContext.addAnyChild(ParserRuleContext.java:134)
        at org.antlr.v4.runtime.ParserRuleContext.addChild(ParserRuleContext.java:145)
        at org.antlr.v4.runtime.Parser.consume(Parser.java:584)
        at firrtl.antlr.FIRRTLParser.intLit(FIRRTLParser.java:2870)
        at firrtl.antlr.FIRRTLParser.type(FIRRTLParser.java:600)
        at firrtl.antlr.FIRRTLParser.field(FIRRTLParser.java:740)
        at firrtl.antlr.FIRRTLParser.type(FIRRTLParser.java:647)
        at firrtl.antlr.FIRRTLParser.field(FIRRTLParser.java:740)
        at firrtl.antlr.FIRRTLParser.type(FIRRTLParser.java:647)
        at firrtl.antlr.FIRRTLParser.field(FIRRTLParser.java:740)
        at firrtl.antlr.FIRRTLParser.type(FIRRTLParser.java:647)
        at firrtl.antlr.FIRRTLParser.port(FIRRTLParser.java:418)
        at firrtl.antlr.FIRRTLParser.module(FIRRTLParser.java:287)
        at firrtl.antlr.FIRRTLParser.circuit(FIRRTLParser.java:189)
        at firrtl.Parser$.$anonfun$parseCharStream$1(Parser.scala:42)
        at firrtl.Parser$$$Lambda$94/1642030774.apply(Unknown Source)
        at firrtl.Utils$.time(Utils.scala:186)
        at firrtl.Parser$.parseCharStream(Parser.scala:33)
        at firrtl.Parser$.parseFile(Parser.scala:25)
        at firrtl.Driver$.$anonfun$getCircuit$5(Driver.scala:200)
        at firrtl.Driver$$$Lambda$93/1571967156.apply(Unknown Source)
        at scala.Option.getOrElse(Option.scala:121)
        at firrtl.Driver$.$anonfun$getCircuit$3(Driver.scala:183)
        at firrtl.Driver$$$Lambda$91/802600647.apply(Unknown Source)
        at scala.Option.getOrElse(Option.scala:121)
        at firrtl.Driver$.$anonfun$getCircuit$1(Driver.scala:183)
        at firrtl.Driver$$$Lambda$88/2041416495.apply(Unknown Source)