【问题标题】:Parallel processing in dual core ARMv7 processor双核 ARMv7 处理器中的并行处理
【发布时间】:2018-11-19 07:28:21
【问题描述】:

我正在开发包含双核 ARM A9 处理器并运行 Linux 的 Zedboard。该板与外部 I/O 设备通信。

我有两个用“C”语言编写的函数,我必须并行运行。

一个函数调用一个while循环并不断地将数据转储到外部设备并将处理后的数据接收回内存指针。

另一个函数从指针位置读取数据并创建一个副本并执行计算密集型过程(例如 FFT、信号对齐等,速度很慢)。

外部设备需要每秒 1500 万个样本的数据。如果我只运行第一个函数并且它需要大约 70% 的一个 ARM 内核,我就能够实现这一点。当我运行这两个函数时,两个 ARM 内核都达到了极限,我发现我无法以所需的采样速度向外部设备提供数据。

有没有一种方法可以限制独立内核中的两个功能(第二个功能慢但不能影响第一个功能的性能并不重要)并且仍然能够共享数据他们之间?

我尝试使用 OpenMP,但无法达到所需的性能。我阅读了有关 SCHED_SETAFFINITY 的信息,但在理解其实现时遇到了问题。

我已经使用 NEON 构造/库和 ARM 处理器的自动矢量化功能尽可能优化了我的每个功能。

【问题讨论】:

  • 您可能受到内存或缓存的限制。在 fft 线程中插入一些无操作。
  • 你也尝试过处理要运行函数的线程的优先级吗?
  • fft 大小和输入/输出类型是多少?你确定你使用的是最好的算法和库吗?你在做 SDR 吗?无论如何,我在网络上看到了很多糟糕的 NEON 实现,它们直接无法使用。
  • 是的,我正在研究 SDR 实施。我使用的 FFT 大小为 2048。由于我的输入和输出类型本质上是复杂的,因此我使用两个 float32 数组来存储输入和输出,在发送和接收之前将其类型转换为 int16 用于 ADC/DAC。我正在为我的信号处理实现使用 Project Ne10 库。

标签: c multithreading performance parallel-processing neon


【解决方案1】:

您可以使用以下方法将每个单独的线程设置为不同的核心:

 int sched_setaffinity(pid_t pid,size_t cpusetsize,cpu_set_t *mask);

来自手册页:

说明

进程的 CPU 亲和性掩码决定了它可以运行的 CPU 集。在多处理器系统上,设置 CPU 关联掩码可用于获得性能优势。例如,通过将一个 CPU 专用于特定进程(即设置该进程的关联掩码以指定单个 CPU,并将所有其他进程的关联掩码设置为排除该 CPU),可以确保最大执行速度对于那个过程。将进程限制在单个 CPU 上运行还可以避免当进程停止在一个 CPU 上执行然后重新开始在另一个 CPU 上执行时发生的缓存失效导致的性能成本。

但是,如果您的代码在输入和输出线程之间存在硬数据关系,则多线程可能会比单核使用更慢!这与内存/缓存几乎没有关系,尤其是在核心/内存/缓存和外部总线系统之间的所有桥接器上。您还应该考虑优先级、亲和性以及其他参数。

顺便说一句:“每秒 1500 万个样本”和 FFT 与 1 GHZ Arm 上的 IO 与 Linux 并行。哇!热的东西;)

【讨论】:

  • 好的,先生,我会尝试设置线程优先级,然后让您知道结果
  • 我想他正在研究 SDR(软件定义无线电),考虑到数据大小和要求。 15M 样本/秒并不多。
  • 是的,先生,15.36MSps 是我必须达到的最基本要求,我必须最终将其增加到 61.44MSps,但问题在于 Zedboard 中 Arm 处理器的处理能力。
  • 先生,即使将功能限制在它们的独立内核上,我也无法达到性能,可能是因为600MHz双臂A9处理器。但是,我现在更改了系统并使用另一个处理器来分担高计算任务,通过以太网连接
猜你喜欢
  • 2012-04-11
  • 1970-01-01
  • 2010-10-10
  • 2018-07-13
  • 2015-12-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多