我正在开发Zedboard,它包含双核ARM A9处理器并运行Linux。该板与外部I / O设备通信。
我有两个用'C'语言编写的函数,我必须并行运行。
一个函数调用while循环并不断地将数据转储到外部设备,并将处理后的数据接收回内存指针。
另一个函数从指针位置读取数据会创建它的副本,并进行计算密集型处理(例如FFT,信号对齐等很慢)。
外部设备需要每秒1500万个样本的数据。如果我只运行第一个函数,它可以实现,它占用一个ARM内核的大约70%。当我运行这两个函数时,两个ARM内核达到了极限,我发现我无法以所需的采样速度向外部设备提供数据。
有没有办法可以限制独立内核中的两个功能(第二个功能无关紧要但第一个功能的性能不会受到影响)并且仍能够共享数据他们之间?
我尝试使用OpenMP,但它无法实现所需的性能。我读到了SCHED_SETAFFINITY,但在理解其实现方面遇到了问题。
我已经使用NEON构造/库和ARM处理器的自动矢量化功能优化了我的每个功能。
答案 0 :(得分:2)
您可以使用以下命令将每个单独的线程设置为不同的核心:
int sched_setaffinity(pid_t pid,size_t cpusetsize,cpu_set_t *mask);
从手册页:
描述
进程的CPU关联掩码确定它有资格运行的CPU集。在多处理器系统上,设置CPU关联掩码可用于获得性能优势。例如,通过将一个CPU专用于特定进程(即,将该进程的关联掩码设置为指定单个CPU,并设置所有其他进程的关联掩码以排除该CPU),可以确保最大执行速度对于那个过程。限制在单个CPU上运行的进程还可以避免在进程停止在一个CPU上执行然后重新开始在另一个CPU上执行时发生的高速缓存失效导致的性能成本。
但是如果您的代码在输入和输出线程之间存在硬数据关系,那么多线程可能会因单核用法而变慢!这几乎与内存/高速缓存无关,特别是在核心/内存/高速缓存与外部总线系统之间的所有桥上。您应该使用优先级,亲和力以及其他参数。
BTW:“每秒1500万个样本”和1个GHZ Arm上的IO与Linux并行进行FFT。哇!热门的东西;)