Вот краткое описание структуры функции:
- Инициализация границ:
- Инициализируются граничные ячейки со штрафом за пробел с использованием двух отдельных циклов задач, где размер зерна установлен на 256.
- В основном цикле диагональные «волны» матрицы обрабатываются с помощью цикла задач для вычисления максимальных значений на основе совпадения, удаления, и операции вставки. Размер зерна здесь установлен на 2048.
- Сокращение используется для накопления счетчика посещений по потокам.
- неэффективность из-за структуры вложенного цикла или выбора размера детализации.
Код: Выделить всё
taskloop
- Накладные расходы при планировании задач, особенно при сокращениях.
- Неэффективная стратегия распараллеливания зависимостей внутри волновых вычислений в основном цикле.
Код: Выделить всё
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]