我正在开发一个程序,我需要模拟在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
任何人都可以帮助我吗?感谢。
答案 0 :(得分:0)
我相信如果不修补gem5就无法克服这个错误,因为在SE模式下,每个系统调用都必须显式实现,可以从源代码中猜到:
src/arch/arm/linux/process.cc:443: /* 319 */ SyscallDesc("mbind", unimplementedFunc),
作为替代方案,您不能在完整的系统模拟中运行它吗?例如,我使用运行this Buildroot setup的exact same test program非常轻松地完成了工作。
FS往往更容易移植到东西,因为系统更加真实,对你可以做的事情的限制较少。
另一个替代方法是修补BLAS以删除系统调用,但您可能不想这样做,因为它会使您的运行不那么具有代表性,并且可能只是发现进一步的失败。
请写信给邮件列表以确认我告诉你的内容。