gpt4 book ai didi

c++ - 我应该根据 CPU 的数量将我的异步调用分成 block 吗?

转载 作者:行者123 更新时间:2023-11-30 01:42:06 28 4
gpt4 key购买 nike

在 8 处理器机器上考虑这个脚本:

int parallel_function(int i){
system(some_complex_and_long_call);
return i;
}

int main() {
// Parallel run
std::vector<std::future<int>> futures;
for(int i = 30; i > 0; i--) {
futures.push_back (std::async(std::launch::async, parallel_function, i));
}
std::cout << "Stuff submitted" << std::endl;
for(auto &e : futures) {
std::cout << e.get() << std::endl;
}
return 0;
}

它将以异步方式产生 30 个系统调用,但是我只有 8 个处理器,并且每个系统调用都可以(而且我想应该)使用 100% 的单个处理器。

是一次只运行 8 个调用(甚至 7 个,并让处理器空闲)更好还是没关系,我想调用多少就调用多少。哪个运行得更快,为什么?

另一个问题:我可以异步调用 void 函数,还是该函数必须返回某些内容?

最佳答案

这真的取决于 std:async 的实现.

如果some_complex_and_long_call确实是 CPU 绑定(bind)任务,那么将线程数作为您的(逻辑)内核数似乎是合理的。

GCC 实际上为每个 std::async 生成一个线程调用,因此您可能不想使用 async 的 GCC 版本太多了。线程的创建、调度和销毁是昂贵的,上下文切换会降低你的性能。在这种情况下,我建议您找到一个线程池实现(github 上有很多)并使用线程池而不是 async .

Clang 和 VC++ 在调用 std::async 时都在后台使用线程池所以如果你使用这些编译器,产生尽可能多的async如您所愿,底层实现将为您创建线程。

Another side question: Can i call a void function in async, or the function must return something?

是的,这是可能的。在这种情况下 std::async将返回 std::future<void> .

关于c++ - 我应该根据 CPU 的数量将我的异步调用分成 block 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40103815/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com