Как получить FLOPS в RISC-V, используя метод SW или HW?

Я новичок в RISC-V. Интересно, как я мог получить FLOPS, используя метод SW или HW. Я пытаюсь использовать CSR для получения FLOPS, но есть некоторые проблемы.

Как я знаю, если я перепроектирую hpmcounter, который считает каждое событие плавающей операции, я мог бы получить FLOPS, используя инструкцию чтения csr. Я знаю, что подобный дизайн есть в руководстве SiFive для U54-ядра на основе ракетных чипов. В руководстве я вижу, что ядро ​​SiFive имеет сложные функции подсчета возможностей. Эта функция контролируется CSR mhpmevent. Если я установлю младшие восемь битов mhpmevent в 0 и включу бит [19-25], я смогу получить значение счетчика из mhpmcounter. Я на самом деле хочу создать это поле как ядро ​​SiFive.

Я пытаюсь имитировать это для FLOPS, но я сталкиваюсь с некоторыми проблемами.

  1. Я не могу получить доступ к mhpmcounter и вижу ошибку недопустимой инструкции, например, следующую ссылку. сообщение о недопустимой инструкции!!

Я делаю простой тестовый код и успешно его компилирую, но при реализации с использованием эмулятора с точным циклом и циклом возникает недопустимая ошибка инструкции. Оба используют ядро ​​прокси.

  // simple test code

  unsigned long instret1 = 0;
  unsigned long instret2 = 0;

  float a,b,c;
  a = 5.0;
  b = 4.0;
  asm volatile ("csrrs %0, mhpmcounter3, x0 " : "=r"(instret1)); 
  c = a + b;
  asm volatile ("csrrs %0, mhpmcounter3, x0 " : "=r"(instret2));
  printf("instruction count : %ul \n", instret2-instret1);
  1. Трудно перейти в M-режим из пользовательского режима для доступа к mhpmevet и mhpmcounter. В RISC-V priv-spec 1.10 я обнаружил, что инструкция xRET может изменить режим. Следующий текст о xRET в спецификации.

Команды MRET, SRET или URET используются для возврата из ловушек в M-режиме, S-режиме или U-режиме соответственно. При выполнении инструкции xRET, предположим, что xPP содержит значение y, x IE установлен на x PIE; режим привилегий изменен на y; x PIE установлен в 1; и xPP установлен на U (или M, если режим пользователя не поддерживается).

Если кто-то знает это, я надеюсь увидеть подробный код сборки.

  1. Я пытаюсь изменить rocket-chip/src/main/scala/rocket/CSR.scala для редизайна КСО. Это единственный способ? Во-первых, я хочу использовать spike для проверки значения счетчика. Как мне изменить код?

Если у кого-то есть какие-то другие идеи или они осуществились, пожалуйста, укажите мне. Спасибо!

0 ответов

Другие вопросы по тегам