【发布时间】:2020-07-22 09:41:13
【问题描述】:
是否有任何 RISC-V 指令可以将脏缓存行写回下一级缓存或主内存,例如 x86 中的 clwb 或 ARMv8 中的 cvac -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;
}
【问题讨论】:
-
@PeterCordes 感谢您的评论,我正在寻找对 x86 clwb 等非易失性内存的提交。我遇到了这个演讲,(youtube.com/watch?v=HsxoXMdo4L0&t=28s),演讲者提到了在 risc-v 中包含“clwb”,但在最新的 risc-v ISA 规范中也找不到任何内容。再次感谢
-
我不知道您的问题的答案,但希望能为未来的读者澄清它。您可能希望删除有关仅推送到下一级缓存的内容,因为这可能不足以确保提交到持久内存。顺便说一句,inline-asm 是错误的:
asm volatile("dsb ish");确实 not 暗示"memory"破坏者,所以它不是有序的(用于编译时重新排序)wrt。通过编译器生成的代码访问内存。
标签: assembly cpu-architecture riscv instructions persistent-memory