我正在开发Zedboard,它包含双核ARM A9处理器并运行Linux。该电路板与外部I/O设备通信。
我有两个用“C”语言编写的函数,我必须并行运行。
一个函数调用while循环,连续地将数据转储到外部设备,并将处理后的数据接收回内存指针。
另一个函数从指针位置读取数据,创建它的副本,并执行计算密集型过程(如FFT、信号对齐等,这很慢)。
外部设备需要每秒1500万个样本的数据。如果我只运行第一个函数,并且只需要一个ARM内核的70%,我就能够实现这一点。当我运行这两个函数时,两个ARM内核都达到了极限,并且我发现无法以所需的采样速度向外部设备提供数据。
有没有一种方法可以将两个函数限制在独立的内核中(第二个函数速度很慢,但第一个函数的性能不会受到影响),并且仍然能够在它们之间共享数据?
我尝试使用OpenMP,但它不能达到所需的性能。我读到过关于SCHED_SETAFFINITY的文章,但在理解它的实现时遇到了问题。
我已经使用霓虹灯构造/库和ARM处理器的自动矢量化特性尽可能地优化了我的每个函数。
发布于 2018-06-09 20:52:34
您可以使用以下命令将每个单独的线程设置为不同的核心:
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。哇!热门话题;)
https://stackoverflow.com/questions/50774136
复制相似问题