Нижегородский государственный университет им. Н.И.Лобачевского
Опубликован: 30.05.2014 | Доступ: свободный | Студентов: 288 / 30 | Длительность: 11:26:00

Самостоятельная работа 3: Оптимизация вычислений в задаче о разложении чисел на простые сомножители. Векторизация и балансировка нагрузки

Аннотация: Цель данной лабораторной работы – рассмотрение на примере задачи разложения чисел на простые сомножители некоторых вопросов, возникающих при распараллеливании программ на сопроцессорах Intel Xeon Phi.

Введение

Презентацию к лабораторной работе Вы можете скачать здесь.

Повышение производительности программ всегда была и будет актуальной проблемой. Для повышения производительности, эффективнее всего использовать алгоритмическую оптимизацию. К сожалению, алгоритмическая оптимизация, как правило, является очень трудоемкой. Второй путь повышения производительности программ – распараллеливание. В последнее время для распараллеливания используются не только ядра центрального процессора, но и различные ускорители и сопроцессоры. Одним из таких сопроцессоров является Intel Xeon Phi недавно появившейся на рынке.

В данной лабораторной работе рассматривается вопрос переноса вычислений с центрального процессора на сопроцессор Intel Xeon Phi на примере простой задачи – разложения чисел на простые сомножители. Также, рассматривается ряд простых подходов позволяющих увеличить производительность параллельной реализации алгоритма работающей на Intel Xeon Phi.

Методические указания

Цели и задачи работы

Цель данной лабораторной работы – рассмотрение на примере задачи разложения чисел на простые сомножители некоторых вопросов, возникающих при распараллеливании программ на сопроцессорах Intel Xeon Phi. Основные вопросы – метод переноса вычислений на сопроцессор, влияние разных методов распределения вычислений на скорость вычислений, а также подходы к оптиизации вычислений под сопроцессор Intel Xeon Phi.

Данная цель предполагает решение следующих основных задач:

  1. Изучение простейшего алгоритма разложения чисел на простые сомножители1 Рассматриваемый алгоритм является малоэффективным, его использование в лабораторной работе носит иллюстративный характер. При решении практических задач, как правило, применяются другие алгоритмы, например, алгоритмы Полларда или Диксона ([ [ 10.1 ] - [ 10.3 ] ]).
  2. Последовательная реализация алгоритма.
  3. Перенос вычислений на сопроцессор Intel Xeon Phi.
  4. Многопоточная реализация данного алгоритма, которая предусматривает разделение множества факторизуемых чисел на равные части по количеству потоков.
  5. Поиск других подходов к распределению нагрузки между потоками для повышения эффективности приложения.
  6. Рассмотрение вопросов оптимизации программ под сопроцессор Intel Xeon Phi.
  7. Построение гибридной схемы вычислений одновременно на CPU и сопроцессоре.

Структура работы

В начале, рассматривается задача разложения множества чисел на простые множители и приводится последовательная реализация. Далее рассматриваются вопросы переноса вычислений на сопроцессор Intel Xeon Phi и возможные проблемы, которые могут возникнуть в процессе переноса. В процессе выполнения лабораторной работы реализуется несколько многопоточных версий алгоритма в соответствии с различными подходами к распределению нагрузки между потоками. Для распараллеливания алгоритма применяются директивы OpenMP. Затем вычислительная схема оптимизируется за счет векторизации кода. В финале демонстрируется способ построения гибридной схемы вычислений одновременно на центральном процессоре и сопроцессоре.

Тестовая инфраструктура

Для проведения экспериментов использовались вычислительные ресурсы МСЦ РАН [10.4]. На момент проведения экспериментов тестовая инфраструктура представлена в таблице 8.1.

Таблица 8.1. Тестовая инфраструктура
Процессор 2 процессора на узел Xeon E5-2690 (2.9 GHz, 8 ядер)
Память 64 GB
Сопроцессор Intel Xeon Phi 7110X
Операционная система Linux CentOS 6.2
Компилятор, профилировщик, отладчик Intel C/C++ Compiler 14

Задача разложения чисел на простые сомножители

Лабораторная работа построена на задаче факторизации (разложения на простые сомножители) чисел из диапазона от 1 до N. Используемый алгоритм базируется на попытке деления факторизуемого числа на каждое из меньших его чисел [10.2]. Если остаток от деления на некоторый множитель равен нулю, то этот множитель запоминается, частное становится делимым, после чего производится повторная попытка деления на это же число. Алгоритм завершает свою работу, когда частное от очередного деления равно единице.

Рассмотрим работу алгоритма для одного числа. Допустим, что необходимо определить простые множители числа 12. Для этого перебираются числа, меньшие 12, начиная с 2, и выполняется последовательность операций деления:

12 / 2 = 6 // остаток равен 0, пробуем делить еще раз на 2

6 / 2 = 3 // остаток равен 0, пробуем делить еще раз на 2

3 / 2 = 1,5 // остаток отличен от 0,

//рассматриваем следующее число, меньшее 12

3 / 3 = 1 // частное равно 1, алгоритм останавливает работу

Псевдокод последовательного алгоритма выглядит следующим образом:

1. for i = 1 to N
2.   number ← i;   
3.   for j = 2 to i
4.     if (number == 1) break; 
5.     r ← number % j;
6.     if (r == 0)
7.       number ← number / j;
8.       save_divisor(i, j);
9.       j ← j - 1;

В соответствии с приведенным псевдокодом может быть реализована простейшая последовательная версия алгоритма.

Svetlana Svetlana
Svetlana Svetlana

Здравствуйие! Я хочу пройти курс Введение в принципы функционирования и применения современных мультиядерных архитектур (на примере Intel Xeon Phi), в презентации самостоятельной работы №1 указаны логин и пароль для доступ на кластер и выполнения самостоятельных работ, но войти по такой паре логин-пароль не получается. Как предполагается выполнение самосоятельных работ в этом курсе?

Владимир Хаванских
Владимир Хаванских
Россия, Москва, Высшая школа экономики
Дмитрий Кифель
Дмитрий Кифель
Казахстан, Темиртау