用std :: async控制并行度

时间:2017-07-14 15:26:49

标签: c++ multithreading c++11 asynchronous parallel-processing

有没有办法明确设置/限制std::async和相关类使用的并行度(=单独线程数)?

Perusing the thread support library没有发现任何有希望的东西。

尽可能接近,std::async实现(通常是?)在内部使用线程池。是否有标准化的API来控制它?

对于后台:我在一个设置(共享集群)中,我必须手动限制使用的核心数。如果我没有这样做,负载共享调度程序会抛出一个拟合,我会受到惩罚。特别是,std::thread::hardware_concurrency()没有任何有用的信息,因为物理核心的数量与我所受的约束无关。

这是一段相关的代码(在C ++ 17中使用并行TS,可能会使用parallel std::transform编写):

auto read_data(std::string const&) -> std::string;

auto multi_read_data(std::vector<std::string> const& filenames, int ncores = 2) -> std::vector<std::string> {
    auto futures = std::vector<std::future<std::string>>{};

    // Haha, I wish.
    std::thread_pool::set_max_parallelism(ncores);

    for (auto const& filename : filenames) {
        futures.push_back(std::async(std::launch::async, read_data, filename));
    }

    auto ret = std::vector<std::string>(filenames.size());
    std::transform(futures.begin(), futures.end(), ret.begin(),
            [](std::future<std::string>& f) {return f.get();});
    return ret;
}

从设计的角度来看,我已经期望std::execution::parallel_policy类(来自并行性TS)允许指定(事实上,这就是我在为我的硕士论文设计的框架中这样做的方式) 。但事实似乎并非如此。

理想情况下,我想要一个C ++ 11的解决方案,但是如果有一个用于更高版本的解决方案,我仍然想知道它(虽然我不能使用它)。

2 个答案:

答案 0 :(得分:4)

没有。 std::async是不透明的,您无法控制它对线程,线程池或其他任何东西的使用。事实上,你根本不保证它会使用一个线程 - 它也可以在同一个线程中执行(可能,请注意下面的@TC注释),这样的实现仍然符合要求。 / p>

C ++线程库从来不应该处理线程管理的OS /硬件细节的微调,所以我担心,在你的情况下你将不得不自己编写代码以获得适当的支持,可能使用OS提供的线程控制原语

答案 1 :(得分:2)

正如其他人所说,a=$(sed -ne 's/[^a-z]//g' -e 's/^.*secure=//p' -e 1q "$CLUSTERS_CONF") 不允许你这样做。

<强>然而

您正在描述Executors的一个更简单的用例,它目前仍在C ++标准化的设计空间中蹦蹦跳跳,特别是现在Study Group 1: Concurrency

由于阅读WG21标准提案可能是一个障碍,他们的作者有助于prototype header-only reference implementationsome example code

它甚至包括一个静态线程池,以及几乎完全符合您要求的示例: async_1.cpp

std::async

感谢@ jared-hoberock指点我P0668R0作为P0443R1的更简单的后续内容,我在此答案的早期版本中引用了该内容。

这种简化已经应用,现在有一篇论文描述了基本原理(P0761R0),以及P0443R2中标准措辞的更简单版本。

截至2017年7月,我在交付时看到的唯一实际猜测是:Concurrency TS的编辑Michael Wong,执行者的标准化工具---感觉“{{3} }。