平行向量调整大小不加速

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%的处理器能力.我在这里错过了什么吗?

rus*_*tyx 9

在Windows上,CRT使用内置的Windows堆实现,它是单线程的.

HeapAlloc在分配期间锁定CriticalSection(本质上是一个互斥锁),基本上是对分配过程进行顺序化.

由于向量大小调整主要是堆(重新)分配,因此并行化并不会有太大的改进.

当两个或多个线程尝试同时从同一堆分配或释放块时,序列化可确保互斥.

设置该HEAP_NO_SERIALIZE值可消除堆上的互斥.如果没有序列化,使用相同堆句柄的两个或多个线程可能会尝试同时分配或释放内存,这可能会导致堆中的损坏.

要从并行内存分配中受益,请使用不同的堆分配器.例如jemalloc.

  • 我相信Linux上的glibc默认使用线程感知分配器.;-) (2认同)
  • 确实如此,FreeBSD使用jemalloc :) (2认同)