Firrtl 用大输入耗尽堆内存
Firrtl runs of out of heap memory with large input
我正在尝试 运行 一个 verilog 编译器传递一个 110MB 的 Firrtl 文件,尽管给了它一个宽敞的 12G 堆space,但我总是遇到内存不足的错误.似乎问题出在解析器,特别是 ANTLR,生成了太多的 ArrayList。 110MB 是否被认为对于 Firrtl 电路定义来说太大了?
该文件是通过 --compiler=high
通过 Firrtl 使用 Chisel 生成的。我的 Firrtl 版本是 1.2-SNAPSHOT
(本地构建),Chisel 是 3.2-SNAPSHOT
(也是本地构建)。
$ 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(Parser.scala:42)
at firrtl.Parser$$$Lambda/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(Driver.scala:200)
at firrtl.Driver$$$Lambda/1571967156.apply(Unknown Source)
at scala.Option.getOrElse(Option.scala:121)
at firrtl.Driver$.$anonfun$getCircuit(Driver.scala:183)
at firrtl.Driver$$$Lambda/802600647.apply(Unknown Source)
at scala.Option.getOrElse(Option.scala:121)
at firrtl.Driver$.$anonfun$getCircuit(Driver.scala:183)
at firrtl.Driver$$$Lambda/2041416495.apply(Unknown Source)
这是解析器的已知限制,有两种解决方法,如 Jack in this comment 所建议:
使用protobuf作为Chisel和FIRRTL之间的接口。不要使用 chisel3.Driver.dumpFirrtl
,而是使用 chisel3.Driver.dumpProto
。 FIRRTL 命令行实用程序将自动将 .pb
文件推断为 protobuf 并使用适当的反序列化器而不是 ANTLR 解析器。
使用 chisel3.Driver
直接调用 FIRRTL,而不是使用 FIRRTL 命令行实用程序。这仍然会导致发出 FIRRTL 供您检查,但在内部,Chisel 表示会直接转换为 FIRRTL,而无需经过解析。尝试:
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 and protobuf support was added in FIRRTL#832. Jack has some experiments referenced there of reading a 420MB FIRRTL file using different methods中添加了后者的内存中转换。总之,如果你有大的 FIRRTL 文件,尽量避免使用解析器。
我正在尝试 运行 一个 verilog 编译器传递一个 110MB 的 Firrtl 文件,尽管给了它一个宽敞的 12G 堆space,但我总是遇到内存不足的错误.似乎问题出在解析器,特别是 ANTLR,生成了太多的 ArrayList。 110MB 是否被认为对于 Firrtl 电路定义来说太大了?
该文件是通过 --compiler=high
通过 Firrtl 使用 Chisel 生成的。我的 Firrtl 版本是 1.2-SNAPSHOT
(本地构建),Chisel 是 3.2-SNAPSHOT
(也是本地构建)。
$ 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(Parser.scala:42)
at firrtl.Parser$$$Lambda/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(Driver.scala:200)
at firrtl.Driver$$$Lambda/1571967156.apply(Unknown Source)
at scala.Option.getOrElse(Option.scala:121)
at firrtl.Driver$.$anonfun$getCircuit(Driver.scala:183)
at firrtl.Driver$$$Lambda/802600647.apply(Unknown Source)
at scala.Option.getOrElse(Option.scala:121)
at firrtl.Driver$.$anonfun$getCircuit(Driver.scala:183)
at firrtl.Driver$$$Lambda/2041416495.apply(Unknown Source)
这是解析器的已知限制,有两种解决方法,如 Jack in this comment 所建议:
使用protobuf作为Chisel和FIRRTL之间的接口。不要使用
chisel3.Driver.dumpFirrtl
,而是使用chisel3.Driver.dumpProto
。 FIRRTL 命令行实用程序将自动将.pb
文件推断为 protobuf 并使用适当的反序列化器而不是 ANTLR 解析器。使用
chisel3.Driver
直接调用 FIRRTL,而不是使用 FIRRTL 命令行实用程序。这仍然会导致发出 FIRRTL 供您检查,但在内部,Chisel 表示会直接转换为 FIRRTL,而无需经过解析。尝试:
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 and protobuf support was added in FIRRTL#832. Jack has some experiments referenced there of reading a 420MB FIRRTL file using different methods中添加了后者的内存中转换。总之,如果你有大的 FIRRTL 文件,尽量避免使用解析器。