【问题标题】:c++ parallel std::sort for floating valuesc++ 并行 std::sort 浮点值
【发布时间】:2017-08-27 00:22:52
【问题描述】:

我有一个包含 > 数百万个浮点值的大文件。我现在可以通过将文件读入vector 轻松地使用std::sort 对它们进行排序,例如-

std::vector<float> v;
std::sort(v.begin(), v.end());

但是是否有任何版本的std::sort 或类似算法可以利用我系统上可用的多个内核?由于这是唯一需要花费大量时间设置的任务,因此我正在寻找通过拥有 > 1 个核心 cpu 来改进性能。

我可以在 x64 linux 服务器上使用任何最新版本的编译器,也可以使用 -std=c++1z 编译二进制文件。

【问题讨论】:

标签: c++ multithreading sorting c++14 c++17


【解决方案1】:

你很幸运。 C++ Extensions for Parallelism Technical Specification 添加了许多标准算法的并行版本,包括std::sort。它们在 C++17 中可用。 GCC 对此提供支持,您可以查看他们的相关页面here。看起来他们正在使用 OpenMP 进行多线程处理。

GCC 先决条件编译器标志

任何并行功能的使用都需要额外的编译器和运行时支持,尤其是对 OpenMP 的支持。添加此支持并不难:只需使用编译器标志 -fopenmp 编译您的应用程序。这将链接到 libgomp,即 GNU 卸载和多处理运行时库,它的存在是强制性的。

此外,支持原子操作的硬件和能够产生原子操作的编译器是强制性的:GCC 在一些常见的硬件架构上默认不支持原子操作。激活原子操作可能需要在某些目标(如 sparc 和 x86)上显式编译器标志,例如 -march=i686、-march=native 或 -mcpu=v9。有关详细信息,请参阅 GCC 手册。


我知道您说您使用的是 Linux,但我还想说明它似乎是 MSVS,starting with version 2013 RTM,也支持并行技术规范。

【讨论】:

  • 也许你可以提到-fopenmp 的需要,看起来你也需要-D_GLIBCXX_PARALLEL
  • 我觉得这个答案有点误导。您链接的并行模式已在 GCC 中使用多年,早于 C++ Extensions for Parallelism Technical Specification。这是一个编译器特定的扩展,并且有不同的算法可用(尽管很多与 C++ 扩展规范相同)。如果我错了请告诉我,但据我所知,GCC 还不支持 C++ Extensions for Parallelism Technical Specification。
  • 您能否提供一个链接并相应地修改您的答案?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-09-20
  • 1970-01-01
  • 1970-01-01
  • 2012-12-22
  • 2018-11-11
  • 2016-03-06
相关资源
最近更新 更多