То, о чем мы говорили в комментариях в качестве ответа: так как мне все равно пришлось написать какой-то шаблон, я использовал тип int как тип и избегал вообще думать о проблемах с плавающей точкой:
#include <vector>
#include <iostream>
using namespace std;
int main(){
constexpr size_t n = 3;
// dummy Distf (int) declared in lieu of matrix Distf
int Distf[n][n] = {{1,2,3},{6,5,4},{7,8,8}};
//could be an array<int,n> instead
vector<int> minRows(n);
#pragma omp parallel for
for (size_t i = 0; i < n; ++i){
int minValue = Distf[i][0];
// Alain Merigot argues this is a performance drag
//#pragma omp parallel for reduction(min : minValue)
for (size_t j = 1; j < n; ++j){
if (Distf[i][j] < minValue){
minValue = Distf[i][j];
}
}
//minRows.push_back(minValue) is a race condition!
minRows[i] = minValue;
}
int k = 0;
for(auto el: minRows){
cout << "row " << k++ << ": " << el << '\n';
}
cout << '\n';
}
Внутренний циклобычно не нужно распараллеливать. Я не знаю, сколько ядер вы можете использовать, но если вы не работаете в массивно параллельной системе, подумайте о параллелизме на уровне GPU, внешний цикл должен либо использовать все доступные ядра, либо проблема просто недостаточно велика. имеет значения. Запуск большего количества потоков в любой ситуации - пессимизация.