понедельник, 21 июня 2021 г.

GF2p8 Аффинные преобразования (ч. 7)

Произведение матриц 8x8 бит

Инструкция аффинных преобразований gf2p8affine -- векторная. Аргументом является вектор элементов 64 бит, состоящий из матриц и вектор состоящий из октетов 8x8бит, над которыми выполняется преобразование. Мы хотим использовать эту инструкцию для перемножения матриц 8x8. Произведение матриц позволяет вычислять матрицы аффинного преобразования. В прошлом сообщении было показано, как выполнять транспонирование матриц. Операция аффинного преобразования обладает некоторой симметрией аргументов, которая позволяет менять аргументы местами при условии транспонирования.

gf2p8affine(A,B) = A·BT
gf2p8affine(A,BT) = A·B
gf2p8affine(AT,B) = (B·A)T= AT·BT

Чтобы инструкция gf2p8affine выдавала произведение матриц необходимо транспонировать второй аргумент.

// Произведение матриц A,B 8x8 бит
__m128i m_mul(__m128i A, __m128i B) {
	const __m128i E = _mm_set1_epi64x(0x0102040810204080);
	B = _mm_gf2p8affine_epi64_epi8(E, B, 0);// транспонирование
	A = _mm_gf2p8affine_epi64_epi8(A, B, 0);
	return A;
}

Результатом работы функции - произведение матриц A·B. Каждый аргумент состоит из двух матриц 8x8 по 64 бит, тип uint64x2_t. Параллельно можно выполнить два умножения матриц, независимо. Результат содержит две матрицы 8x8. Аналогично, при использовании инструкции 512 бит (_mm512_gf2p8affine_epi64_epi8), в результате получаем вектор uint64x8_t -- восемь матриц.

Комментариев нет:

Отправить комментарий