LabVIEW中For 循环 “迭代并行”(Iteration Parallelism)

0 阅读3分钟

假设我们正在开发 LabVIEW 代码,用于监控局域网内任意时刻运行的 LabVIEW 实例数量。代码片段大致如下:

在这段代码中,TCP 打开连接函数会在 1 秒后超时,循环总共执行 256 次。

上述代码的最坏执行时间约为 256 。在一台 Windows 7 四核电脑上实测,执行时间约为225

我们通常会产生两个疑问:

  1. 有没有办法缩短执行时间?
  2. 能否利用所有可用 CPU 核心来提升性能?

答案都是:可以。下面说明如何实现。


LabVIEW 2009开始,For 循环新增了迭代并行功能。

我们在代码中启用该功能并调试最优参数,最终将执行时间从225 秒缩短到仅 4

启用 “迭代并行” 的步骤

  1. 使用菜单 Tools >> Profile >> Find Parallelizable Loops 工具,检查 For 循环是否可并行。
  2. 如果循环不可并行,消除迭代间的数据依赖。移位寄存器、反馈节点是最常见的数据依赖来源,尽量避免使用。
  3. 在本例中,我们将迭代无关代码迭代相关代码分离。修改后,第一个 For 循环可并行,第二个因存在迭代依赖不可并行。
  4. 右键单击第一个 For 循环边框,选择 Configure Iteration Parallelism(配置迭代并行)。
  5. 窗口中 Number of generated parallel loop instances (生成的并行循环实例数) 记为 T,最大值可设为 64
  6. 不勾选 Allow debugging (允许调试) ,保持 Automatically partition iterations (自动分区迭代) 选中。
  7. 勾选 Enable loop iteration parallelism (启用循环迭代并行) ,确定后循环上会出现 P 端子
  8. 为 P 端子创建控件,命名为 P。
  9. 下表为不同 P、T 组合的执行时间测试结果。

测试结果表

P 端子输入值 / 执行时间(秒)

表格

P 输入T=2T=4T=8T=16T=32T=64
2113.02125.00122.01124.01119.01110.02
未接线(四核)100.0361.0158.0161.0261.0153.78
4115.0260.0060.0054.0249.0054.01
8114.0162.0028.0128.0231.0028.07
16102.0358.0126.0115.0114.0114.02
32100.0157.0130.0015.016.047.01
64123.0062.9929.0115.017.013.07
128122.0058.0029.0115.007.014.02
256118.0159.0130.0114.017.034.08

关键观察

  • 当 P > T 时,执行时间与 P=T 基本一致。
  • P 不接线时,LabVIEW 会自动按 CPU 核心数分配线程:双核→2,四核→4。

结论

  1. T (生成的并行循环实例数) :编译时生成的线程数量。
  2. P 端子:运行时实际使用的线程数(取自 T 生成的线程池)。
  3. P 端子不接线时,LabVIEW 自动按目标机器 CPU 核心数分配线程。
  4. P 超过 64 无性能提升(T 最大仅支持 64)。
  5. 若代码体积大,T=64 可能占用大量内存,此时应降低 T。
  6. 本例因包含 TCP 等待延迟,64 线程可真正并行,提升极显著;无延迟的纯 CPU 计算,提升通常不超过 2~4 倍,甚至因线程调度开销性能下降
  7. 本例中 64 线程达到最佳性能(3 秒),但并非所有场景都如此,受内存、代码无延迟、CPU 核心数限制。
  8. 若循环内无等待延迟,建议 P 端子不接线,由 LabVIEW 自动最优分配。