Как я могу использовать openmp для распараллеливания моего кода агрегации?

0

На самом деле, я хочу сделать агрегацию в таблице, каждый столбец которой является массивом. Мне нужно отсканировать таблицу и сделать агрегацию. Но, как представляется, Openmp не поддерживает это использование имени массива после директивы сокращения. Так, Как я могу использовать openmp для параллелизации моего агрегирующего кода? спасибо

  • 0
    Я правильно понимаю, вы хотите получить сумму в столбце?
  • 0
    Получить сумму одного столбца, я могу использовать это: сокращение (+: сумма), но в моем коде есть 8 столбцов, и мне нужно получить сумму столбцов в соответствии с двумя столбцами из 8 столбцов. В соответствии со значением двух столбцов, у меня есть переменная хеш-таблицы [2] [3]. Эта хеш-таблица хранит сумму различных ситуаций (а это всего лишь 6 ситуаций) двух столбцов.
Показать ещё 3 комментария
Теги:
aggregate
openmp
aggregate-functions

1 ответ

0
Лучший ответ

Я думаю, что вы сталкиваетесь с двумя отдельными ограничениями в OpenMP, которые мешают вам выполнять свою работу:

  1. Ваша переменная сумма аккумулятора - это не простая переменная, а запись массива, которую вы хотели бы передать OpenMP "по имени". OpenMP не поддерживает это. Получите значение из массива, запишите его в локальную переменную, уменьшите локальную переменную и запишите значение обратно в массив.
  2. "Enter" имеет пользовательский тип данных. OpenMP не поддерживает сокращение по сравнению с ними. Таким образом, все 6 членов "Входа", которые вы хотите подвести, должны стать отдельными локальными переменными. Вы можете передать список из 6 переменных в предложение OpenMP "сокращение".
  • 0
    спасибо за ваш ответ. Вы хотите сказать, что единственный способ, которым я могу это сделать, - это объявить некоторую другую переменную-аналог переменной var в массиве struct. Это означает, что если у меня есть "struct aggr_t {long a, double b, double c } хеш-таблица [2] [3] ", я должен переопределить 24 var, чтобы использовать директиву сокращения? Есть ли другой способ не кажется неуклюжим?
  • 0
    Хм, я не видел, чтобы твой макрос "Entry" содержал ссылку на переменную цикла "i". Это еще более усложняет ситуацию, вы правы, вам понадобится много, много локальных переменных. Поэтому, если вы не хотите этого делать, я бы сказал, что у вас есть 2 варианта: 1.) Не используйте никаких сокращений, а вместо этого позвольте всем потокам работать с одними и теми же общими данными, что означает, что вам потребуется синхронизация с избегайте потерянных обновлений, которые, вероятно, убьют ваше ускорение. 2.) Напишите свой собственный код сокращения.
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню