要将程序转换为强大的OpenMP感知版本,需要做些什么?

时间:2013-09-12 07:48:36

标签: c++ c openmp

有问题的程序对单个输入数据文件和单个输出数据文件进行操作:它从输入中获取数据单元,计算数据的几个统计特征,将特征输入输出。

发现该程序受CPU限制:CPU使用率是99%,计算所需的时间比读写时间长。决定使用OpenMP将程序转换为并行处理版本,因为硬件有32个CPU可用。但是,很明显它可能导致写入竞争条件,因为多个并行线程可能希望写入单个输出。

准备此类程序以实现OpenMP感知和OpenMp安全的必要步骤是什么?是否只能通过OpenMP pragma轻松实现而无需更改代码,或者必须先实现某些锁定机制?

1 个答案:

答案 0 :(得分:1)

并行化代码的难度实际上取决于耗费大部分时间的例程的复杂性。

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

一旦你有了这个问题,你需要问自己一些问题:

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

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

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

#pragma omp parallel default(none)