Firrtl работает из памяти кучи с большим вводом - PullRequest
0 голосов
/ 11 ноября 2018

Я пытаюсь запустить verilog-компилятор для файла Firrtl объемом 110 МБ, и я постоянно получаю ошибки памяти, несмотря на то, что для него достаточно места в куче 12 ГБ для игры. Кажется, проблема в том, что синтаксический анализатор, в частности ANTLR, создает слишком много ArrayLists. 110 МБ считается слишком большим для определения схемы Firrtl?

Файл был создан с помощью долота через Firrtl с --compiler=high. Моя версия 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$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)

1 Ответ

0 голосов
/ 11 ноября 2018

Это известное ограничение синтаксического анализатора, и есть два обходных пути, предложенные Джеком в этом комментарии :

  1. Используйте protobuf в качестве интерфейса между долотом и FIRRTL. Вместо использования chisel3.Driver.dumpFirrtl используйте chisel3.Driver.dumpProto. Утилита командной строки FIRRTL автоматически выводит .pb файлы в качестве protobuf и использует соответствующий десериализатор, а не анализатор ANTLR.

  2. Используйте 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 , а поддержка protobuf была добавлена ​​в FIRRTL # 832 . Джек ссылается на некоторые эксперименты, связанные с чтением файла FIRRTL 420 МБ различными способами . В общем, старайтесь избегать использования парсера, если у вас большие файлы FIRRTL.

...