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



我有一个多文件(3.cpp文件和2.h文件(C++代码,它使用newnew[]deletedelete[]运算符来分配大块内存并执行一些浮点运算(需要通过sqrt((进行除法(。该程序与常规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

    此处可执行文件是已编译的二进制文件。

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

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

    其中mylogprfl是输出文件路径。

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

  4. 我尝试添加_start((函数和到主变量,但都不起作用(与上面的3相同的问题(。[基于此处的建议]

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

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

感谢谢夫和彼得·科德斯提供了一些准确的指针。事实证明,正如Valgrind检测到的那样,我在代码中出现了越界访问错误;尽管我不得不承认,我打扰了Whisper Simulator的开发人员,他很乐意提供帮助。

解析步骤如下:

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

该决议由Whisper的开发者通过此次github回购问题提供。

最新更新