【问题标题】:How to calculate the no of clock cycles in RISCV-clang如何计算 RISCV-clang 中的时钟周期数
【发布时间】:2018-09-05 14:10:16
【问题描述】:

我正在使用 riscv64-unknown-elf-clang, "clang version 5.0.0" 编译我的代码,然后使用 "spike" 和 "pk" 运行它。我需要计算程序所需的时钟周期数。我使用 "__builtin_readcyclecounter()" 或普通 "clock()" 来计算时钟周期,但似乎没有一个工作。

以下代码适用于 riscv64-unknown-elf-gcc 但不适用于 riscv64-unknown-elf-clang

#define read_csr(reg) ({ unsigned long __tmp;asm volatile ("csrr %0, " #reg : "=r"(__tmp));__tmp; })
#define CSR_CYCLE 0xc00
#define CSR_TIME 0xc01
#define CSR_INSTRET 0xc02
#define CSR_MCYCLE 0xb00

然后从我调用的主程序开始

long cycles;
cycles=read_csr(cycle);

【问题讨论】:

  • 你对比过生成的汇编代码吗?
  • 代码甚至不能用 riscv64-unknown-elf-clang 编译。它显示一个错误,说明无法识别的助记符
  • 应该将cycles=read_csr(cycle); 改为cycles=read_csr(CSR_CYCLE);

标签: clang llvm-clang riscv


【解决方案1】:

Clang 5.0 对于 csrr 伪指令来说太旧了,即 Clang 5.0 中的伪指令支持不完整。支持 csrr was added in 2018 而 Clang 5 于 2017 年发布。

要么升级到较新的 Clang 版本,要么通过将 cssr (control-and-status-register-read) 扩展为 cssrs (control- and-status-register-read-and-set) 直接在您的代码中,即

csrr dst, csr => csrrs dst, csr, x0 

请注意,还有更专业的伪指令用于读取与性能相关的计数器,例如rdcycle dstrdtime dst 等。当然,它们也扩展为cssrs,但可能更方便一些人使用用例。

另外,借助完整的工具链,您还可以直接在您的内部使用符号常量cycletimeinstret 等(而不是0xc000xc010xc02 等)汇编代码。

列出读取周期计数的等效方法的示例:

extern __inline
    unsigned long 
    __attribute__((__gnu_inline__, __always_inline__, __artificial__))
rdcycle(void)
{
    unsigned long dst;
    // output into any register, likely a0
    // regular instruction:
    asm volatile ("csrrs %0, 0xc00, x0" : "=r" (dst) );
    // regular instruction with symbolic csr and register names
    // asm volatile ("csrrs %0, cycle, zero" : "=r" (dst) );
    // pseudo-instruction:
    // asm volatile ("csrr %0, cycle" : "=r" (dst) );
    // pseudo-instruction:
    //asm volatile ("rdcycle %0" : "=r" (dst) );
    return dst;
}

我认为使用 C 预处理器 (CPP) 读取不同的 CSR 不值得。

请注意,即使使用asm volatile 编译器is free to reorder,不同的内联汇编程序语句彼此以及其他指令也是如此。例如,在

unsigned long a = rdcycle();
int r = i * i;
unsigned long b = rdcycle();

第二个 CSR 访问可能在乘法之前重新排序,甚至在第一个之前。

【讨论】:

    猜你喜欢
    • 2015-06-16
    • 1970-01-01
    • 1970-01-01
    • 2016-03-08
    • 2020-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-26
    相关资源
    最近更新 更多