作者:蜜小嘟_546 | 来源:互联网 | 2023-05-20 18:22
我试图在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::async
来std::async(std::launch::async, /*...*/)
.
1> SebastianK..:
通过为async提供第一个参数,您可以将其配置为运行deferred(std::launch::deferred
),在其自己的thread(std::launch::async
)中运行,或让系统在两个选项(std::launch::async | std::launch::deferred
)之间进行决策.后者是默认行为.
因此,迫使它在另一个线程运行,适应你的电话std::async
来std::async(std::launch::async, /*...*/)
.
谢谢你的建议,但它没有帮助......?我在开始时添加了std :: launch :: async,但它表现出相同的行为.短暂运行后来自zsh的snippit - "13.92s用户5.28s系统100%cpu 19.184总计"