Вычислить минимальное значение каждой строки в матрице, используя циклы, параллельные openmp C ++ - PullRequest
0 голосов
/ 16 октября 2019

Я хочу вычислить минимальное значение каждой строки в матрице параллельно, используя openmp c ++, следующим образом:

// matrix Distf (float) of size n by n is declared before. 
vector<float> minRows;
#pragma omp parallel for
for (i=0; i < n; ++i){
     float minValue = Distf[i][0];
     #pragma omp parallel for reduction(min : minValue)
     for (j=1; j < n; ++j){
          if (Distf[i][j] < minValue){
                    minValue = Distf[i][j];
           }
     }
     minRows.push_back(minValue);
 }

Пока что компилятор не выдает никакой ошибки, но мне интересно, получится ли этоправильный ответ, как и следовало ожидать? Спасибо

1 Ответ

1 голос
/ 16 октября 2019

То, о чем мы говорили в комментариях в качестве ответа: так как мне все равно пришлось написать какой-то шаблон, я использовал тип 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, внешний цикл должен либо использовать все доступные ядра, либо проблема просто недостаточно велика. имеет значения. Запуск большего количества потоков в любой ситуации - пессимизация.

...