首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >双核ARMv7处理器中的并行处理

双核ARMv7处理器中的并行处理
EN

Stack Overflow用户
提问于 2018-06-09 20:10:21
回答 1查看 431关注 0票数 3

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

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

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

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

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

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

我尝试使用OpenMP,但它不能达到所需的性能。我读到过关于SCHED_SETAFFINITY的文章,但在理解它的实现时遇到了问题。

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

EN

回答 1

Stack Overflow用户

发布于 2018-06-09 20:52:34

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

代码语言:javascript
复制
 int sched_setaffinity(pid_t pid,size_t cpusetsize,cpu_set_t *mask);

从手册页:

描述

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

但是,如果您的代码在输入和输出线程之间具有硬数据关系,则多线程作为单核心使用可能会更慢!这与内存/缓存几乎没有关系,尤其是在内核/内存/缓存和外部总线系统之间的所有桥上的arm上。你应该玩弄优先级,亲和力,也许还有其他参数。

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50774136

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档