Параллельная Обработка Данных, 09 лекция (от 30 октября)
Материал из eSyr's wiki.
(Отмена правки № 1380 участника 192.108.114.19 (обсуждение)) |
|||
(2 промежуточные версии не показаны) | |||
Строка 1: | Строка 1: | ||
+ | [[Параллельная Обработка Данных, 08 лекция (от 23 октября)|Предыдущая лекция]] | [[Параллельная Обработка Данных, 10 лекция (от 06 ноября)|Следующая лекция]] | ||
+ | |||
==CRAY C90== | ==CRAY C90== | ||
Расчет максимальной пиковой производительности. | Расчет максимальной пиковой производительности. | ||
Строка 5: | Строка 7: | ||
Пример: | Пример: | ||
- | DO i = 1,n | + | DO i = 1,n |
- | + | c(i) = A(i)+B(i) | |
- | c(i) = A(i)+B(i) | + | END DO |
- | + | ||
- | END DO | + | |
Что бы понять, какие оп можно векторизовать, надо ввести понятие вектора | Что бы понять, какие оп можно векторизовать, надо ввести понятие вектора | ||
Строка 16: | Строка 16: | ||
Встает задача поиска в программе векторизуемых участков. Необходимо отсутствие зависимости по данным. | Встает задача поиска в программе векторизуемых участков. Необходимо отсутствие зависимости по данным. | ||
- | DO i = 1,n | + | DO i = 1,n |
- | + | A(i) = funct (A(i), B(i)) | |
- | A(i) = funct (A(i), B(i)) | + | END DO |
- | + | ||
- | END DO | + | |
В креях были предусмотрены спец комментарии, говорящие про такие куски есть ли в них зависимости или нет. | В креях были предусмотрены спец комментарии, говорящие про такие куски есть ли в них зависимости или нет. | ||
Строка 36: | Строка 34: | ||
На хорошем цикле | На хорошем цикле | ||
- | DO i = 1,N | + | DO i = 1,N |
- | + | A(i)= B(i)*s + C(i) | |
- | A(i)= B(i)*s + C(i) | + | END DO |
- | + | ||
- | + | ||
можно получить | можно получить | ||
- | N | + | {| |
- | + | !N | |
- | 1 7 | + | !Mflops |
- | + | |- | |
- | 2 14 | + | |1 |
- | + | |7 | |
- | 16 100.5 | + | |- |
- | + | |2 | |
- | 128 433.7 | + | |14 |
- | + | |- | |
- | 129 364.3 (влияние селекционирования) | + | |16 |
- | + | |100.5 | |
- | 256 548 | + | |- |
- | + | |128 | |
- | 257 491 | + | |433.7 |
- | + | |- | |
- | 8192 802 | + | |129 |
+ | |364.3 (влияние селекционирования) | ||
+ | |- | ||
+ | |256 | ||
+ | |548 | ||
+ | |- | ||
+ | |257 | ||
+ | |491 | ||
+ | |- | ||
+ | |8192 | ||
+ | |802 | ||
+ | |} | ||
*конфликты в памяти. Самое плохое -- шаг по памяти в 64. | *конфликты в памяти. Самое плохое -- шаг по памяти в 64. | ||
Рассмотрим цикл | Рассмотрим цикл | ||
- | DO i = 1,Nxk, k | + | DO i = 1,Nxk, k |
- | + | A(i) = B(i)*s + C(i) | |
- | + | END DO | |
- | + | ||
- | END DO | + | |
Пусть N=1000 | Пусть N=1000 | ||
- | k | + | {| |
- | + | !k | |
- | 1 705.2 | + | !Mflops |
- | + | |- | |
- | 2 444.6 | + | |1 |
- | + | |705.2 | |
- | 4 274.6 | + | |- |
- | + | |2 | |
- | 64 22.6 | + | |444.6 |
- | + | |- | |
- | + | |4 | |
+ | |274.6 | ||
+ | |- | ||
+ | |64 | ||
+ | |22.6 | ||
+ | |} | ||
Поэтому с шагом = 64 надо бороться. НО это не всегда просто. Рассмотрим пример | Поэтому с шагом = 64 надо бороться. НО это не всегда просто. Рассмотрим пример | ||
x[40][40][40] | x[40][40][40] | ||
- | DO i=1,n | + | 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 | |
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | END DO | + | |
x(i,j,k) x(i,j,k+1) находятся в памяти не рядом, а на расстоянии 40*40 = 25*64.То есть производительность будет крайне маленькой. Поэтому лучше описать х как x[41][41][1000]. Небольшое дополнительной памятью мы расплачиваемся за значительно большую производительность. | x(i,j,k) x(i,j,k+1) находятся в памяти не рядом, а на расстоянии 40*40 = 25*64.То есть производительность будет крайне маленькой. Поэтому лучше описать х как x[41][41][1000]. Небольшое дополнительной памятью мы расплачиваемся за значительно большую производительность. | ||
Гораздо хуже если есть чтото вроде индексной адресации. | Гораздо хуже если есть чтото вроде индексной адресации. | ||
- | DO i = 1,n | + | DO i = 1,n |
- | + | x(IX(i)) = ... X(IX(i)) | |
- | + | END DO | |
- | + | ||
- | END DO | + | |
Далеко не всегда с конфликтами по памяти можно разобраться статитически и далеко не всегда компилятор может с этим разобраться. | Далеко не всегда с конфликтами по памяти можно разобраться статитически и далеко не всегда компилятор может с этим разобраться. | ||
- | *Ограниченная пропускная способность каналов процессор-память. | + | * Ограниченная пропускная способность каналов процессор-память. |
- | DO i=1,n | + | DO i=1,n |
- | + | A(i) = B(i)*C(i)+D(i) | |
- | A(i) = B(i)*C(i)+D(i) | + | END DO |
- | + | ||
- | END DO | + | |
Надо считать три вектора, а канлов только два. | Надо считать три вектора, а канлов только два. | ||
- | N Mflops | + | {| |
+ | !N | ||
+ | !Mflops | ||
+ | |- | ||
+ | |10 | ||
+ | |57 | ||
+ | |- | ||
+ | |100 | ||
+ | |278.3 | ||
+ | |- | ||
+ | |1000 | ||
+ | |435.3 | ||
+ | |- | ||
+ | |12801 | ||
+ | |445.0 | ||
+ | |} | ||
- | + | *необходимость использования векторных регистров | |
- | + | {{Параллельная Обработка Данных}} | |
- | + | {{Lection-stub}} | |
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + |
Текущая версия
Предыдущая лекция | Следующая лекция
[править] 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 |
Материалы к зачету