gem5无法模拟我的程序调用OpenBLAS函数与致命错误

时间:2018-03-12 03:15:45

标签: openblas gem5

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

任何人都可以帮助我吗?感谢。

1 个答案:

答案 0 :(得分:0)

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

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

作为替代方案,您不能在完整的系统模拟中运行它吗?例如,我使用运行this Buildroot setupexact same test program非常轻松地完成了工作。

FS往往更容易移植到东西,因为系统更加真实,对你可以做的事情的限制较少。

另一个替代方法是修补BLAS以删除系统调用,但您可能不想这样做,因为它会使您的运行不那么具有代表性,并且可能只是发现进一步的失败。

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