OpenMP:从上到下

OpenMP: Upper text to lower

本文关键字:从上到下 OpenMP      更新时间:2023-10-16

我试着为大学做一个任务。在这里,我们需要从std::cin中获取大文本,并将带有'tolower()'的每个字符转换为小写字符,并将其放入std::cout中。

这应该是并行的和可扩展的,首先我想把文本分成几行,并给每一行一个新的线程,但这项任务应该专门用openMP来完成。应该只使用一定数量的线程,因为我的机器可以并行运行,对吧?

所以有这个openMP 'for'范例:

#pragma omp parallel for

这是一个好主意,迭代每一个字符在for循环?还是有更好的办法?

谢谢你的建议!

无论如何都要遍历每个字符。然而,当谈到OpenMP时,它已经根据您的机器和迭代的块策略选择了许多线程;两者都是可调的,但您可能不需要这样做。在这种情况下,主要的限制实际上是你被指示使用tolower

注意:分成几行不容易并行化。例如,如果你的输入来自终端,如果你进行非阻塞读取或基于行读取(主要是;可以一次发送多行)。如果从文件中读取,分行需要扫描整个文件中的换行符,并计算换行符的起始和结束位置。但这完全是浪费精力,因为你的操作不依赖于线路;tolower不改变换行字符,也不添加或删除字符。

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