Задать вопрос
@ahame

Как здесь распараллелили задачу?

Как здесь происходит распараллеливание? Функция для фильтра гаусса, циклами проходится по окрестностям изображения и в каждой точке окрестности вычисляет значение для результата.

Matrix OmpGauss(const Matrix& mat, int height, int width, int R, double sigma) {
  Matrix finMat(height, std::vector<double>(width));
  Matrix kernel = GaussKernel(R, sigma);
#pragma omp parallel
  {
#pragma omp for collapse(2) schedule(static)
    for (int64_t x = 0; x < height; x++) {
      for (int64_t y = 0; y < width; y++) {
        int finValue = 0;
        for (int64_t i = -R; i <= R; i++) {
          for (int64_t j = -R; j <= R; j++) {
            double value = mat[x][y];
            finValue += value * kernel[i + R][j + R];
          }
        }
        finValue = clamp(finValue, 255, 0);
        finMat[x][y] = finValue;
      }
    }
  }
  return finMat;
}
  • Вопрос задан
  • 83 просмотра
Подписаться 1 Простой 3 комментария
Решения вопроса 1
wataru
@wataru Куратор тега C++
Разработчик на С++, экс-олимпиадник.
2 внешних цикла распаралелены omp. Там в коде инструкции взять и запустить несколько потоков, которые пройдутся по всем значениям x и y.

Это работает, потому что каждая итерация вычисляется независимо от остальных.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы