C 应用程序如何使用 gem5 在多个内核上工作?
How can a C application work on multiple cores with gem5?
我是 gem5 模拟器的新手。我有一个 C 应用程序,我想让它 运行 更快。所以我做的第一件事就是使用循环展开和 SIMD 等多种技术对其进行优化。下一步,我打算让它在 多核 (X86 和 ARM)上运行我必须使用 gem5 模拟器。
该应用程序用于 Radix4 计算。现在我已经成功地让它在 X86 和 ARM 的一个核心系统上工作但是,现在我想让它在 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 上都不存在,您可以:
- 按照以下说明将 dtb 转换为 dts:Tool to visualize the device tree file (dtb) used by the Linux kernel? 修改它们,然后执行相反的操作
修改在 gem5 树中生成 dtb 的 Makefile
:https://github.com/gem5/gem5/blob/a66fe6a8c36c9ab49cb3a35065bfc645d51036c8/system/arm/dt/Makefile#L40 并使用以下命令重新生成它们:
make -C system/arm/dt
如果你想在 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 线程,然后如果遇到问题,请提出更具体的问题。
我是 gem5 模拟器的新手。我有一个 C 应用程序,我想让它 运行 更快。所以我做的第一件事就是使用循环展开和 SIMD 等多种技术对其进行优化。下一步,我打算让它在 多核 (X86 和 ARM)上运行我必须使用 gem5 模拟器。
该应用程序用于 Radix4 计算。现在我已经成功地让它在 X86 和 ARM 的一个核心系统上工作但是,现在我想让它在 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/18select 具有正确 CPU 数量的正确 dtb,例如:
--dtb-file='system/arm/dt/armv7_gem5_v1_2cpu.dtb
如果你想要 2 CPU秒。
如果您需要的 CPU 计数在任何当前 dtb 上都不存在,您可以:
- 按照以下说明将 dtb 转换为 dts:Tool to visualize the device tree file (dtb) used by the Linux kernel? 修改它们,然后执行相反的操作
修改在 gem5 树中生成 dtb 的
Makefile
:https://github.com/gem5/gem5/blob/a66fe6a8c36c9ab49cb3a35065bfc645d51036c8/system/arm/dt/Makefile#L40 并使用以下命令重新生成它们:make -C system/arm/dt
如果你想在 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 线程,然后如果遇到问题,请提出更具体的问题。