Russian Qt Forum
Май 10, 2024, 01:47 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: 1 ... 4 5 [6]   Вниз
  Печать  
Автор Тема: Многопоточная обработка массива  (Прочитано 40875 раз)
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #75 : Февраль 21, 2015, 23:16 »

Интересно. Кутёвый форич в том ли числе
Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #76 : Февраль 25, 2015, 19:16 »

Ещё интересуют пару моментов.
При использовании распараллеливания операция new или QVector::resize(n) может привести к нахлёсту памяти?
Ещё интересует понятие reentrant - мне его никак не осознать. Означает ли оно, что я могу спокойно запараллелить QVector::append в 4 потока?
Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #77 : Февраль 25, 2015, 19:48 »

Насчёт QVector::append  сам провел тест.
Код
C++ (Qt)
#pragma omp parallel for
   for (int i = 0; i < 100000000; ++i)
   {
       vec.append(i);
   }
 
Сначала получил ошибку в работе с памятью, а когда предварительно зарезервировал место, то получил размер массива 34171332
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #78 : Февраль 26, 2015, 10:41 »

Ещё интересуют пару моментов.
При использовании распараллеливания операция new или QVector::resize(n) может привести к нахлёсту памяти?
Ещё интересует понятие reentrant - мне его никак не осознать. Означает ли оно, что я могу спокойно запараллелить QVector::append в 4 потока?
Любые не-константные операции с любым контейнером НЕ "потокобезопасны" (NOT thread-safe) и ведут к крашу. Reentrant к этому отношения не имеет, это просто утверждение что ф-ция/метод отработает корректно если будет вызвана из самой себя, непосредственно или через цепочку др вызовов.

Если в параллельных вычислениях формируются результаты требующие сохранения в контейнере, то стандартная техника - каждая нитка пишет в свой контейнер, потом все сливается. Есть и менее хлопотный (но и менее эффективный) способ
Код
C++ (Qt)
#pragma omp parallel for
for (int i = 0; i < 100000000; ++i)
{
#pragma omp critical
    vec.append(i);
}
 
Правда в данном случае это будет работать медленнее чем без OpenMP Улыбающийся  Однако если основные вычисления будут вне critical - то вполне.

Ещё интересуют пару моментов.
Так, "пара моментов" (типа "детали") Улыбающийся  Да там еще ничего и не начиналось. Настоящее распараллеливание очень далеко от резвого создания потоков в Qt. Мало не покажется.

« Последнее редактирование: Февраль 26, 2015, 10:49 от Igors » Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #79 : Февраль 26, 2015, 10:53 »

О, спасибо. Мне это пригодится.

У меня имеется обработка с помощью #pragma omp parallel for.
Как будет правильнее отображать прогресс (со значением -1)?
Я имею в виду, как обойти блокировку интерфейса. Нужно вынести вычисления в QThread? OpenMP не сунется в главный поток?
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #80 : Февраль 26, 2015, 10:56 »

О, спасибо. Мне это пригодится.

У меня имеется обработка с помощью #pragma omp parallel for.
Как будет правильнее отображать прогресс (со значением -1)?
Я имею в виду, как обойти блокировку интерфейса. Нужно вынести вычисления в QThread? OpenMP не сунется в главный поток?
Используйте

#pragma omp master
Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #81 : Февраль 26, 2015, 14:03 »

Можно подробнее?
Есть 2 класса MainWindow и Solver. Первый вызывает метод второго и показывает прогресс. В методе Solver прописан #pragma omp parallel for.
Куда вписывается #pragma omp master?
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #82 : Февраль 26, 2015, 15:18 »

Можно подробнее?
Есть 2 класса MainWindow и Solver. Первый вызывает метод второго и показывает прогресс. В методе Solver прописан #pragma omp parallel for.
Куда вписывается #pragma omp master?
Псевдокод
Код
C++ (Qt)
void Solver::CalcParallel( void )
{
 QAtomicInt numDone = 0;
 
#pragma omp parallel for
 for (int i = 0; i < data.size; ++i) {
  DoCalc(data[i]);
  ++numDone;
 
#pragma omp master
  mainWindow->UpdateNumDone(numDone);
 }
}
Записан
Страниц: 1 ... 4 5 [6]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.103 секунд. Запросов: 23.