Код: Выделить всё
#pragma omp parallel
{
#pragma omp single
{
unsigned int grain_size = (rows + cols) / (4 * omp_get_max_threads());
grain_size = grain_size > 1 ? grain_size : 1; // Ensure at least 1 cell per chunk
int waves = rows + cols - 1;
for (int wave = 0; wave < waves; wave++) {
#pragma omp taskloop grainsize(grain_size)
for (int i = 1; i < rows; i++) {
int j = wave - i;
if (j < 1 || j > cols) continue;
float match = S[i - 1][j - 1] + (X[i - 1] == Y[j - 1] ? match_score : mismatch_score);
float del = S[i - 1][j] + gap_penalty;
float insert = S[i][j - 1] + gap_penalty;
S[i][j] = std::max({match, del, insert});
thread_counters[omp_get_thread_num()]++;
}
}
}
}
Оценка идентичности: 40146, Пробелы: 6062, Длина (с пробелами): 55591
< blockquote>
== Параллельная версия завершена за 30,5004 секунды. Посещенных записей: 2761492321 Оценка: 18639, Оценка сходства: 40146, Оценка идентичности:
mismatch -1, ignore_penalty: -2 Размер матрицы S: [51481x53641]
- ОС – Windows 10
- Процессор – Ryzen 2700
- Оперативная память — 3000 МГц DDR4
- Потоков — 12
- Версия компилятора — g++ 12.2
- Версия C++ — 20
https://github.com/Padraig20/Global- Попарное выравнивание последовательностей
Подробнее здесь: https://stackoverflow.com/questions/791 ... n-parallel