Существуют ли какие-либо инструкции 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;
}
cldemote
(только для атома Tremont) x86, которая может помочь другим ядра загружают строку раньше или гарантированное поведение, подходящее для фиксации в энергонезависимой памяти, например x86 _2 _? - person Peter Cordes   schedule 23.07.2020asm volatile("dsb ish");
не подразумевает"memory"
clobber, поэтому он не упорядочен (для переупорядочения во время компиляции) wrt. доступ к памяти с помощью кода, сгенерированного компилятором. - person Peter Cordes   schedule 25.07.2020