gem5 系统调用模拟 OpenBLAS cblas_dgemm 失败并显示“致命:系统调用 mbind (#237) 未实现”

2024-01-31

我正在开发一个程序,我需要在 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),                 

作为替代方案,您不能在完整的系统模拟中运行它吗?例如,我使用它很容易地工作这个 Buildroot 设置 https://github.com/cirosantilli/linux-kernel-module-cheat/tree/039b8a498c87de4ee68759672918cc4f58dc9fcd#blas运行你的完全相同的测试程序 https://github.com/cirosantilli/linux-kernel-module-cheat/blob/039b8a498c87de4ee68759672918cc4f58dc9fcd/kernel_module/user/openblas.c.

FS 的移植往往要简单得多,因为系统更现实,而且对你可以做的事情的限制更少。

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

gem5 系统调用模拟 OpenBLAS cblas_dgemm 失败并显示“致命:系统调用 mbind (#237) 未实现” 的相关文章

随机推荐