1

所讨论的程序对单个输入数据文件和单个输出数据文件进行操作:它从输入中获取一个数据单元,计算数据的几个统计特征,然后将这些特征放入输出中。

发现该程序受 CPU 限制:CPU 使用率一直为 99%,计算比读取和写入花费更多时间。由于硬件有 32 个 CPU 可用,因此决定使用 OpenMP 将程序转换为并行处理版本。然而,很明显它可能导致写入竞争条件,因为多个并行线程可能希望写入单个输出。

准备此类程序以支持 OpenMP 和 OpenMp 安全的必要步骤是什么?是否可以仅通过 OpenMP 编译指示轻松实现,而无需更改代码,或者之前必须实现一些锁定机制?

4

1 回答 1

1

并行化代码的难度实际上取决于占用最多时间的例程的复杂性。

在进行任何并行计算之前,您应该做的第一件事是分析您的代码并确定哪个函数准确地导致了大部分 CPU 时间。

一旦你有了,你需要问自己以下问题:

  • 它是否具有数据依赖性?
  • 如果是,我可以通过复制某些负担得起的数据结构来摆脱它们吗?
  • 如果不是,它们是读/写还是只读?
  • 如果它们是读/写的,它们被访问的频率 - 根据它选择正确的锁定机制。
  • 我有读/写全局变量吗?如果是 - 它们可以成为线程本地的吗?如果没有 - 摆脱它们。
  • 完成所有排序后,决定将输入拆分为线程的最佳方法(有关详细信息,请参阅 OpenMP 调度)
  • 开始编写编译指示,重新排列代码,使函数成为线程安全/可重入的。
  • 最后的失败并非最不重要:调试,调试,调试。尝试设计可在多线程应用程序中重现的输入/输出小示例。

回答你的最后一个问题:stdio库调用都是线程安全的。他们使用内部锁定。

第一个提示#pragma omp parallel:默认情况下,所有变量都是共享的,将它们定义为不可用,并分别为每个变量指定共享/私有。否则,这是错误的常见陷阱:

#pragma omp parallel default(none)
于 2013-09-12T08:03:11.467 回答