【发布时间】: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