将脏缓存行写入下一级缓存的 RISC-V 指令

RISC-V instruction to write dirty cache line to next level of cache

是否有任何 RISC-V 指令将脏缓存行写回下一级缓存或主内存,如 x86 中的 clwb ARMv8-A 中的 cvac?

我想确保提交到非易失性持久内存。

我的意图是为 RISC-V 改编下面提到的 ARMv8_A 代码并在 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;
}

不,最新版本的 RISC-V 不支持数据缓存行刷新指令(甚至是不可缓存的写入)。

在您在评论中链接到的演示文稿中,此人仅提议对 RISC-V 进行必要的更改以支持持久内存。此人不隶属于 RISC-V 组织。正式地,没有迹象表明任何此类指令将很快添加到 ISA。

您可以做的是在 gem5 模拟器中自己实现 clwb(也可能 sfence),或者切换到已经支持持久内存的 ISA。