OpenMP:要降低的上部文本

时间:2016-11-05 11:33:57

标签: c++ multithreading openmp

我尝试为大学做任务。我们需要从std :: cin中获取大型文本,并使用' tolower()'转换每个字符。到较低的char并将其放入std :: cout。

这应该是分段和可扩展的,首先我考虑将文本分成行并将每行放到一个新线程中,但任务应该只使用openMP完成。并且应该只使用这么多线程,因为我的机器可以并行运行,对吧?

所以有这个openMP' for'范例

#pragma omp parallel for

迭代for循环中的每个char都是一个好主意吗?或者有更好的方法吗?

感谢您的建议!

1 个答案:

答案 0 :(得分:1)

在任何情况下,你都会迭代每一个char。然而,当涉及到OpenMP时,它已经根据你的机器选择了许多线程,并在你的迭代中选择了一个块策略;要么是可调的,要么你可能不需要。这种情况下的主要限制实际上是您已被指示使用tolower

一个注意事项:拆分成行不容易并行化。例如,如果您的输入来自终端,如果您执行非阻塞读取或基于行读取,则终端层已经为您完成了输入(大多数情况下;它可以一次发送多行)。如果从文件中读取,则拆分为行需要扫描整个文件以获取换行符并计算它们的开始和结束位置。但是,由于您的操作并不依赖于线路,因此完全浪费了精力; tolower不会更改换行符,也不会添加或删除字符。

至于使用for循环是否是个好主意;在OpenMP C中,是的。 OpenMP会将您的典型for (i=0; i<len; i++)转换为更智能的算法#pragma omp parallel for。使用更高级别的语言,您需要的操作称为map,并且可能具有并行版本,例如Haskell&#39; parMap。在这种语言中,你基本上做output = map tolower input。我希望有现代C ++知识的人能够使用一些Boost模板来实现它。