c++ async只使用2个内核
C++ async only uses 2 cores
我正在使用async同时运行一个方法,但是当我检查我的CPU时,它显示8个中只有2个在使用。我的CPU利用率在整个过程中大约是13%-16%。函数异步应该创建一个新的线程与每次调用,因此应该能够使用更多的处理器,或者我理解错了什么?
下面是我的代码:
for (map<string, Cell>::iterator a = cells.begin(); a != cells.end(); ++a)
{
for (map<string, Cell>::iterator b = cells.begin(); b != cells.end(); ++b)
{
if (a->first == b->first)
continue;
if (_paths.count("path_" + b->first + "_" + a->first) > 0)
{
continue;
}
tmp = "path_" + a->first + "_" + b->first;
auto future = async(launch::async, &Pathfinder::findPath, this, &a->second, &b->second, collisionZone);
_paths[tmp] = future.get();
}
}
我理解错了吗?
编辑:谢谢大家,我现在明白了。我不知道,调用。get()在未来会等待它完成,这似乎是合乎逻辑的…
但是,我现在编辑了我的代码:
for (map<string, Cell>::iterator a = cells.begin(); a != cells.end(); ++a)
{
for (map<string, Cell>::iterator b = cells.begin(); b != cells.end(); ++b)
{
if (a->first == b->first)
continue;
if (_paths.count("path_" + b->first + "_" + a->first) > 0)
{
continue;
}
tmp = "path_" + a->first + "_" + b->first;
mapBuffer[tmp] = async(launch::async, &Pathfinder::findPath, this, &a->second, &b->second, collisionZone);
}
}
for (map<string, future<list<Point>>>::iterator i = mapBuffer.begin(); i != mapBuffer.end(); ++i)
{
_paths[i->first] = i->second.get();
}
它的工作原理。现在它正确地生成线程并使用我所有的cpu功率。你给我省去了很多麻烦!再次感谢。
回答根本问题:
你可能应该通过分割循环来重构代码。在第一个循环中,您创建所有的期货,并将它们放入由tmp
索引的地图中。在第二个循环中,遍历该映射并获取每个future的所有值,将结果存储在_paths
在第一个循环之后,你将有很多并行运行的期货,所以你的核心应该足够忙。如果cells
足够大(>numCores),则只拆分内部循环可能是明智的。
std::async
异步运行指定函数并立即返回。就是这样。
这取决于编译器如何做。有些编译器为每个异步操作创建线程,有些编译器有线程池。
我推荐阅读这个:https://stackoverflow.com/a/15775870/2786682
顺便说一下,你的代码并没有真正使用std::async
,因为你在'产卵'异步操作后对future.get
进行同步调用。
是的,你确实弄错了。并行代码需要在编写任何代码之前进行一些思考。
你的代码创建了一个future
(它可能会产生一个新的线程),在那之后,你立即强制新创建的future
停止(调用它的.get()
方法),同步,让它返回一个结果。
因此,使用此策略,您的代码在任何时候都不会使用超过2个cpu内核。它不能。
实际上,大多数时候你的代码只使用一个核心!
- 当 2 个线程共享同一物理内核时,具有错误共享的易失性增量在发布中的运行速度比在调试中慢
- 在 Radeon 卡上并行执行多个 OpenCL 内核
- 在具有许多内核的计算机上,使用 Boost ASIO 只能使用 1 个线程
- 如何在 CUDA 中的内核函数中乘以两个 openCV 矩阵?
- 我有 12 个 CPU,1 个插槽,每个插槽 6 个内核,每个内核 2 个线程 - 这些信息如何对应于 MPI 和 Op
- 如何在多个 GPU 上同时执行 cufftXt 和 CUDA 内核
- OpenMP第一核比第二个内核慢得多
- 如何与多个内核一起使用模板循环结构
- GPUMAT-访问自定义内核中的2个通道浮点数据
- 多个内核写入单个文件
- 用C++在两个不同的内核中制作两个线程
- OpenMPI 上的线程应用程序仅在节点上使用 1 个内核
- 调用多个内核,全局内存性能 - CUDA
- Cuda:同步n个内核函数中的一个
- 如何分配指针数组并为cuda中的多个内核调用保留它们
- 当多个高优先级线程在多个内核上运行时,Linux内核没有响应
- 在一台有n个内核的机器中,确定要启动的线程数的最佳方法是什么?(C++)
- c++ async只使用2个内核
- 是否有可能同时在GPU上运行2个内核,并相互通信?
- 在 c++ 中使用多个内核处理大型顺序文件