RISC-V 的 Whisper 模拟器:C++ 程序要么陷入无限循环,要么被中止

Whisper simulator for RISC-V: C++ Program either gets caught in infinite loop or get aborted

我有一个 多文件(3 个 .cpp 文件和 2 个 .h 文件)C++ 代码,它使用 newnew[]deletedelete[] 运算符分配大块内存并执行一些浮点运算操作(需要除以 sqrt())。该程序编译并 运行s 使用常规 g++ 并产生所需的输出。我现在想把它转换成 RISC-V 指令。

  1. 我首先使用 GNU RISC-V 编译器工具链通过以下命令编译程序:

    riscv32-unknown-elf-g++ -w -march=rv32imafc -mabi=ilp32f -DPREALLOCATE=1 -mcmodel=medany -fno-common -static -Iinclude/ f1.cpp f2.cpp f3.cpp -o executable

    这里executable是编译好的二进制文件

  2. 由于在编译时没有抛出任何错误,我继续运行耳语模拟器如下:

    whisper --isa imafc --target executable --logfile mylog --profileinst prfl

    其中 mylogprfl 是输出文件路径。

  3. 生成的日志文件大小超过 6 GB,并且没有终止,所以我认为它陷入了某个无限循环。

  4. 我尝试添加 _start() 函数和 tohost 变量 也没有用(同样的问题如上 3)。 [根据 此处的建议]

  5. 我为 可执行文件 生成了对象转储并捕获了 起始地址 的(十六进制)地址 main(),它的结束地址和tohost的地址,并将它们作为参数传递给--startpc--endpc--tohost,在这种情况下,程序在 64 次非法操作和 ~300 MB 日志文件后中止。

我想我犯了一些错误。请帮助我解决此问题或分享为我的 C++ 程序生成 RISC-V 汇编指令的正确步骤。

感谢 Whisper SimulatorScheff, Peter Cordes for providing some accurate pointers. It indeed turned out that I had made out-of-bounds-access error in my code as detected by Valgrind; though I have to admit I bothered the developer,他非常乐于助人。

解析步骤如下:

  1. 删除错误:symm_normalize.h:112 - D[j] 应该是 D[i],并且 symm_normalize.h: 161 - for 循环必须计算到 rows 而不是 cols_start() 函数和 tohost 变量的使用如 whisper github 回购页面上的解释是 强制性
  2. 我在编译 (-march=rv32imafc) 和模拟 (--isa imafc) 期间使用了 单精度浮点 架构,但错误地使用了 sqrt() 函数而不是 symm_normalize.h:131.
  3. 处的 sqrtf()
  4. 安装GNU RISC-V compiler tool chain.
  5. 安装Whisper模拟器。
  6. 编译 RISC-V 代码(使用 GNU 工具链;命令与问题相同)。
  7. 使用以下命令进行模拟: whisper --newlib --isa imafc --target executable --logfile mylog --profileinst prfl --verbose

此解决方案由 Whisper 的开发者通过 github repo issue.

提供(非常尊重!)