我必须处理8个处理器。 我想按如下所示进行并行调整大小:
Sum Agent
--- -----
2 05007
13 05008
5 05018
我注意到该程序没有使用100%的处理器功率-仅使用了15%的处理器功率。当我更改代码
vector<vector <int> > test;
test.resize(10000);
#pragma omp parallel num_threads(8)
{
#pragma omp for
for (int i = 0;i < 10000;i++)test[i].resize(500000);
}
该程序使用了大约60%的处理器功率。我不了解这种现象-我希望在这种情况下,它将消耗100%的处理器功率。我在这里想念东西吗?
答案 0 :(得分:9)
在Windows上,CRT使用内置的Windows堆实现(单线程)。
HeapAlloc在分配期间锁定CriticalSection(本质上是一个互斥锁),实质上是对分配过程进行了排序。
由于向量大小调整主要是堆(重新)分配,因此并行化不会带来太大改进。
串行化可确保当两个或多个线程试图同时分配或释放同一堆中的块时相互排斥。
设置
HEAP_NO_SERIALIZE
值可消除堆上的互斥。如果不进行序列化,则使用相同堆句柄的两个或多个线程可能会尝试同时分配或释放内存,从而可能导致堆损坏。
要从并行内存分配中受益,请使用其他堆分配器。例如jemalloc。
答案 1 :(得分:0)
也许不是您要找的答案,但您是否考虑过使用boost :: multi_array