首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >具有大输入的堆外内存的Firrtl运行

具有大输入的堆外内存的Firrtl运行
EN

Stack Overflow用户
提问于 2018-11-11 01:22:12
回答 1查看 422关注 0票数 2

我正在尝试运行verilog编译器传递给一个110 it的Firrtl文件,并且我一直在摆脱内存错误,尽管给它一个宽敞的12G堆空间来玩。问题似乎在于解析器,特别是ANTLR,产生了太多的ArrayLists。对于Firrtl电路定义来说,110 Is是不是太大了?

该文件是用Chisel通过Firrtl和--compiler=high生成的。我的Firrtl版本是1.2-SNAPSHOT (本地构建的),Chisel是3.2-SNAPSHOT (也是本地构建的)。

代码语言:javascript
复制
$ 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)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-11-11 04:44:57

这是解析器的已知限制,有两个解决方案,正如杰克这句话中所建议的那样。

  1. 使用原生质作为Chisel与FIRRTL的接口。不要使用chisel3.Driver.dumpFirrtl,而是使用chisel3.Driver.dumpProto。FIRRTL命令行实用程序将自动推断.pb文件为protobuf,并使用相应的反序列化器,而不是ANTLR解析器。
  2. 使用chisel3.Driver直接调用FIRRTL,而不是使用FIRRTL命令行实用程序。这仍然会导致FIRRTL发出,供您检查,但是在内部,Chisel表示可以直接转换为FIRRTL,而无需进行解析。尝试:
代码语言:javascript
复制
val args = Array("-o", "mnist_cnn_v4.v",
                 "-X", "verilog",
                 "--no-check-comb-loops",
                 "--no-dce",
                 "--info-mode=ignore",
                 "-ll Trace")

chisel3.Driver.execute(args, () => new Foo) /* change Foo to your top module */

Chisel3#829中添加了后一个内存中的转换,在FIRRTL#832中添加了protobuf支持。杰克在那里做了一些使用不同方法读取420 methods文件的实验。总之,如果您有很大的FIRRTL文件,请尽量避免使用解析器。

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

https://stackoverflow.com/questions/53245026

复制
相关文章

相似问题

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