Выходной журнал эмулятора чипа RISCV/Rocket

Я пытаюсь оценить производительность ядра ракеты существующего теста, а также других приложений.

после того, как я запустил эмулятор с тестовым кодом MT-MATMUL и проверил mt-matmul.riscv.out, я заметил, что там довольно много зависаний. Может кто-нибудь объяснить мне, как я могу определить причину остановки? Я думал, что этот простой цикл должен быть предсказан и не должен иметь много остановок, которые действительно замедляют работу процессора.

Смотрите ниже журнал:

C0: 1956 [1] pc=[0000000628] W[r 0=0000000000001418][0] R[r 5=0000000000001418] R[r 0=00000000000000000] inst=[0002b107] fld ft2, 0(t0)

C0: 1957 [1] pc=[000000062c] W[r 0=0000000000007730][0] R[r16=0000000000007730] R[r 0=00000000000000000] inst=[00083007] fld ft0, 0(a6)

C0: 1958 [1] pc=[0000000630] W[r 0=0000000000003380][0] R[r 6=0000000000003380] R[r 0=00000000000000000] inst=[00033087] fld ft1, 0(t1)

**C0: 1959 [1] pc=[0000000634] W[r16=0000000000007738][1] R[r16=00000000000007730] R[r 8=00000000000000013] inst=[00880813] addi a6, a6, 8

C0: 1960 [0] pc=[0000000634] W[r 0=0000000000007738][0] R[r16=00000000000007730] R[r 8=00000000000000013] inst=[00880813] addi a6, a6, 8

C0: 1961 [0] pc=[0000000634] W[r 0=0000000000007738][0] R[r16=00000000000007730] R[r 8=00000000000000013] inst=[00880813] addi a6, a6, 8**

C0: 1962 [1] pc=[0000000638] W[r17=0000000000000014][1] R[r17=0000000000000013] R[r 1=00000000000000013] inst=[0018889b] addiw a7, a7, 1

C0: 1963 [1] pc=[000000063c] W[r 0=00000000000000001][0] R[r 1=00000000000000013] R[r 2=00000000000000013] inst=[0220f043] fmadd.d ft0, ft1, ft2

C0: 1964 [1] pc=[0000000640] W[r 5=0000000000001420][1] R[r 5=00000000000001418] R[r 8=00000000000000013] inst=[00828293] addi t0, t0, 8

C0: 1965 [0] pc=[0000000640] W[r 0=0000000000001420][0] R[r 5=0000000000001418] R[r 8=00000000000000013] inst=[00828293] addi t0, t0, 8

C0: 1966 [0] pc=[0000000640] W[r 0=0000000000001420][0] R[r 5=00000000000001418] R[r 8=00000000000000013] inst=[00828293] addi t0, t0, 8

C0: 1967 [1] pc=[0000000644] W[r 0=0000000000007730][0] R[r16=0000000000007738] R[r 0=00000000000000000] inst=[fe083c27] fsd ft0, -8(a6)

C0: 1968 [1] pc=[0000000648] W[r 0=00000000000000001][0] R[r12=0000000000000020] R[r17=00000000000000014] inst=[ff1610e3] bne a2, a7, pc - 32

C0: 1969 [1] pc=[0000000628] W[r 0=0000000000001420][0] R[r 5=0000000000001420] R[r 0=00000000000000000] inst=[0002b107] fld ft2, 0(t0)

C0: 1970 [1] pc=[000000062c] W[r 0=0000000000007738][0] R[r16=00000000000007738] R[r 0=00000000000000000] inst=[00083007] fld ft0, 0(a6)

C0: 1971 [1] pc=[0000000630] W[r 0=0000000000003380][0] R[r 6=0000000000003380] R[r 0=00000000000000000] inst=[00033087] fld ft1, 0(t1)

C0: 1972 [1] pc=[0000000634] W[r16=0000000000007740][1] R[r16=00000000000007738] R[r 8=00000000000000017] inst=[00880813] addi a6, a6, 8

C0: 1973 [0] pc=[0000000634] W[r 0=0000000000007740][0] R[r16=00000000000007738] R[r 8=00000000000000017] inst=[00880813] addi a6, a6, 8

C0: 1974 [0] pc=[0000000634] W[r 0=0000000000007740][0] R[r16=00000000000007738] R[r 8=00000000000000017] inst=[00880813] addi a6, a6, 8

C0: 1975 [1] pc=[0000000638] W[r17=0000000000000015][1] R[r17=0000000000000014] R[r 1=00000000000000017] inst=[0018889b] addiw a7, a7, 1

**C0: 1982 [1] pc=[0000000628] W[r 0=0000000000001428][0] R[r 5=00000000000001428] R[r 0=0000000000000000] inst=[0002b107] fld ft2, 0(t0)

C0: 1983 [1] pc=[000000062c] W[r 0=0000000000007740][0] R[r16=00000000000007740] R[r 0=00000000000000000] inst=[00083007] fld ft0, 0(a6)

C0: 1984 [1] pc=[0000000630] W[r 0=0000000000003380][0] R[r 6=00000000000003380] R[r 0=00000000000000000] inst=[00033087] fld ft1, 0(t1)

C0: 1985 [1] pc=[0000000634] W[r16=0000000000007748][1] R[r16=00000000000007740] R[r 8=00000000000000017] inst=[00880813] addi a6, a6, 8

C0: 1986 [0] pc=[0000000634] W[r 0=0000000000007748][0] R[r16=00000000000007740] R[r 8=00000000000000017] inst=[00880813] addi a6, a6, 8

C0: 1987 [0] pc=[0000000634] W[r 0=0000000000007748][0] R[r16=00000000000007740] R[r 8=00000000000000017] inst=[00880813] addi a6, a6, 8

C0: 1988 [1] pc=[0000000638] W[r17=0000000000000016][1] R[r17=0000000000000015] R[r 1=00000000000000017] inst=[0018889b] addiw a7, a7, 1

C0: 1989 [0] pc=[0000000638] W[r 0=00000000000000016][0] R[r17=0000000000000015] R[r 1=00000000000000017] inst=[0018889b] addiw a7, a7, 1

C0: 1990 [0] pc=[0000000638] W[r 0=0000000000000016][0] R[r17=0000000000000015] R[r 1=00000000000000017] inst=[0018889b] addiw a7, a7, 1

C0: 1991 [0] pc=[0000000638] W[r 0=00000000000000016][0] R[r17=0000000000000015] R[r 1=00000000000000017] inst=[0018889b] addiw a7, a7, 1

C0: 1992 [0] pc=[0000000638] W[r 0=0000000000000016][0] R[r17=0000000000000015] R[r 1=00000000000000017] inst=[0018889b] addiw a7, a7, 1

C0: 1993 [0] pc=[0000000638] W[r 0=0000000000000016][0] R[r17=0000000000000015] R[r 1=00000000000000017] inst=[0018889b] addiw a7, a7, 1

C0: 1994 [0] pc=[0000000638] W[r 0=0000000000000016][0] R[r17=0000000000000015] R[r 1=00000000000000017] inst=[0018889b] addiw a7, a7, 1

C0: 1995 [0] pc=[0000000638] W[r 0=0000000000000016][0] R[r17=0000000000000015] R[r 1=00000000000000017] inst=[0018889b] addiw a7, a7, 1

C0: 1996 [0] pc=[0000000638] W[r 0=0000000000000016][0] R[r17=0000000000000015] R[r 1=00000000000000017] inst=[0018889b] addiw a7, a7, 1

C0: 1997 [0] pc=[0000000638] W[r 0=0000000000000016][0] R[r17=0000000000000015] R[r 1=00000000000000017] inst=[0018889b] addiw a7, a7, 1

C0: 1998 [0] pc=[0000000638] W[r 0=0000000000000016][0] R[r17=0000000000000015] R[r 1=00000000000000017] inst=[0018889b] addiw a7, a7, 1

C0: 1999 [0] pc=[0000000638] W[r 0=0000000000000016][0] R[r17=0000000000000015] R[r 1=00000000000000017] inst=[0018889b] addiw a7, a7, 1

C0: 2000 [0] pc=[0000000638] W[r 0=0000000000000016][0] R[r17=0000000000000015] R[r 1=00000000000000017] inst=[0018889b] addiw a7, a7, 1

C0: 2001 [0] pc=[0000000638] W[r 0=0000000000000016][0] R[r17=0000000000000015] R[r 1=00000000000000017] inst=[0018889b] addiw a7, a7, 1

C0: 2002 [0] pc=[0000000638] W[r 0=0000000000000016][0] R[r17=0000000000000015] R[r 1=00000000000000017] inst=[0018889b] addiw a7, a7, 1

C0: 2003 [0] pc=[0000000638] W[r 0=0000000000000016][0] R[r17=0000000000000015] R[r 1=00000000000000017] inst=[0018889b] addiw a7, a7, 1

C0: 2004 [0] pc=[0000000638] W[r 0=00000000000000016][0] R[r17=0000000000000015] R[r 1=00000000000000017] inst=[0018889b] addiw a7, a7, 1

C0: 2005 [0] pc=[0000000638] W[r 0=00000000000000016][0] R[r17=0000000000000015] R[r 1=00000000000000017] inst=[0018889b] addiw a7, a7, 1

C0: 2006 [0] pc=[0000000638] W[r 0=00000000000000016][0] R[r17=0000000000000015] R[r 1=00000000000000017] inst=[0018889b] addiw a7, a7, 1

C0: 2007 [0] pc=[0000000638] W[r 0=0000000000000016][0] R[r17=0000000000000015] R[r 1=00000000000000017] inst=[0018889b] addiw a7, a7, 1

C0: 2008 [0] pc=[0000000638] W[r 0=00000000000000016][0] R[r17=0000000000000015] R[r 1=00000000000000017] inst=[0018889b] addiw a7, a7, 1

C0: 2009 [0] pc=[0000000638] W[r 0=00000000000000016][0] R[r17=0000000000000015] R[r 1=00000000000000017] inst=[0018889b] addiw a7, a7, 1

C0: 2010 [0] pc=[0000000638] W[r 0=0000000000000016][0] R[r17=0000000000000015] R[r 1=00000000000000017] inst=[0018889b] addiw a7, a7, 1

C0: 2011 [0] pc=[0000000638] W[r 0=0000000000000016][0] R[r17=0000000000000015] R[r 1=00000000000000017] inst=[0018889b] addiw a7, a7, 1

C0: 2012 [0] pc=[0000000638] W[r 0=00000000000000016][0] R[r17=0000000000000015] R[r 1=00000000000000017] inst=[0018889b] addiw a7, a7, 1

C0: 2013 [0] pc=[0000000638] W[r 0=0000000000000016][0] R[r17=0000000000000015] R[r 1=00000000000000017] inst=[0018889b] addiw a7, a7, 1

C0: 2014 [0] pc=[0000000638] W[r 0=0000000000000016][0] R[r17=0000000000000015] R[r 1=00000000000000017] inst=[0018889b] addiw a7, a7, 1

C0: 2015 [0] pc=[0000000638] W[r 0=0000000000000016][0] R[r17=0000000000000015] R[r 1=00000000000000017] inst=[0018889b] addiw a7, a7, 1

C0: 2016 [0] pc=[0000000638] W[r 0=0000000000000016][0] R[r17=0000000000000015] R[r 1=00000000000000017] inst=[0018889b] addiw a7, a7, 1

C0: 2017 [0] pc=[0000000638] W[r 0=0000000000000016][0] R[r17=0000000000000015] R[r 1=00000000000000017] inst=[0018889b] addiw a7, a7, 1

C0: 2018 [0] pc=[0000000638] W[r 0=00000000000000016][0] R[r17=0000000000000015] R[r 1=00000000000000017] inst=[0018889b] addiw a7, a7, 1

C0: 2019 [0] pc=[0000000638] W[r 0=0000000000000016][0] R[r17=0000000000000015] R[r 1=00000000000000017] inst=[0018889b] addiw a7, a7, 1

C0: 2020 [0] pc=[0000000638] W[r 0=00000000000000016][0] R[r17=0000000000000015] R[r 1=00000000000000017] inst=[0018889b] addiw a7, a7, 1

C0: 2021 [0] pc=[0000000638] W[r 0=00000000000000016][0] R[r17=0000000000000015] R[r 1=00000000000000017] inst=[0018889b] addiw a7, a7, 1**

Ассемблерный код прост

 5e8:  02b645bb            divw      a1,a2,a1
 5ec:   02a5853b             mulw     a0,a1,a0
 5f0:   00a585bb             addw     a1,a1,a0
 5f4:   06b55e63             ble          a1,a0,670 <matmul+0x88>
 5f8:   02a6083b             mulw     a6,a2,a0
 5fc:    00361e93             slli           t4,a2,0x3
 600:   00381813             slli           a6,a6,0x3
 604:   010787b3             add        a5,a5,a6
 608:   010686b3             add        a3,a3,a6
 60c:   04c05863              blez        a2,65c <matmul+0x74>
 610:   00070e13             mv          t3,a4
 614:   00068313             mv          t1,a3
 618:   00000393             li              t2,0
 61c:   000e0293             mv          t0,t3
 620:   00078813             mv          a6,a5
 624:   00000893             li              a7,0
 628:   0002b107             fld           ft2,0(t0)
 62c:   00083007             fld           ft0,0(a6)
 630:   00033087             fld           ft1,0(t1) # 3000 <input2_data+0x1c80>
 634:   00880813             addi       a6,a6,8
 638:   0018889b             addiw    a7,a7,1
 63c:   0220f043              fmadd.d               ft0,ft1,ft2,ft0
 640:   00828293             addi       t0,t0,8
 644:   fe083c27              fsd          ft0,-8(a6)
 648:   ff1610e3              bne        a2,a7,628 <matmul+0x40>
 64c:   0013839b             addiw    t2,t2,1
 650:   01de0e33            add        t3,t3,t4
 654:   00830313             addi       t1,t1,8
 658:   fc7612e3              bne        a2,t2,61c <matmul+0x34>
 65c:   0015051b             addiw    a0,a0,1
 660:   01d787b3             add        a5,a5,t4
 664:   01d686b3             add        a3,a3,t4
 668:   fab512e3             bne        a0,a1,60c <matmul+0x24>

person qizha    schedule 13.11.2015    source источник


Ответы (1)


Определить причину зависаний, особенно по выходному логу, непросто. Это справедливо и для большинства процессоров в целом. Процессоры могут зависать по ряду причин, и чаще всего это происходит из-за промахов кеша или TLB.

Вам нужно будет модифицировать ракету, чтобы либо добавить операторы отладки для эмуляции, либо даже добавить больше счетчиков производительности для отслеживания этих событий остановки. В любом случае, это будет значительный объем работы.

person user2548418    schedule 13.11.2015
comment
То, что я пытаюсь оценить, - это в основном сама производительность ядра, поэтому есть ли простой способ уменьшить влияние промаха TLB или кэша? Например, увеличить размер TLB или кэша и моделировать только в эмуляторе или даже заблокировать или загрузить сегмент текста/данных непосредственно в L1I/D $ вместо DRAM? - person qizha; 14.11.2015
comment
Есть ли другой способ визуально отобразить конвейер? Или хотя бы выявить причину зависания из-за промаха I$? Д$ мисс? Зарегистрировать зависимость данных на уровне сборки? - person qizha; 14.11.2015
comment
Вы можете увеличить TLB или размер кэша, но тогда вы моделируете другое ядро. Rocket-chip — это полноценная SoC, предназначенная для изготовления на кремнии. Для исследования архитектур, которые невозможно синтезировать, вы можете использовать программный симулятор, такой как sniper (snipersim.org), чьи стеки CPI функция может быть тем, что вы хотите. - person user2548418; 14.11.2015
comment
вы неправильно поняли мой вопрос. Я пытаюсь использовать часть ядра ракеты без кеша (если мое приложение может поместиться в SRAM), поэтому все, что меня волнует, это само ядро, поэтому мне нужно запустить тест обработки сигналов, чтобы увидеть, достаточно ли быстрое ядро ​​для обработки огромное количество вычислений без нарушения режима реального времени с точки зрения приложения. - person qizha; 15.11.2015
comment
Поскольку я не могу запускать что-то автономно, я использую эмулятор SoC Rocket-chip для оценки ядра и пытаюсь устранить побочный эффект от кеша (именно поэтому я изменил размер TLB или кеша, не учитывая возможности синтеза или маршрутизации, в эмуляторе , так как в конечном итоге я могу удалить кеш и связанный с ним аппаратный модуль, это возможно, но требует некоторых усилий) - person qizha; 15.11.2015
comment
Возможно, самым простым решением может быть увеличение размера кеша, создание цикла и многократное повторение кода. Таким образом, данные, скорее всего, будут в кеше, чтобы вы могли видеть, какой будет производительность при попадании в кеш. - person user2548418; 15.11.2015