Как получить 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, но я сталкиваюсь с некоторыми проблемами.
- Я не могу получить доступ к 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);
- Трудно перейти в 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, если режим пользователя не поддерживается).
Если кто-то знает это, я надеюсь увидеть подробный код сборки.
- Я пытаюсь изменить
rocket-chip/src/main/scala/rocket/CSR.scala
для редизайна КСО. Это единственный способ? Во-первых, я хочу использовать spike для проверки значения счетчика. Как мне изменить код?
Если у кого-то есть какие-то другие идеи или они осуществились, пожалуйста, укажите мне. Спасибо!