gpt4 book ai didi

c - 双核 ARMv7 处理器中的并行处理

转载 作者:行者123 更新时间:2023-12-03 12:45:48 28 4
gpt4 key购买 nike

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

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

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

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

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

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

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

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

最佳答案

您可以将每个单独的线程设置为不同的核心:

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

来自手册页:

Description

A process's CPU affinity mask determines the set of CPUs on which it is eligible to run. On a multiprocessor system, setting the CPU affinity mask can be used to obtain performance benefits. For example, by dedicating one CPU to a particular process (i.e., setting the affinity mask of that process to specify a single CPU, and setting the affinity mask of all other processes to exclude that CPU), it is possible to ensure maximum execution speed for that process. Restricting a process to run on a single CPU also avoids the performance cost caused by the cache invalidation that occurs when a process ceases to execute on one CPU and then recommences execution on a different CPU.

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

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

关于c - 双核 ARMv7 处理器中的并行处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50774136/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com