C 应用程序如何使用 gem5 在多个内核上工作?

How can a C application work on multiple cores with gem5?

我是 gem5 模拟器的新手。我有一个 C 应用程序,我想让它 运行 更快。所以我做的第一件事就是使用循环展开和 SIMD 等多种技术对其进行优化。下一步,我打算让它在 多核 X86ARM)上运行我必须使用 gem5 模拟器。

该应用程序用于 Radix4 计算。现在我已经成功地让它在 X86ARM 的一个核心系统上工作但是,现在我想让它在 4 上工作, 16, ... 内核 X86 或 ARM。

有人可以给我一些提示或告诉我正确的方法吗? 谢谢

这是关于应用程序的全局想法

void init_twiddle(int N)
{
  int i;
  for(i=0; i<TWIDDLE_LIMIT; i++)
  {
   /*Filling the twiddle table*/
  }
}

void init_LUT(int N)
{
  LUT_n2 = malloc((1+PMAX)*sizeof(int*));
  for (i=0; i <= PMAX; i++){
    for (j=0; j < n; j++)
    /*Calculate radix parametrs and put them in a table*/
  }
}

void bit_r4_reorder(float* x, float* y, int N)
{
/*Bit reordering after calculating the radix4*/
}

void radix4(float *x,float *y, int N)
{
/*function for the radix4 computing*/
}

int main()
{
/*Calling the previous functions*/ 
}

该应用程序并不知道它正在 运行 模拟系统上运行,因此您可以将 gem5 视为一个真实的系统来实现您的目标。即,通过使用 OpenMP 或 MPI。

如果被建模的系统安装了这些库(OpenMP 或 MPI),那么理论上这些库应该可以工作。

在gem5端,你只需要:

  • -n <number-of-cores> 选项传递给 fs.py 脚本

  • 对于 ARM,要么:

    • 使用--generate-dtb。推荐方法。 aarch64 阻塞于:https://github.com/cirosantilli-work/gem5-issues/issues/18

    • select 具有正确 CPU 数量的正确 dtb,例如:

      --dtb-file='system/arm/dt/armv7_gem5_v1_2cpu.dtb
      

      如果你想要 2 CPU秒。

      如果您需要的 CPU 计数在任何当前 dtb 上都不存在,您可以:

      如果你想在 ARM 中使用超过 8 个内核,则需要进一步更改:How to run a gem5 arm aarch64 full system simulation with fs.py with more than 8 cores?

    如果不这样做,Linux 内核将看不到系统中的所有 CPU。

然后您可以验证核心数是否更改为:

cat /proc/cpuinfo

至于你的程序本身,一切都像真实系统一样工作,所以你应该寻找有关接口的教程,例如 POSIX 或 C11 线程,然后如果遇到问题,请提出更具体的问题。