Параллельная Обработка Данных, 09 лекция (от 30 октября)

Материал из eSyr's wiki.

Версия от 17:52, 3 февраля 2008; ESyr01 (Обсуждение | вклад)
(разн.) ← Предыдущая | Текущая версия (разн.) | Следующая → (разн.)
Перейти к: навигация, поиск

Предыдущая лекция | Следующая лекция

[править] CRAY C90

Расчет максимальной пиковой производительности. Как ее достичь? Максимально задействовать векторные операции. Оп явл векторной. если дл яее выполнения используется векторная команда. Векторная команда выполняетя если компилятору удается выделить одинаковые операции над разными данными. Пример:

DO i = 1,n
  c(i) = A(i)+B(i)
END DO

Что бы понять, какие оп можно векторизовать, надо ввести понятие вектора Вектор -- упорядоченный набор однотипных данных, все элементы которого размещены в памяти с одинаковым смещением друг относительно друга. Простейшим вектором является одномерный массив Векторами являются столбцы и сторки матрицы. Встает задача поиска в программе векторизуемых участков. Необходимо отсутствие зависимости по данным.

DO i = 1,n
 A(i) = funct (A(i), B(i))
END DO

В креях были предусмотрены спец комментарии, говорящие про такие куски есть ли в них зависимости или нет. Операции программы

  • векторизуемые
    • компилятор может векторизовать
    • компиятор не может векторизовать
  • невекторизуемые

Есть программа состоит из частей, часть которых можно векторизовать, а часть нельзя, то в действие вступает знакомый нам закон Амдала. Итак, мешающие факторы

  • Закон Амдала
  • разгон конвейера
  • секционирование векторных операций.

На хорошем цикле

DO i = 1,N
  A(i)= B(i)*s + C(i)
END DO

можно получить

N Mflops
1 7
2 14
16 100.5
128 433.7
129 364.3 (влияние селекционирования)
256 548
257 491
8192 802
  • конфликты в памяти. Самое плохое -- шаг по памяти в 64.

Рассмотрим цикл

DO i = 1,Nxk, k
  A(i) = B(i)*s + C(i)
END DO

Пусть N=1000

k Mflops
1 705.2
2 444.6
4 274.6
64 22.6

Поэтому с шагом = 64 надо бороться. НО это не всегда просто. Рассмотрим пример x[40][40][40]

DO i=1,n
  DO j = 1,n
    DO k = 1,n
      x(i,j,k)= x(i,j,k)+P(k,i)*Y(k,j)
    END DO
  END DO
END DO

x(i,j,k) x(i,j,k+1) находятся в памяти не рядом, а на расстоянии 40*40 = 25*64.То есть производительность будет крайне маленькой. Поэтому лучше описать х как x[41][41][1000]. Небольшое дополнительной памятью мы расплачиваемся за значительно большую производительность. Гораздо хуже если есть чтото вроде индексной адресации.

DO i = 1,n
  x(IX(i))  = ... X(IX(i))
END DO

Далеко не всегда с конфликтами по памяти можно разобраться статитически и далеко не всегда компилятор может с этим разобраться.

  • Ограниченная пропускная способность каналов процессор-память.
DO i=1,n
  A(i) = B(i)*C(i)+D(i)
END DO

Надо считать три вектора, а канлов только два.

N Mflops
10 57
100 278.3
1000 435.3
12801 445.0
  • необходимость использования векторных регистров


Параллельная Обработка Данных


01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16


Календарь

вт вт вт вт вт
Сентябрь
04 11 18 25
Октябрь
02 09 16 23 30
Ноябрь
06 13 20 27
Декабрь
04 11 18

Материалы к зачету

Вопросы к зачету по курсу Параллельная обработка данных


Эта статья является конспектом лекции.

Эта статья ещё не вычитана. Пожалуйста, вычитайте её и исправьте ошибки, если они есть.
Личные инструменты
Разделы