pio*_*rka 4 c++ parallel-processing multithreading openmp multiprocessing
我必须处理8个处理器.我想按如下方式进行并行调整:
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);
}
Run Code Online (Sandbox Code Playgroud)
我注意到程序没有使用100%的处理器能力 - 它只使用了15%.当我更改代码时
vector<vector <int> > test;
test.resize(1000000);
#pragma omp parallel num_threads(8)
{
#pragma omp for
for (int i = 0;i < 1000000;i++)test[i].resize(5000);
}
Run Code Online (Sandbox Code Playgroud)
该程序使用了大约60%的处理器功率.我不明白这种现象 - 我希望它能在僵硬的情况下使用100%的处理器能力.我在这里错过了什么吗?
在Windows上,CRT使用内置的Windows堆实现,它是单线程的.
HeapAlloc在分配期间锁定CriticalSection(本质上是一个互斥锁),基本上是对分配过程进行顺序化.
由于向量大小调整主要是堆(重新)分配,因此并行化并不会有太大的改进.
当两个或多个线程尝试同时从同一堆分配或释放块时,序列化可确保互斥.
设置该
HEAP_NO_SERIALIZE值可消除堆上的互斥.如果没有序列化,使用相同堆句柄的两个或多个线程可能会尝试同时分配或释放内存,这可能会导致堆中的损坏.
要从并行内存分配中受益,请使用不同的堆分配器.例如jemalloc.
| 归档时间: |
|
| 查看次数: |
141 次 |
| 最近记录: |