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++ 代码,它使用 new,new[]、delete 和 delete[] 运算符分配大块内存并执行一些浮点运算操作(需要除以 sqrt())。该程序编译并 运行s 使用常规 g++ 并产生所需的输出。我现在想把它转换成 RISC-V 指令。
我首先使用 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是编译好的二进制文件
由于在编译时没有抛出任何错误,我继续运行耳语模拟器如下:
whisper --isa imafc --target executable --logfile mylog --profileinst prfl
其中 mylog 和 prfl 是输出文件路径。
生成的日志文件大小超过 6 GB,并且没有终止,所以我认为它陷入了某个无限循环。
我尝试添加 _start() 函数和 tohost 变量 也没有用(同样的问题如上 3)。 [根据 此处的建议]
我为 可执行文件 生成了对象转储并捕获了 起始地址 的(十六进制)地址 main(),它的结束地址和tohost的地址,并将它们作为参数传递给--startpc
,--endpc
和 --tohost
,在这种情况下,程序在 64 次非法操作和 ~300 MB 日志文件后中止。
我想我犯了一些错误。请帮助我解决此问题或分享为我的 C++ 程序生成 RISC-V 汇编指令的正确步骤。
感谢 Whisper Simulator 的 Scheff, 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,他非常乐于助人。
解析步骤如下:
- 删除错误:symm_normalize.h:112 - D[j] 应该是 D[i],并且 symm_normalize.h: 161 -
for
循环必须计算到 rows
而不是 cols
。 _start()
函数和 tohost
变量的使用如 whisper github 回购页面上的解释是 强制性 。
- 我在编译 (
-march=rv32imafc
) 和模拟 (--isa imafc
) 期间使用了 单精度浮点 架构,但错误地使用了 sqrt()
函数而不是 symm_normalize.h:131. 处的 sqrtf()
- 安装GNU RISC-V compiler tool chain.
- 安装Whisper模拟器。
- 编译 RISC-V 代码(使用 GNU 工具链;命令与问题相同)。
- 使用以下命令进行模拟:
whisper --newlib --isa imafc --target executable --logfile mylog --profileinst prfl --verbose
此解决方案由 Whisper 的开发者通过 github repo issue.
提供(非常尊重!)
我有一个 多文件(3 个 .cpp 文件和 2 个 .h 文件)C++ 代码,它使用 new,new[]、delete 和 delete[] 运算符分配大块内存并执行一些浮点运算操作(需要除以 sqrt())。该程序编译并 运行s 使用常规 g++ 并产生所需的输出。我现在想把它转换成 RISC-V 指令。
我首先使用 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是编译好的二进制文件
由于在编译时没有抛出任何错误,我继续运行耳语模拟器如下:
whisper --isa imafc --target executable --logfile mylog --profileinst prfl
其中 mylog 和 prfl 是输出文件路径。
生成的日志文件大小超过 6 GB,并且没有终止,所以我认为它陷入了某个无限循环。
我尝试添加 _start() 函数和 tohost 变量 也没有用(同样的问题如上 3)。 [根据 此处的建议]
我为 可执行文件 生成了对象转储并捕获了 起始地址 的(十六进制)地址 main(),它的结束地址和tohost的地址,并将它们作为参数传递给
--startpc
,--endpc
和--tohost
,在这种情况下,程序在 64 次非法操作和 ~300 MB 日志文件后中止。
我想我犯了一些错误。请帮助我解决此问题或分享为我的 C++ 程序生成 RISC-V 汇编指令的正确步骤。
感谢 Whisper Simulator 的 Scheff, 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,他非常乐于助人。
解析步骤如下:
- 删除错误:symm_normalize.h:112 - D[j] 应该是 D[i],并且 symm_normalize.h: 161 -
for
循环必须计算到rows
而不是cols
。_start()
函数和tohost
变量的使用如 whisper github 回购页面上的解释是 强制性 。 - 我在编译 (
-march=rv32imafc
) 和模拟 (--isa imafc
) 期间使用了 单精度浮点 架构,但错误地使用了sqrt()
函数而不是 symm_normalize.h:131. 处的 - 安装GNU RISC-V compiler tool chain.
- 安装Whisper模拟器。
- 编译 RISC-V 代码(使用 GNU 工具链;命令与问题相同)。
- 使用以下命令进行模拟:
whisper --newlib --isa imafc --target executable --logfile mylog --profileinst prfl --verbose
sqrtf()
此解决方案由 Whisper 的开发者通过 github repo issue.
提供(非常尊重!)