Последние записи
- Рандомное слайдшоу
- Событие для произвольной области внутри TImage
- Удаление папки с файлами
- Распечатка файла
- Преобразовать массив байт в вещественное число (single)
- TChromium (CEF3), сохранение изображений
- Как в Delphi XE обнулить таймер?
- Изменить цвет шрифта TextBox на форме
- Ресайз PNG без потери прозрачности
- Вывод на печать графического файла
Интенсив по Python: Работа с API и фреймворками 24-26 ИЮНЯ 2022. Знаете Python, но хотите расширить свои навыки?
Slurm подготовили для вас особенный продукт! Оставить заявку по ссылке - https://slurm.club/3MeqNEk
Online-курс Java с оплатой после трудоустройства. Каждый выпускник получает предложение о работе
И зарплату на 30% выше ожидаемой, подробнее на сайте академии, ссылка - ttps://clck.ru/fCrQw
14th
Июл
Безопасная работа с памятью в OpenMP С++
Posted by obzor under c/c++
Вопрос связан с тем как можно добавлять элементы к общему динамическому массиву в параллельных потоках.
По сути задачи приходится к созданному многомерному vector добавлять новые элементы.
Пусть есть, например, vector<vector<int>> A. Первая размерность уже проинициализрована полностью (например, 0-N-1). Есть гарантия, что внутри потоков происходит обращение к собственному набору индексов первой размерности. То есть, разные потоки не могут обращаться к одному и тому же первому индексу.
Однако заранее определить размерность второго индекса для каждого первого индекса невозможно (вычисляется внутри цикла по первому индексу).
Можно конечно взять максимально возможную оценку, но тогда никакой памяти не хватит (Сотни гигабайт). В результате пользуюсь операторами типа A.push_back(k) в каждый момент, когда необходимо добавить элемент (В реальности массив четырехмерный, причем основной добавляемый элемент — Structure)
Тем не менее необходимо распараллеливание (счет идет более суток).
Попробовал использовать простейшие варианты из OpenMP типа #pragma omp parallel for, однако во время работы выдает всякие ошибки так или иначе связанные с памятью.
Может ли кто-нибудь подсказать, как все-таки добавлять память внутри потоков, при этом получая выигрыш во времени счета при распараллеливании.
Защитить обращения к std::vector через mutex.
Использовать свой std::vector в каждом потоке и в конце объединить их.
Использовать что-то другое, вместо std::vector. Например вставка в std::list гораздо быстрее.
Использовать lock-free алгоритмы.
Случайные статьи
Купить рекламу на сайте за 1000 руб
пишите сюда - alarforum@yandex.ru
Да и по любым другим вопросам пишите на почту
пеллетные котлы
Пеллетный котел Emtas
Наши форумы по программированию:
- Форум Web программирование (веб)
- Delphi форумы
- Форумы C (Си)
- Форум .NET Frameworks (точка нет фреймворки)
- Форум Java (джава)
- Форум низкоуровневое программирование
- Форум VBA (вба)
- Форум OpenGL
- Форум DirectX
- Форум CAD проектирование
- Форум по операционным системам
- Форум Software (Софт)
- Форум Hardware (Компьютерное железо)