Параллельное векторное изменение размера не ускоряется - PullRequest
0 голосов
/ 07 февраля 2019

В моем распоряжении 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);
    }

Я заметил, что программа не использует 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);
    }

, программа использовала около 60% мощности процессора.Я не понимаю этого явления - я надеялся, что он будет использовать 100% мощности процессора в больших случаях.Я что-то здесь упускаю?

Ответы [ 2 ]

0 голосов
/ 08 февраля 2019

Возможно, это не тот ответ, который вы ищете, но рассматривали ли вы использование boost :: multi_array

0 голосов
/ 07 февраля 2019

В Windows CRT использует встроенную реализацию кучи Windows, которая является однопоточной.

HeapAlloc блокирует CriticalSection (по существу, мьютекс) на время выделения,по существу, последовательность процесса выделения.

Так как изменение размера вектора - это в основном куча (пере) распределение, вы не увидите большого улучшения от его распараллеливания.

Сериализация обеспечивает взаимное исключение, когда два или болееПотоки пытаются одновременно выделить или освободить блоки из одной кучи.

Установка значения HEAP_NO_SERIALIZE устраняет взаимное исключение в куче.Без сериализации два или более потоков, использующих один и тот же дескриптор кучи, могут попытаться выделить или освободить память одновременно, что может привести к повреждению в куче.

Чтобы воспользоваться преимуществами параллельного выделения памяти, используйте другой распределитель кучи,Например jemalloc .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...