热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

C++11异步只使用一个核心

如何解决《C++11异步只使用一个核心》经验,为你挑选了1个好方法。

我试图在C++中并行化一个长时间运行的函数,并使用std :: async它只使用一个核心.

这不是函数的运行时间太小,因为我目前正在使用大约需要10分钟运行的测试数据.

根据我的逻辑,我创建NThreads值得期货(每个都占用循环的一部分而不是单个单元格,因此它是一个很好的长期运行的线程),每个都将调度异步任务.然后在创建它们之后,程序旋转锁定等待它们完成.但是它总是使用一个核心?!

这不是我看顶部并说它看起来大致像一个CPU,我的ZSH配置输出最后一个命令的CPU%,它总是正好 100%,从不高于

auto NThreads = 12;
auto BlockSize = (int)std::ceil((int)(NThreads / PathCountLength));

std::vector>> Futures;

for (auto I = 0; I  ZeroChildren,
           std::vector OneChildren,
           unsigned __int128 PathCountLength)
           -> std::vector {
           std::vector LocalCount;
           for (unsigned __int128 I = Min; I 

有没有人有任何见解.

我正在使用Arch Linux上的clang和LLVM进行编译.有没有我需要的编译标志,但从我可以告诉C++ 11标准化的线程库?

编辑:如果它可以帮助任何人提供任何进一步的线索,当我注释掉本地矢量时,它会在所有内核上运行,就像它应该的那样,当我将它放回滚动回到一个核心时.

编辑2:所以我把解决方案固定下来,但看起来很奇怪.从lambda函数返回向量将其固定为一个核心,所以现在我通过将a传递shared_ptr给输出向量并操纵它来绕过它.嘿presto,它在核心上爆发!

我认为现在使用期货是毫无意义的,因为我没有返回,我会使用线程,而不是!使用没有返回的线程也使用一个核心.怪啊呃?

很好,回到使用期货,只需返回扔掉或什么的.是的,你猜对了,即使从线程中返回一个int,也会将程序粘贴到一个核心.除了期货不能有无效的lambda函数.所以我的解决方案是传入一个指针来存储输出,到一个永远不会返回任何东西的int lambda函数.是的,它感觉像胶带,但我看不到更好的解决方案.

看起来如此......古怪?就像编译器以某种方式错误地解释lambda一样.可能是因为我使用了LLVM的开发版,而不是一个稳定的分支......?

无论如何我的解决方案,因为我讨厌在这里找到我的问题并且没有答案:

auto NThreads = 4;
auto BlockSize = (int)std::ceil((int)(NThreads / PathCountLength));

auto Futures = std::vector>(NThreads);
auto OutputVectors =
    std::vector>>(
        NThreads, std::make_shared>());

for (auto I = 0; I  ZeroChildren,
       std::vector OneChildren,
       unsigned __int128 PathCountLength,
       std::shared_ptr> OutputVector)
        -> int {
      for (unsigned __int128 I = Min; I push_back(KneeParallel::pathCountOrStatic(
            WMin, I, ZeroChildren, OneChildren, PathCountLength));
      }
    },
    WMin, Min, Max, ZeroChildInit, OneChildInit, PathCountLength,
    OutputVectors[I]);
}

for (auto &Future : Futures) {
  Future.get();
}

SebastianK.. 14

通过为async提供第一个参数,您可以将其配置为运行deferred(std::launch::deferred),在其自己的thread(std::launch::async)中运行,或让系统在两个选项(std::launch::async | std::launch::deferred)之间进行决策.后者是默认行为.

因此,迫使它在另一个线程运行,适应你的电话std::asyncstd::async(std::launch::async, /*...*/).



1> SebastianK..:

通过为async提供第一个参数,您可以将其配置为运行deferred(std::launch::deferred),在其自己的thread(std::launch::async)中运行,或让系统在两个选项(std::launch::async | std::launch::deferred)之间进行决策.后者是默认行为.

因此,迫使它在另一个线程运行,适应你的电话std::asyncstd::async(std::launch::async, /*...*/).


谢谢你的建议,但它没有帮助......?我在开始时添加了std :: launch :: async,但它表现出相同的行为.短暂运行后来自zsh的snippit - "13.92s用户5.28s系统100%cpu 19.184总计"
推荐阅读
author-avatar
蜜小嘟_546
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有