Инструкция RISC-V для записи грязной строки кэша на следующий уровень кеша

Существуют ли какие-либо инструкции RISC-V для обратной записи грязной строки кэша на следующий уровень кеша или в основную память, например clwb в x86 или cvac в ARMv8-A?

Я хочу обеспечить использование энергонезависимой постоянной памяти.

Я намерен адаптировать упомянутый ниже код ARMv8_A для RISC-V и выполнить его в Gem5.

#код

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <unistd.h>
#include <stdint.h>

void clean_invalidate(uint64_t addr){
        uint64_t ctr_el0 = 0;
        if(ctr_el0 == 0)
                asm volatile("mrs %0, ctr_el0":"=r"(ctr_el0)::);
        const size_t dcache_line_size = 4 << ((ctr_el0 >>16)&15);
        addr = addr & ~(dcache_line_size - 1);
        asm volatile("dc cvau, %0"::"r"(addr):);
}


int main(){
        int a[1000];
        int index = 0;
        uint64_t addr = 0;
        double time_spend = 0.0;
        clock_t begin = clock();
        for(int i=0;i<100;i++){
                index = rand()%1000;
                a[index] = index;
                addr = (uint64_t)(&a[index]);
                asm volatile("dsb ish");
                clean_invalidate(addr);
                asm volatile("dsb ish");
                int b = a[index];
        }
        clock_t end = clock();
        time_spend = (double)(end-begin)/CLOCKS_PER_SEC;
        printf("Time:%f\n",time_spend);
        return 0;
}

person Arun Kp    schedule 22.07.2020    source источник
comment
Вы ищете подсказку по производительности, например cldemote (только для атома Tremont) x86, которая может помочь другим ядра загружают строку раньше или гарантированное поведение, подходящее для фиксации в энергонезависимой памяти, например x86 _2 _?   -  person Peter Cordes    schedule 23.07.2020
comment
@PeterCordes Спасибо за ваш комментарий, я ищу фиксацию в энергонезависимой памяти, такой как x86 clwb. Я наткнулся на этот доклад (youtube.com/watch?v=HsxoXMdo4L0&t=28s), где докладчик упомянул о включении clwb в risc-v, но также не смог найти ничего в последней спецификации RISC-v ISA. Еще раз спасибо   -  person Arun Kp    schedule 25.07.2020
comment
Я не знаю ответа на ваш вопрос, но надеюсь, что это проясняет его для будущих читателей. Возможно, вы захотите удалить бит о простом переходе на следующий уровень кеша, потому что этого, по-видимому, будет недостаточно для обеспечения фиксации в постоянной памяти. Кстати, этот inline-asm глючит: asm volatile("dsb ish"); не подразумевает "memory" clobber, поэтому он не упорядочен (для переупорядочения во время компиляции) wrt. доступ к памяти с помощью кода, сгенерированного компилятором.   -  person Peter Cordes    schedule 25.07.2020


Ответы (1)


Нет, последняя версия RISC-V не поддерживает инструкции по очистке строки кэша данных (или даже некэшируемую запись).

В презентации, на которую вы ссылались в комментариях, этот человек предлагает только необходимые изменения в RISC-V для поддержки постоянной памяти. Этот человек не связан с организацией RISC-V. Официально нет никаких указаний на то, что подобные инструкции скоро будут добавлены в ISA.

Что вы можете сделать, так это реализовать clwb (и, вероятно, sfence тоже) в симуляторе gem5 или переключиться на ISA, который уже поддерживает постоянную память.

person Hadi Brais    schedule 30.07.2020