C ++, почему эта параллель для l oop с vector.insert () cra sh, когда размер l oop становится больше? - PullRequest
0 голосов
/ 22 апреля 2020

У меня есть вложенные циклы, которые вставляют целые числа в вектор пустых векторов a1i.

vector<vector<int>> a1i = {{},{},{},{},{},{},{}...};

#pragma omp parallel for simd
for(int x = 0;x < a1i.size();x++){
   for(int y = 0; y < x - 1; y++){
      a1i[x].insert(a1i[x].end(),y);
   }
}

вектор будет выглядеть примерно так после l oop.

a1i = {
{},
{},
{0},
{0,1},
{0,1,2},
{0,1,2,3},
{0,1,2,3,4}
...
}

l oop ведет себя хорошо, когда размер a1i мал, но если он большой, например, 5000 элементов, моя программа падает из-за циклов.

Если я оцениваю размер вектора векторов, он будет равен половине вектор 5000 на 5000 векторов целых чисел должен занимать около 50 000 000 байт (50 мегабайт). Я уверен, что у меня больше 50 мегабайт памяти. Вектор - это глобальная переменная, поэтому он должен быть в куче?

Или здесь есть что-то еще, занимающее огромное количество памяти?

Является ли моя оценка в правильном порядке величины?

Проблема пытается одновременно vector.insert ()?

Я вижу, что каждый поток будет вставлять в a1i свой вектор, поэтому я ничего не подозреваю.

Я что-то упускаю из виду, что очень очевидно?

1 Ответ

1 голос
/ 24 апреля 2020

Ожидаемое усиление OMP при параллельной работе на всех a1i[x], которые действительно независимы, поэтому безопасность потока будет уменьшена за счет динамического увеличения a1i[x] размера вектора (путем вызова insert или push_back). Лучшее решение для производительности будет:

vector<vector<int>> a1i = {{},{},{},{},{},{},{}...};

#pragma omp parallel for simd
for(int x = 0;x < a1i.size();x++){
  a1i[x].reserve(x); 
   for(int y = 0; y < x - 1; y++){
      a1i[x].push_back(y);
   }
}

или

#pragma omp parallel for simd
for(int x = 0;x < a1i.size();x++){
  a1i[x].resize(x); 
   for(int y = 0; y < x - 1; y++){
      a1i[x]= y;
   }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...