如何在 gem5 完整系统中编译并运行 C 程序(使用 OpenMP)?

2024-02-23

我是一名本科生,正在撰写有关并行编程的论文。 我正在使用 OpenMP 模型。现在我想使用 gem5 来衡量性能。 这就是为什么我通过以下链接成功安装 gem5 完整系统:

http://cearial01.kaist.ac.kr/index.php/2016/08/26/gem5-documentation/ http://cearial01.kaist.ac.kr/index.php/2016/08/26/gem5-documentation/

现在我想使用 gem5 编译并运行 OpenMP (matmul.c) 的 c 程序。 我怎样才能编译和运行这个程序? 我的意思是我将这个程序文件(matmul.c)存储在哪个文件夹中进行编译? 我如何创建该程序的目标文件? 在运行和编译期间如何更改处理器数量、缓存大小、CPU 数量?

我是这个部门的新学生。这就是为什么我的要求清单太大了! 希望大家不要介意。

此致, 丽土


我怎样才能编译并运行这个程序?我的意思是我将这个程序文件(matmul.c)存储在哪个文件夹中进行编译?我如何创建该程序的目标文件?

如何交叉编译图像不是 gem5 特有的,所以我会简单介绍一下。

首先,您必须获得图像的交叉编译器。

最好的方法是从与映像相同的源获取交叉编译器以确保兼容性。

我的首选方法是使用最少的 Buildroot 映像。构建根目录:

  • 为我构建交叉编译器和映像,从而确保兼容性
  • 使用其软件包系统可以轻松自动构建新软件
  • 可以生成非常简单的图像,更适合gem5和架构研究

This is 我在 GitHub 上的设置 https://github.com/cirosantilli/linux-kernel-module-cheat/tree/e208cc15ebcd0b369053ae8831c4a984f2d106f9#gem5。它包含最少的OpenMP 你好世界 https://github.com/cirosantilli/linux-kernel-module-cheat/blob/e208cc15ebcd0b369053ae8831c4a984f2d106f9/kernel_module/user/openmp.c我已经在 gem5 中成功运行了。

另一个不错的选择是使用https://crosstool-ng.github.io/ https://crosstool-ng.github.io/

既然你想要OpenMP支持,你必须构建支持GCC交叉编译器的编译器。

我认为这是在 GCC 中完成的:

./configure --enable-libgomp

或通过 Buildroot 选项:

BR2_GCC_ENABLE_OPENMP=y

然后编译的时候,必须通过-fopenmp选项gcc.

如何更改处理器数量和高速缓存大小?

自己回答这个问题的最佳方法是使用以下内容:

./build/ARM/gem5.opt configs/example/fs.py -h

并搜索选项。

你会遇到:

  • -n NUM_CPUS, --num-cpus=NUM_CPUS.

    对于 ARM,您还需要传递一个.dtb与相应的核心数,例如:./system/arm/dt/armv7_gem5_v1_2cpu.dtb2 个核心。

  • 缓存:您将轻松找到以下选项:

     --caches --l1d_size=1024 --l1i_size=1024 --l2cache --l2_size=1024 --l3_size=1024
    

    但请记住:

    • 从 fbe63074e3a8128bdbe1a5e8f6509c565a3abbd4 开始,Linux 内核无法正确看到缓存大小恢复检查点后如何在gem5中切换CPU型号,然后观察差异? https://stackoverflow.com/questions/49011096/how-to-switch-cpu-models-in-gem5-after-restoring-a-checkpoint-and-then-observe-t
    • 缓存仅影响某些CPU类型,通常是更详细的,例如ARMHPI和 x86DerivO3CPU, 但不是AtomicSimpleCPU.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 gem5 完整系统中编译并运行 C 程序(使用 OpenMP)? 的相关文章

  • 为什么我的 OpenMP 实现比单线程实现慢?

    我正在学习 OpenMP 并发性 并尝试了一些现有的代码 在此代码中 我尝试使所有 for 循环并行 然而 这似乎使程序慢得多 至少慢 10 倍 甚至比单线程版本慢得多 这是代码 http pastebin com zyLzuWU2 htt
  • 使用OpenMP计算PI值

    我正在尝试通过并行化蒙特卡罗代码来学习如何使用 OpenMP 该代码通过给定的迭代次数计算 PI 的值 代码的核心内容是这样的 int chunk CHUNKSIZE count 0 pragma omp parallel shared c
  • 单/多线程(OpenMP)模式下计算精度的差异

    有人可以解释 理解单 多线程模式下计算结果的不同吗 这是一个大约的例子 圆周率的计算 include
  • 在 OpenMP 中计算矩阵的条目

    我对 openMP 很陌生 但我正在尝试编写一个简单的程序来并行生成矩阵的条目 即对于 N M 矩阵 A 令 A i j i j 下面包含一个最小的示例 include
  • 如何正确生成/恢复 OpenMP 未绑定任务?

    我编写了一个小型 C 程序来评估 OpenMP 在任务出现空闲时间 例如等待通信数据 时让出另一个任务的能力 include
  • 我可以安全地将 OpenMP 与 C++11 结合使用吗?

    OpenMP 标准仅考虑 C 98 ISO IEC 14882 1998 这意味着在 C 03 甚至 C 11 下没有支持使用 OpenMP 的标准 因此 任何使用 C gt 98 和 OpenMP 的程序都会在标准之外运行 这意味着即使它
  • OMP 线程私有对象未被破坏

    底线 如何确保 threadprivate 实例被正确销毁 背景 接听时这个问题 https stackoverflow com questions 32347008 confused about firstprivate and thre
  • 使用一个线程执行一个部分,并使用多个线程执行一个 for 循环

    我正在使用 OpenMP 并且想要生成线程 以便一个线程执行一段代码并完成 与运行并行 for 循环迭代的 N 个线程并行 执行应该是这样的 Section A one thread Section B parallel for multi
  • OpenMp 与 IOS/Android 的兼容性

    我正在尝试做什么 我正在研究C c 为所有平台构建产品的代码 我操作系统 Android Windows 移动 桌面 Mac Linux 到目前为止我做了什么 是的 有许多在线链接讨论 OpenMp 与不同处理器和操作系统的兼容性 但很难从
  • OMP:OMP PARALLEL DO 和 OMP DO 之间有什么区别(根本没有并行指令)

    好的 我希望以前没有问过这个问题 因为在搜索中找到这个问题有点棘手 我查阅了F95手册 但仍然觉得含糊不清 For the simple case of DO i 0 99
  • 通过向量 OpenMP C 进行矩阵乘法 [重复]

    这个问题在这里已经有答案了 我正在尝试用 C OpenMP 通过向量乘法编写矩阵 但是当我添加处理器时我的程序会变慢 1 proc 1 3 s 2 proc 2 6 s 4 proc 5 47 s 我在我的电脑 核心 i5 和我们学校的集群
  • 关闭 OpenMP

    在我的 C 程序中 我希望有时使用 OpenMP 有时不使用 OpenMP 即多线程或单线程 来运行其可执行文件 我正在考虑以下两种情况中的任何一种 我的代码如何使用 OpenMP 1 假设我的代码只有 include
  • 如何在工作线程中重用主线程创建的OMP线程池?

    在我的 C 应用程序开始附近 我的主线程使用 OMP 并行化多个 for 循环 在第一个并行化 for 循环之后 我发现所使用的线程在应用程序的持续时间内仍然存在 并且可以使用以下命令 在 CentOS 7 中工作 重用于从主线程执行的后续
  • 如何提高 OpenMP 代码的性能?

    我目前正在尝试提高我的代码的并行性能 但我对 OpenMP 仍然是新手 我必须迭代一个大容器 在每次迭代中从多个条目读取并将结果写入单个条目 下面是我正在尝试做的一个非常简单的代码示例 data是一个指向数组的指针 其中存储了许多数据点 在
  • 引导 gem5 X86 Ubuntu 完整系统模拟

    我需要在 gem5 上运行相对较新版本的 x86 磁盘映像 从 开始本指南 http www lowepower com jason creating disk images for gem5 html我使用了带有 Kernel v3 2
  • OpenMP 中使用循环的并行部分

    我想知道是否有任何技术可以使用 for 循环在 OpenMp 中创建并行部分 例如 我不想创建 n 个不同的 pragma omp 部分 而是使用 n 次迭代来创建它们for loop每个部分都有一些变化的参数 pragma omp par
  • Gcc 卸载编译选项

    我正在尝试使用 Ubuntu 18 04 上的 gcc 10 CUDA 11 和此 CMakeLists txt 文件 或 OpenMP 版本 构建最简单的具有 GPU 卸载功能的 OpenMP 或 OpenACC C 程序 cmake m
  • 在 Mac OS 上使用 OpenMP 和 C++11

    我正在尝试在我的 C 11 代码中使用一些 OpenMP 多线程功能 例如 pragma omp parallel for 当我尝试使用以下命令进行编译时 clang std c 11 stdlib libc fopenmp main cp
  • 并行迭代器

    我正在设计一个 C 数据结构 用于图形 供并行代码 使用 OpenMP 使用 假设我想要一个能够迭代所有元素 节点 的方法 当然 这个迭代将是并行的 是否可以使用迭代器来实现此目的 迭代器应该是什么样子才能实现并行访问 在这种情况下 您会建
  • 为什么 mex 文件中的 OpenMP 仅产生 1 个线程?

    我是 OpenMP 新手 我有以下代码 使用配置了 MSVS2010 的 Matlab mex 可以正常编译 计算机有 8 个可用处理器 我也使用 matlabpool 检查过 include mex h include

随机推荐