Skip to content

Кулик Артур. Технология OMP. Умножение разреженных матриц. Элементы типа double. Формат хранения матрицы – столбцовый (CCS). Вариант 5#259

Open
Mamontyonok wants to merge 12 commits intolearning-process:masterfrom
Mamontyonok:kulik_a_mat_mul_double_ccs_omp

Conversation

@Mamontyonok
Copy link
Contributor

Описание

  • Задача: Умножение разреженных матриц. Элементы типа double. Формат хранения матрицы – столбцовый (CCS).
  • Вариант: 5
  • Технология: OMP
  • Описание вашей реализации и отчёта.
    Реализована параллельная версия алгоритма умножения двух разреженных матриц, хранящихся в формате CCS (Compressed Column Storage) с элементами типа double, с помощью библиотеки OpenMP. Результат операции так же представлен в формате CCS.

Описание реализации параллельной версии (OpenMP)

  • Столбцы правой матрицы равномерно распределяются между потоками с использованием статического распределения итераций schedule(static), что обеспечивает балансировку нагрузки при одинаковой плотности столбцов
  • Каждый поток обрабатывает закреплённые за ним столбцы независимо. Для временного хранения результатов умножения очередного столбца на левую матрицу поток использует собственные локальные массивы: вектор для накопления произведений и список индексов, по которым этот вектор был изменён
  • После завершения обработки всех столбцов полученные векторы (ненулевые элементы и соответствующие им индексы строк) для каждого столбца уже хранятся в общих структурах (local_values, local_rows), индексированных по номеру столбца
  • На заключительном этапе выполняется построение результирующей матрицы в формате CCS: формируется массив указателей на столбцы (col_ind), после чего значения и индексы строк параллельно копируются из временных векторов в итоговые массивы

Описание тестирования

  • Для функциональных тестов была взята матрица размером 6x6, произведение посчитано на бумаге в плотном формате и сравнено с результатом работы алгоритма
  • Для тестов на производительность, в силу больших размеров матриц, нельзя вычислить результат на бумаге или на компьютере в плотном формате. Для проверки корректности использовался способ домножения справа на произвольный вектор: (A * B) * x = C * x. Воспользовавшись ассоциативностью умножения, получим A * (B * x) = C * x, где B * x и C * x - векторы. Такое матрично-векторное произведение (SpMV) легко вычислить на компьютере. Если конечные векторы слева и справа совпадают (с учетом погрешности конечной машинной арифметики), то матрицы A * B и C равны

Описание генерации матриц

  • Используются квадратные матрицы размера 20000 со средним числом элементов в столбце, равным 50 (матрица разрежена на 50 / 20000 * 100% = 0.25%). Матрицы генерируются ленточными (похожими на ленточные) для лучшей локальности данных

Чек-лист

  • Статус CI: Все CI-задачи (сборка, тесты, генерация отчёта) успешно проходят на моей ветке в моем форке
  • Директория и именование задачи: Я создал директорию с именем <фамилия>_<первая_буква_имени>_<короткое_название_задачи>
  • Полное описание задачи: Я предоставил полное описание задачи в теле pull request
  • clang-format: Мои изменения успешно проходят clang-format локально в моем форке (нет ошибок форматирования)
  • clang-tidy: Мои изменения успешно проходят clang-tidy локально в моем форке (нет предупреждений/ошибок)
  • Функциональные тесты: Все функциональные тесты успешно проходят локально на моей машине
  • Тесты производительности: Все тесты производительности успешно проходят локально на моей машине
  • Ветка: Я работаю в ветке, названной точно так же, как директория моей задачи
    (например, nesterov_a_vector_sum), а не в master
  • Правдивое содержание: Я подтверждаю, что все сведения, указанные в этом pull request, являются точными и
    достоверными

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant