13
Московский Физико-Технический Институт Оптимизация методов умножения Оптимизация методов умножения матриц библиотеки линейной алгебры матриц библиотеки линейной алгебры для ВК “Эльбрус для ВК “Эльбрус - - 3 3 M M 1” и “Эльбрус-90 1” и “Эльбрус-90 микро” микро” Выполнил: Чернилевский Д.А. Научный руководитель: Логинов В.Е. 2009 г.

Московский Физико-Технический Институт

Embed Size (px)

DESCRIPTION

Московский Физико-Технический Институт. Оптимизация методов умножения матриц библиотеки линейной алгебры для ВК “Эльбрус - 3 M 1” и “Эльбрус-90 микро”. Выполнил : Чернилевский Д.А. Научный руководитель : Логинов В.Е. 2009 г. Разделы библиотеки EML. - PowerPoint PPT Presentation

Citation preview

Page 1: Московский Физико-Технический Институт

Московский Физико-Технический Институт

Оптимизация методов умножения Оптимизация методов умножения матриц библиотеки линейной алгебры матриц библиотеки линейной алгебры для ВК “Эльбрусдля ВК “Эльбрус--33MM1” и “Эльбрус-901” и “Эльбрус-90

микро”микро”

Выполнил: Чернилевский Д.А.Научный руководитель: Логинов В.Е.

2009 г.

Page 2: Московский Физико-Технический Институт

Разделы библиотеки Разделы библиотеки EML.EML.

A lge b ra Im a ge S ig n a l V e c to r

E lb ru s M u lt im e d ia L ib ra ry

Page 3: Московский Физико-Технический Институт

Структура раздела Структура раздела Algebra Algebra ((библиотека библиотека BLAS):BLAS):

y = αx + y

y = αAx + βy

C = αAB + βC

A и В – матрицы,

х и у – вектора,

α и β – числа.

L e ve l 3

L e ve l 2

L e ve l 1

BLAS:

Page 4: Московский Физико-Технический Институт

Цель работыЦель работы

Провести анализ существующей реализации библиотеки

EML

Выявить возможные способы оптимизации кода с

применением архитектурных особенностей ВК

“Эльбрус-90 микро” и “Эльбрус-3М1”

Провести оптимизацию функций умножения матриц,

основываясь на проведенном анализе

Page 5: Московский Физико-Технический Институт

Оптимизации функций умножения Оптимизации функций умножения матриц для матриц для ““Эльбрус-90Эльбрус-90 микромикро””

Разбиение матриц на блоки

Применение оптимизации unroll к исходным текстам

Устранение зависимостей между итерациями циклов

Использование последовательного чтения/записи из/в

память

Вынос нелинейных индексов массивов за пределы

цикла

Page 6: Московский Физико-Технический Институт

Разбиение матриц на блокиРазбиение матриц на блоки

Причины оптимизации:

- Отсутствие устройства предподкачки

- Размер L1$: 32kb

Решение:

- Поблочное умножение

*TRMM – Умножение треуг. матриц, GEMM – Умножение прямоуг. матриц

Page 7: Московский Физико-Технический Институт

for (i = 0; i < M - 3; i += 4) {  a0 = (eml_32f *) A; b1 = b0 + ldb; b2 = b1 + ldb; b3 = b2 + ldb;

for (j = 0; j < N; j++) { t0 = t1 = t2 = t3 = 0;  l = j; #pragma unroll (2) for (; l < K; l++) { t0 += b0[l] * a0[l * lda]; t1 += b1[l] * a0[l * lda]; t2 += b2[l] * a0[l * lda]; t3 += b3[l] * a0[l * lda]; }  C[j] += alpha * t0; C[ldc + j] += alpha * t1; C[2 * ldc + j] += alpha * t2; C[3 * ldc + j] += alpha * t3; a0 += 1; } C += 4 * ldc; b0 += 4 * ldb;}

for (i = 0; i < M - 3; i += 4) {  a0 = (eml_32f *) A; b1 = b0 + ldb; b2 = b1 + ldb; b3 = b2 + ldb;

for (j = 0; j < N; j++) { t0 = t1 = t2 = t3 = 0;  l = j; #pragma unroll (2) for (; l < K; l++) { t0 += b0[l] * a0[l * lda]; t1 += b1[l] * a0[l * lda]; t2 += b2[l] * a0[l * lda]; t3 += b3[l] * a0[l * lda]; }  C[j] += alpha * t0; C[ldc + j] += alpha * t1; C[2 * ldc + j] += alpha * t2; C[3 * ldc + j] += alpha * t3; a0 += 1; } C += 4 * ldc; b0 += 4 * ldb;}

Применение оптимизации Применение оптимизации unrollunroll к исходным к исходным текстам и последовательное обращение в памятьтекстам и последовательное обращение в память

Цели:- Устранение зависимостей за счет

применения оптимизации unroll к внешнему циклу

- Улучшение загрузки конвейера за счет независимости операций в цикле после оптимизации unroll

- Уменьшение количества запросов в память за счет многократного использования элементов матрицы

- Эффективное использование поблочной загрузки и записи в память

for (i = 0; i < M - 3; i += 4) {  a0 = (eml_32f *) A; b1 = b0 + ldb; b2 = b1 + ldb; b3 = b2 + ldb;

for (j = 0; j < N; j++) { t0 = t1 = t2 = t3 = 0;  l = j; #pragma unroll (2) for (; l < K; l++) { t0 += b0[l] * a0[l * lda]; t1 += b1[l] * a0[l * lda]; t2 += b2[l] * a0[l * lda]; t3 += b3[l] * a0[l * lda]; }  C[j] += alpha * t0; C[ldc + j] += alpha * t1; C[2 * ldc + j] += alpha * t2; C[3 * ldc + j] += alpha * t3; a0 += 1; } C += 4 * ldc; b0 += 4 * ldb;}

for (i = 0; i < M - 3; i += 4) {  a0 = (eml_32f *) A; b1 = b0 + ldb; b2 = b1 + ldb; b3 = b2 + ldb;

for (j = 0; j < N; j++) { t0 = t1 = t2 = t3 = 0;  l = j; #pragma unroll (2) for (; l < K; l++) { t0 += b0[l] * a0[l * lda]; t1 += b1[l] * a0[l * lda]; t2 += b2[l] * a0[l * lda]; t3 += b3[l] * a0[l * lda]; }  C[j] += alpha * t0; C[ldc + j] += alpha * t1; C[2 * ldc + j] += alpha * t2; C[3 * ldc + j] += alpha * t3; a0 += 1; } C += 4 * ldc; b0 += 4 * ldb;}

for (i = 0; i < M - 3; i += 4) {  a0 = (eml_32f *) A; b1 = b0 + ldb; b2 = b1 + ldb; b3 = b2 + ldb;

for (j = 0; j < N; j++) { t0 = t1 = t2 = t3 = 0;  l = j; #pragma unroll (2) for (; l < K; l++) { t0 += b0[l] * a0[l * lda]; t1 += b1[l] * a0[l * lda]; t2 += b2[l] * a0[l * lda]; t3 += b3[l] * a0[l * lda]; }  C[j] += alpha * t0; C[ldc + j] += alpha * t1; C[2 * ldc + j] += alpha * t2; C[3 * ldc + j] += alpha * t3; a0 += 1; } C += 4 * ldc; b0 += 4 * ldb;}

Page 8: Московский Физико-Технический Институт

Вынос нелинейных индексов за Вынос нелинейных индексов за пределы массивовпределы массивов

- Сокращение накладных расходов на пересчет индексов

for (l = 0; l < j; l++) { t0 += B[i * ldb + l] * A[j * lda + l]; t1 += B[(i + 1) * ldb + l] * A[j * lda + l]; t2 += B[(i + 2) * ldb + l] * A[j * lda + l]; t3 += B[(i + 3) * ldb + l] * A[j * lda + l]; }

for (l = 0; l < j; l++) { t0 += b0[l] * a0[l]; t1 += b1[l] * a0[l]; t2 += b2[l] * a0[l]; t3 += b3[l] * a0[l]; }

a0 = (eml_32f *) A;b0 = (eml_32f *) B;

b1 = b0 + ldb; b2 = b1 + ldb; b3 = b2 + ldb;

Итог: вместо 3х операций умножения выполняется 3 операции сложения

Page 9: Московский Физико-Технический Институт

Особенности архитектуры Особенности архитектуры ““Эльбрус-Эльбрус-33М1М1””, , существенные при проведении существенные при проведении

оптимизацийоптимизаций

Наличие векторных инструкций

Конвейеризация циклов

Асинхронный доступ к массивам

(наличие APB)

АЛУ: 2 кластера по 3 канала

Page 10: Московский Физико-Технический Институт

Оптимизации функций умножения Оптимизации функций умножения матриц для матриц для ““Эльбрус-3М1Эльбрус-3М1””

Разбиение матриц на блоки – нет необходимости из-за

наличия APB

Применение оптимизации unroll к исходным текстам

Устранение зависимостей между итерациями циклов

Использование последовательного чтения/записи из/в

память – нет необходимости из-за наличия APB

Использование векторных инструкций

Подбор состава операций для максимальной загрузки АЛУ

Page 11: Московский Физико-Технический Институт

Использование векторныхИспользование векторных инструкций инструкций и подбор состава операцийи подбор состава операций

Цели:

- Обработка нескольких элементов матрицы за такт

- Максимальная загрузка АЛУ

Проблемы:

- Необходимость выравнивания данных в памяти по границе 64х битных слов

t10 = alpha * A[(i + 1) * lda + l];

t11 = alpha * A[(i + 1) * lda + l + 1];

t12 = alpha * A[(i + 1) * lda + l + 2];

t13 = alpha * A[(i + 1) * lda + l + 3];

tmp10 = e3m_pshufh (*((eml_32s *) & t10), 0x44);

tmp11 = e3m_pshufh (*((eml_32s *) & t11), 0x44);

tmp12 = e3m_pshufh (*((eml_32s *) & t12), 0x44);

tmp13 = e3m_pshufh (*((eml_32s *) & t13), 0x44);

for (j = 0; j < N >> 1; j++) {

 

sC1[j] = e3m_pfadds (sC1[j], e3m_pfmuls (tmp10, sB0[j]));

sC1[j] = e3m_pfadds (sC1[j], e3m_pfmuls (tmp11, sB1[j]));

sC1[j] = e3m_pfadds (sC1[j], e3m_pfmuls (tmp12, sB2[j]));

sC1[j] = e3m_pfadds (sC1[j], e3m_pfmuls (tmp13, sB3[j]));

 

}

t10 = alpha * A[(i + 1) * lda + l];

t11 = alpha * A[(i + 1) * lda + l + 1];

t12 = alpha * A[(i + 1) * lda + l + 2];

t13 = alpha * A[(i + 1) * lda + l + 3];

tmp10 = e3m_pshufh (*((eml_32s *) & t10), 0x44);

tmp11 = e3m_pshufh (*((eml_32s *) & t11), 0x44);

tmp12 = e3m_pshufh (*((eml_32s *) & t12), 0x44);

tmp13 = e3m_pshufh (*((eml_32s *) & t13), 0x44);

for (j = 0; j < N >> 1; j++) {

 

sC1[j] = e3m_pfadds (sC1[j], e3m_pfmuls (tmp10, sB0[j]));

sC1[j] = e3m_pfadds (sC1[j], e3m_pfmuls (tmp11, sB1[j]));

sC1[j] = e3m_pfadds (sC1[j], e3m_pfmuls (tmp12, sB2[j]));

sC1[j] = e3m_pfadds (sC1[j], e3m_pfmuls (tmp13, sB3[j]));

 

}

Page 12: Московский Физико-Технический Институт

Результаты оптимизацийРезультаты оптимизаций

0

1

2

3

4

5

1024 16384 1048576

Эльбрус-3м

Неоптимизированная версияОптимизированная версияТеоретическое значение

010203040506070

1024 16384 1048576

Эльбрус-90

Неоптимизированная версияОптим. без разбиения на блокиОптим. с разбиением на блокиТеоретическое значение

Тактов/эл-т

Кол-во элементов матрицы

Тактов/эл-т

Кол-во элементов матрицы

Page 13: Московский Физико-Технический Институт

ЗаключениеЗаключение Оптимизированы функции умножения матриц:

умножение треугольных матриц различных конфигураций (слева – справа, верхнетреугольные – нижнетреугольные, транспонированные – не транспонированные) для различных типов данных (32F, 32FC, 64F, 64FC). Всего около 60 функций.

Проведено функциональное тестирование

Проведено измерение производительности

Получен прирост производительности в среднем в 2-4 раза по сравнению с изначальными алгоритмами библиотеки BLAS, не использующими особенности ВК “Эльбрус-90 микро” и “Эльбрус-3М1”