В настоящее время я работаю над системой, в которой я читаю файл размером более 200 миллионов записей (строк), поэтому я подумал, что могу улучшить модель производителя и потребителя (работая, как я читал). Тем не менее, я не добился высокой производительности, и я обеспокоен тем, что мой общий дизайн ошибочен. Для того, чтобы поместить его в контекст:C++ Параллельный файл ввода-вывода и анализ с задачами OpenMP
int i = 0;
string buffer[MAX_SIZE];
//critical regions exist for map_a and map_b (shared below) in the task function
#pragma omp parallel shared(map_a), shared(map_b), num_threads(X)
#pragma omp single
{
while (getline(fin, line) && !fin.eof())
{
buffer[i] = line;
if (++i == MAX_SIZE)
{
#pragma omp task firstprivate(buffer)
work_on_data(buffer, map_a, map_b);
i = 0;
}
}
}
Каждая запись в буфере занимает примерно 49-95μ обрабатывать в work_on_data
, с дисперсией из-за условными, и я подозреваю, что pragma omp critical
регионы (по одному для каждой общей карты). Для двух критических областей:
- Для map_a: если определенный регистр соответствует записи, запись должна быть добавлена на карту с ключом, полученным из записи. Если запись уже существует, ее необходимо будет обновить. Существует критическая область над чтением карты, потенциальным обновлением и записью.
- Для map_b: для каждой записи карта должна быть обновлена. Критическая область охватывает те же действия, что и (1), то есть чтение, потенциальное обновление/вставка и запись.
Итак, в отношении моего подхода. Должен ли я использовать отдельный pthread для буферизации ввода-вывода? Должен ли я просто буферизировать в один огромный буфер, выделенный памятью, и создавать задачи, которые pragma omp parallel for
над подмножеством его записей? Я не испытываю такого программирования.
Заранее благодарен!
Edit: Уточнено использование критической области.
Можете ли вы дать более подробную информацию о картах и о том, как они используются? Вы можете удалить критические регионы. – ElderBug
@ ElderBug Я немного разъяснил выше, и я могу добавить больше кода позже (на данный момент нажать на время).К сожалению, я не считаю, что критические регионы могут быть удалены, в каждой задаче нет уникальности записей, которые препятствуют чтению/обновлению/записи одних и тех же ключевых записей на обеих картах. Я пробовал использовать атомную запись, однако застрял со старой версией OpenMP. – PidgeyBAWK