FPGA開発日記

カテゴリ別記事インデックス https://msyksphinz.github.io/github_pages , English Version https://fpgadevdiary.hatenadiary.com/

RVV Intrinsicにおけるベクトルレジスタの値をダンプする方法いろいろ

RVV Intrinsicではベクトルレジスタを vuint64m1_tvfloat32m4_t などの独自の型で表現されている. プログラム実行中にこれをダンプして printf() で表示したいが,ベクトルレジスタはスカラレジスタよりも長いので,単純には表示できない. 専用のインライン関数などを持っているほうが,便利そうだ.

例えば,以下のような感じ.

inline void dump_vecregs(char *name, vireg in) {
    int64_t arrays[32];
    const size_t vlmax = __riscv_vsetvlmax_e64m4();
    for (int i = 0; i < vlmax; i++) {
        arrays[i] = __riscv_vmv_x_s_i64m4_i64(in);
        in = __riscv_vslide1down_vx_i64m4 (in, 0, vlmax);
    }

    printf("%s : ", name);
    for (int i = vlmax-1; i >= 0; i--) {
        printf("%016lx_", arrays[i]);
    }
    printf("\n");

}

inline void dump_mvecregs(char *name, vmreg in) {
    uint32_t tmp;
    const size_t vlmax = __riscv_vsetvlmax_e64m4();
    __riscv_vsm_v_b16((uint8_t *)(&tmp), in, vlmax);
    printf("%s : %016lx\n", name, tmp);
}

dump_vecreg()vslide1down を使って1個ずつ取り出して表示してるけど,よく考えたら dump_mvecregs() と同様にいったんメモリにストアしてスカラロード命令でロードすればいいようにも感じる.

 __riscv_vse64_v_i64m4 (arrays, in, vlmax);

    printf("%s : ", name);
    for (int i = vlmax-1; i >= 0; i--) {
        printf("%016lx_", arrays[i]);
    }
    printf("\n");