gem5 系统调用仿真 OpenBLAS cblas_dgemm 失败 "fatal: syscall mbind (#237) unimplemented"

gem5 syscall emulation OpenBLAS cblas_dgemm fails with "fatal: syscall mbind (#237) unimplemented"

我正在开发一个程序,我需要模拟在 SE 模式下使用 gem5 调用 OpenBLAS 函数的程序。我的代码(C)如下

#include <cblas.h>
#include <stdio.h>

void main()
{
  int i=0;
  double A[6] = {1.0,2.0,1.0,-3.0,4.0,-1.0};
  double B[6] = {1.0,2.0,1.0,-3.0,4.0,-1.0};
  double C[9] = {.5,.5,.5,.5,.5,.5,.5,.5,.5};
  cblas_dgemm(CblasColMajor, CblasNoTrans, CblasTrans,3,3,2,1,A, 3, B, 3,2,C,3);

  for(i=0; i<9; i++)
    printf("%lf ", C[i]);
  printf("\n");
  printf("hello hihi\n");
}

这是来自 OpenBLAS 的示例。我很确定我已经使用以下 makefile 命令静态编译了这个文件

test_cblas_dgemm: test_cblas_dgemm.c
        @echo compiling $@
        @gcc -static -I $(INCLUDE) -L.  $< -o test_cblas_dgemm -lopenblas
        @cp test_cblas_dgemm ~/progs/

问题是我可以 运行 我的 ubuntu 机器上的可执行文件,但它在 gem5 SE 模式下遇到致命错误。模拟输出如下

**** REAL SIMULATION ****
info: Entering event queue @ 0.  Starting simulation...
warn: readlink() called on '/proc/self/exe' may yield unexpected results in various settings.
      Returning '/home/hurui/progs/test_cblas_dgemm'
info: Increasing stack size by one page.
warn: ignoring syscall access(...)
fatal: syscall mbind (#237) unimplemented.
Memory Usage: 648616 KBytes

有人能帮帮我吗?谢谢。

我相信如果不修补 gem5 就无法克服这个错误,因为在 SE 模式下,每个系统调用都必须显式实现,从源代码中可以猜到:

src/arch/arm/linux/process.cc:443:    /* 319 */ SyscallDesc("mbind", unimplementedFunc),                 

作为替代方案,您不能 运行 在完整的系统模拟中吗?例如,我使用 this Buildroot setup running your exact same test program.

很容易让它工作

FS 往往更容易移植,因为系统更真实,对您可以做的事情的限制更少。

另一种选择是修补 BLAS 以删除系统调用,但您可能不想这样做,因为这会使您的 运行 不那么具有代表性,并且可能只会发现更多故障。

也请写信给邮件列表以确认我告诉你的内容。

要解决此问题,请从 OpenBLAS 中删除 mbind 系统调用。这是唯一未实现的系统调用。在 OpenBLAS 目录的根目录中打开文件 common_linux.h 并替换:

return syscall(SYS_mbind, addr, len, mode, nodemask, maxnode, flags);

return 0;

重新编译。这适用于 OpenBLAS 版本 0.3.18。