Узкое место производительности в цикле задач OpenMPC++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Узкое место производительности в цикле задач OpenMP

Сообщение Anonymous »

Я работаю над распараллеливанием функции на C++ с использованием OpenMP для оптимизации вложенных циклов для вычислений динамического программирования. Функция gpsa_taskloop предназначена для заполнения двумерной матрицы S на основе значений X и Y, используя прагмы Taskloop для распределения работы между потоками. Однако, несмотря на настройку цикла задач с определенными значениями размера зерна (256 для граничной инициализации и 2048 для основного цикла), производительность по-прежнему намного ниже, чем ожидалось.
Вот краткое описание структуры функции:
  • Инициализация границ:
    • Инициализируются граничные ячейки со штрафом за пробел с использованием двух отдельных циклов задач, где размер зерна установлен на 256.
    < li>Заполнение основной матрицы:
    • В основном цикле диагональные «волны» матрицы обрабатываются с помощью цикла задач для вычисления максимальных значений на основе совпадения, удаления, и операции вставки. Размер зерна здесь установлен на 2048.
    • Сокращение используется для накопления счетчика посещений по потокам.
Проблема с производительностью: несмотря на использование OpenMP с параллелизмом на основе задач и указанием размера зерна, код плохо масштабируется и работает плохо, особенно в разделе «Заполнение основной матрицы». Я подозреваю, что проблемы могут быть вызваны:
  • Код: Выделить всё

    taskloop
    неэффективность из-за структуры вложенного цикла или выбора размера детализации.
  • Накладные расходы при планировании задач, особенно при сокращениях.
  • Неэффективная стратегия распараллеливания зависимостей внутри волновых вычислений в основном цикле.
Мне нужен совет по повышению производительности, особенно с помощью конфигураций OpenMP или альтернативных вариантов. подходы к распараллеливанию для обработки зависимостей при волновом заполнении матрицы.

Код: Выделить всё

unsigned long SequenceInfo::gpsa_taskloop(float** S) {
unsigned long visited = 0;

double start_time, end_time;
double boundary_time = 0.0, main_time = 0.0;

auto start = high_resolution_clock::now();

unsigned long local_visited_row = 0;
unsigned long local_visited_column = 0;

// Boundary
#pragma omp parallel
{
#pragma omp single
{
#pragma omp taskloop collapse(1) reduction(+:local_visited_row) grainsize(256)
for (unsigned int i = 1; i < rows; i++) {
S[i][0] = i * gap_penalty;
local_visited_row++;
}

#pragma omp taskloop collapse(1) reduction(+:local_visited_column) grainsize(256)
for (unsigned int j = 0; j < cols; j++) {
S[0][j] = j * gap_penalty;
local_visited_column++;
}
}
}

visited += local_visited_row + local_visited_column;

auto stop = high_resolution_clock::now();

std::cout 

Подробнее здесь: [url]https://stackoverflow.com/questions/79153805/performance-bottleneck-in-openmp-taskloop[/url]
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C++»