УДК 004.62
Винников В.В.12, Иваничкина Л.В.34
1 ООО «Акронис», г. Москва, Россия 2 Вычислительный центр им. А.А. Дородницына ФИЦ ИУ РАН, г. Москва, Россия
3 ООО «Проект Икс», г. Москва, Россия 4 Московскии Физико-техническии институт, МФТИ, г. Долгопрудный Россия
ПРОГРАММНО-АЛГОРИТМИЧЕСКАЯ РЕАЛИЗАЦИЯ КОДОВ РИДА-СОЛОМОНА ДЛЯ ПОЛЕЙ ГАЛУА ВЫСОКОГО ПОРЯДКА
АННОТАЦИЯ
В статье приводится оригинальный подход к программно-алгоритмической реализации кодов Рида—Соломона для систем хранения сверхбольших объемов данных. Сравниваются самые популярные алгоритмы алгебраических операций умножения над конечными полями, рассматриваются их преимущества и недостатки, зависящие от мощности алфавитов кодируемых сообщений. В работе показаны различия в требованиях к параметрам избыточного кодирования для систем помехоустойчивой передачи данных по каналам связи и систем долгосрочного надёжного хранения данных с отказоустойчивым доступом. Предложен алгоритм умножения, в котором подходы к быстрому умножению с помощью таблиц и методов «разделяй и властвуй» скомбинированы с целью достижения компромисса между объемом выделяемой оперативной памяти и количеством затрачиваемых арифметических операций. Приведено описание программной реализации алгоритма на языке C++ в виде листингов.
КЛЮЧЕВЫЕ СЛОВА
Конечные поля; поле Галуа; код Рида—Соломона, генерирующая матрица; матрица Вандермонда, алгоритм Монтгомери, алгоритм Карацубы.
Vinnikov V.V.12, Ivanichkina L.V.34
1 OOO Acronis, Moscow, Russia 2 Dorodnicyn Computing Centre of RAS, Moscow, Russia 3 OOO Project Iks, Moscow, Russia 4 Moscow Institute of Physics and Technology, Dolgoprudny, Russia
ALGORITHMIC AND SOFTWARE IMPLEMENTATION OF REED-SOLOMON ERASURE CODES FOR GALOIS FIELDS OF HIGH ORDER
ABSTRACT
This paper is concerned with the novel approach to algorithmic and software implementation of Reed-Solomon codes for super large data storage systems. We compare the most popular algorithms of multiplication over finite fields and consider their pros and cons depending on the alphabet power of messages to encode. This work emphasizes differences in the redundancy parameter requirements for erasure codes designed for either noise-resistant data transfer over communication channels or long term reliable data storing with fault-tolerant access. We propose the multiplication algorithm that combines table and "divide and conquer" approaches to fast multiplication to achieve a compromise between the volume of allocated random access memory and the number of required arithmetic operations. The paper provides the listings with C++ program implementation of the presented algorithm.
KEYWORDS
Finite fields; Galois Field; Reed-Solomon code; generator matrix; Vandermonde matrix, Montgomery multiplication, Karacuba multiplication.
Современные системы хранения данных (далее СХД) петабаитного объема включают в свои состав тысячи дисковых накопителеи. Подобная крупная популяция элементов подчиняется законам математическои статистики, а, следовательно, определенная доля дисков подвержена регулярному выходу из строя [1]. При этом, совокупная частота единичных и коллективных отказов растет с увеличением мощности множества задеиствованных жестких дисков. Предотвращение
необратимой потери данных достигается резервированием содержимого СХД с помощью добавления некоторои избыточности в исходныи набор данных. Распространены два варианта построения избыточности: резервное копирование (репликация) и помехоустоичивое кодирование блоков, занимающее меньше избыточного дискового пространства. Уровень надежности хранения определяется количеством полных копии (реплик) или параметрами кодирования. На практике широко используются (п, й)-коды Рида-Соломона (см, например, [2]), в которых входное сообщение из к символов алфавита мощностью q = 2Ш преобразуется в п символов из того же алфавита. Коды Рида—Соломона вносят минимально возможныи объем избыточности и обеспечивают максимальныи уровень помехоустоичивости.
При заданных значениях параметров их разность (п — к) определяет максимальное количество утраченных или искаженных символов, при котором из неповрежденных символов может быть восстановлено исходное сообщение. Подобное помехоустоичивое представление данных используется как при передаче, так и при хранении информационных сообщении. При этом, потоковая передача данных по каналам связи и блочное размещение данных на накопителях предъявляют различные требования к параметрам кодирования п и к.
Так, для потоковои передачи данных при внесении в сообщение пакета ошибок незначительно искажается серия информационных символов с неизвестным расположением, что требует большои величины (п — к) и алфавита малои мощности q~28, соответствующего однобаитовои (восьмибитнои) структуре данных. Кроме того, с целью сохранения эффективнои пропускнои способности канала необходимо ограничить накладные расходы на избыточность вида (п/к). Эти факторы определяют коды, общепринятые в коммуникационнои отрасли, например, стандарт DVB (Digital Video Broadcast) [3] с параметрами п = 204 и к = 188. Дополнительно, локализация априори неизвестных ошибок требует применения специальных вычислительно емких алгоритмов поиска искаженных символов внутри сообщения.
В свою очередь, надежное помехоустоичивое хранение данных требует размещения каждого символа (фрагмента) из закодированного сообщения (блока данных) на отдельном накопителе СХД, независимом от других устроиств хранения. В случае аппаратного отказа одного или нескольких дисков такая схема распределения данных приводит к необходимости обращения к априори известным исправным дискам при восстановлении блока и передачи доступных фрагментов по сети в узел декодирования. Поскольку каждое считывание и передача фрагмента затрачивают полезные ресурсы системы, количество подобных деиствии необходимо сократить, то есть использовать (п, й)-код с малыми значениями параметров к и п. При этом, для поддержания высокои производительности требуется сохранить битовую длину исходного сообщения за счет увеличения битовои длины фрагмента данных (мощности алфавита) до значении q~264 и выше.
Следует отметить, что типовая вычислительная техника ограничена машиннои арифметикои над целыми 64-разрядными числами. Согласно теории конечных полеи Галуа, вычислительная сложность алгебраических операции по модулю w значительно возрастает с увеличением w из-за согласования переносов разрядов между машинными словами, составляющими фрагмент блока данных. Растут также и затраты на хранение в памяти промежуточных результатов расчетов. Тем не менее, совершенствование вычислительнои техники, развитие теоретическои и прикладнои криптографии, а также накопление результатов численных экспериментов по конструктивному описанию полеи Галуа высокого порядка [4], дают возможность программно реализовать алгоритмы помехоустоичивого кодирования по схемам Рида—Соломона для фрагментов данных большого объема.
Согласно теории, коды Рида—Соломона одновременно принадлежат классам линеиных циклических блочных и полиномиальных кодов. Исходя из этого, представление кодов Рида— Соломона допускает две общепринятые интерпретации. В первои трактовке используется таблица многочленов степени меньше к над конечным полем порядка п, где п — степень простого числа. В процессе кодирования к входных символов рассматриваются как первыи сегмент таблицы многочленов степени меньше к. Теориеи гарантируется, что в таблице содержится единственныи многочлен, соответствующии этим к символам. Оставшиеся (п — к) символов определяются как значения этого многочлена в соответствующих (п — к) целочисленных точках. В этои схеме избыточность достигается за счет переопределенности системы, в которои количество уравнении превышает количество искомых переменных. На практике применяется более производительныи способ кодирования, когда к входных символов считаются коэффициентами многочлена рх степени меньше к, а дополнительные (п — к) символов являются полиномиальными коэффициентами произведения рх на циклическии генерирующии многочлен, определяемыи из таблиц неприводимых многочленов, например, [4]. Во второи трактовке вместо генерирующего многочлена используется генерирующая матрица размерностью кхп. Различают также
систематическии и несистематическии варианты кодов. В систематическом коде символы избыточности дописываются в конец исходного сообщения. Левая квадратная часть генерирующеи матрицы в этом случае представляет собои единичную матрицу. В несистематическом коде, исходя из структуры генерирующеи матрицы, итоговое закодированное сообщение может не содержать ни одного символа исходного сообщения. К преимуществам систематического кода относится тривиальное декодирование сообщения при отсутствии ошибок, а недостаток заключается в необходимости вычисления обратных матриц. Несистематическое кодирование требует нетривиального декодирования даже неискаженного сообщения, однако позволяет использовать легкообращаемые матрицы, например, инволютивные или ортогональные.
В настоящеи работе приведены примеры алгоритмическои и программнои реализации алгебраических операции, используемых в систематическом коде Рида—Соломона с генерирующеи матрицеи Вандермонда. Для программнои реализации этого кода на конечном поле Галуа с алфавитом мощностью q = 2Ш, ш > 64 были построены и запрограммированы алгоритмы сложения и умножения больших чисел по модулю 2Ш. На основе этих алгоритмов стоится генерирующая матрица размерностью кхп символов и производится кодирование путем умножения вектор-строки исходного сообщения из к символов на эту матрицу. Таким же образом реализовано декодирование, а именно: исключение из прямоугольнои матрицы (п — к) столбцов, соответствующих исключаемым позициям контрольных или утраченных символов в закодированном сообщении длины п, с последующим обращением полученнои квадратнои матрицы кхк и умножением сокращеннои закодированнои вектор-строки длины к на нее.
Основная вычислительная сложность всех алгоритмов кодирования с высокои мощностью алфавита q = 2Ш, ш > 64 вызвана вычислительными затратами на выполнение операции умножения над многобитовыми числами, представленными последовательностью машинных слов. Все известные методы перемножения двух больших чисел могут быть классифицированы по количеству затрачиваемых машинных операции. Так, классическии метод умножения в двоичнои системе счисления является наиболее затратным, несмотря на высокую скорость проведения индивидуальных операции сложения и битового сдвига машинных слов.
В наиболее производительном методе используется плоская таблица с результатами перемножения двух операндов. При условии, что таблица вычисляется однократно, метод будет задеиствовать лишь быстрые операции адресного считывания в памяти. Несмотря на простоту реализации, этот метод является исключительно требовательным к дорогостоящеи части выделяемых аппаратных ресурсов, поскольку таблица занимает 2шх2шх2а> бит в быстрои оперативнои памяти. При мощности алфавита q = 28 занимаемым таблицеи объем составит 128 КиБ, однако, при удвоении разрядности ш до мощности алфавита q = 216 в памяти потребуется выделить уже 8 ГиБ. Таким образом, прямое использование таблиц умножения для чисел разрядностью ш = 32 и выше, не представляется оправданным.
Используемые на практике методы перемножения длинных операндов построены на принципе «разделяи и властвуи». В основу этого принципа положена возможность представить множитель как сумму, в которои каждое слагаемое занимает свои диапазон разрядов. В этом случае искомое произведение может быть вычислено с использованием произведении слагаемых каждого из исходных операндов. При этом, при перемножении слагаемых меньшеи разрядности часто используется рекурсивныи вызов алгоритма до достижения разрядности машиннои арифметики. Первым представителем этого семеиства методов является алгоритм Карацубы [5] с использованием двух слагаемых на операнд. В развитие этого метода были предложены обобщающие методы с многократным расщеплением, такие как метод Тума—Кука [6]. Академическое признание также получили методы умножения, использующие преобразование Фурье, такие как алгоритмы Шенхаге — Штрассена [7] и Фюрера [8]. Эти методы имеют наименьшую асимптотическую алгоритмическую сложность, однако, превосходство над алгоритмом Тума—Кука достигается лишь, начиная с чисел порядка 221 —22", что существенно ограничивает область практического применения. Кроме того, эффективная программная реализация методов на основе преобразования Фурье требует перехода от арифметики комплексных чисел к специальному теоретико-числовому преобразованию (Number-theoretic transform) в конечном поле.
В своих первоначальных вариантах большинство методов умножения больших чисел используют арифметику на множестве целых чисел. Исходя из этого, непосредственное использование методов типа Тума-Кука в алгоритмах кодирования в значительнои степени ограничено и допустимо лишь на промежуточных уровнях рекурсии, не требующих операции взятия остатка по модулю. Иными словами, результат перемножения двух операндов разрядностью ш лежит в пределах разрядности 2ш, что влечет необходимость дополнительного деления
результата по модулю 2Ш. Эта дополнительная операция в случае массового применения также является вычислительно затратной, поэтому на практике в качестве метода умножения по модулю 2Ш используется метод Монтгомери [9].
В методе Монтгомери символ а алфавита в поле представляется многочленом
длины швида
ш-1
а(х) = ^ а^х1 = аы_1хш~1 + аы_2хш~2 + ... + агх + а0, 1=0
где коэффициенты а1 являются бинарными, а1 £ С^1 (2). Эти же коэффициенты составляют битовую запись символа а:
а = (аш-1аш-2 "■ я1а0).
Дополнительно, символ а допускает блочное описание последовательностью из 5 машинных слов Аразрядностью ш (ш =
а = С^-^-г = (а/(№+1)-1а/(№+1)-2 "а/№+1а/ш).
В этом случае, полиномиальные представления символа а и машинного слова примут
вид:
i(x) = ^Ai(x)xiw = As_±(x)x(s~1)w + As_2(x)x(s~2)w + ... + A±(x)xw + A0(x), 1=0
w-l
Aj(x) = ^^ ajw+ixi = ajw+(w-l)xW 1 + ajw+(w-2)xW 2 + ..■ + ajw+lx + aj\
JW"
T^o
Если представить второи множитель символом b из того же алфавита:
b = (BS_1BS_2 ■■■B1B0),
то псевдокод алгоритма Монтгомери из работы [9] может быть представлен следующеи программнои реализациеи на языке С++ (см. листинг 1).
Листинг 1. Функция перемножения длинных чисел в поле Галуа по алгоритму Монтгомери для w = 32.
union UIntGF2XT{ private:
uint8_t u08[UIntGF2XTu08LEN];
uint16_t u16[UIntGF2XTu16LEN]
uint32_t u32[UIntGF2XTu32LEN] uint64_t u64[UIntGF2XTu64LEN] public:
friend const UIntGF2XT MULGF2(UIntGF2XT A, const UIntGF2XT& B); friend void GenAndInvPolyN32(UIntGF2XT& polyN,uint32_t& polyNinv);}; const (UIntGF2XT A, const UIntGF2XT& B){ uint32_t i, j, H, L, P, M;
uint32_t C[UIntGF2XTu32LEN],N[UIntGF2XTu32LEN],Caux,Ninv0; std: :fill(C,C+UIntGF2XTu32LEN, '\0'); Caux = 0ULL;
GenAndInvPolyN32(&N,&Ninv0);
for(i = 0; i < UIntGF2XTu32LEN; i++){
for(j = 0; j < UIntGF2XTu32LEN - 1; j++){ MULGF2_32(H, L, A.u32[j], B.u32[i]); C[j] л= L; C[j+1] л= H;} MULGF2_32(H, L, A.u32[j], B.u32[i]); C[j] л= L; Caux л= H;
MULGF2_32(H, M, C[0], NinvO); MULGF2_32(P, L, M, N[0]); for(j = 1; j < UIntGF2XTu32LEN; j++){ MULGF2_32(H,L,M,N[j]); C[j-1] = C[j] л L л P; P = H;}
C[j-1] = Caux л P л M;//j = UIntGF2XTu32LEN Caux = 0U;}
std::copy(C,C+UIntGF2XTu32LEN,A.u32); return A;}
В этом листинге константа uintGF2XTu32LEN соответствует количеству s машинных слов разрядностью w = 32. Массив N [uintGF2XTu32LEN] представляет собои неприводимыи многочлен
степени 2Ш в поле GF(2), а машинное слово Ninv0 является обратным многочленом к N[0].
Как видно из листинга 1, в качестве основнои алгебраическои операциеи используется функция умножения mulgf2_32 (). Эта функция реализует улучшенным алгоритм Карацубы без рекурсии, представленным в работе [10] (см. листинг 2).
Листинг 2. Функция перемножения 32-разрядных чисел в поле Галуа по алгоритму Карацубы. uint64_t MULGF2_32(uint32_t& H, uint32_t& L, uint32_t A, uint32_t B){
uint16_t AH, AL, BH, BL;
uint32_t Z0,Z1,Z2; uint64_t AB, ZZ; // A = AH*Bm + AL // B = BH*Bm + BL // Bm = 2Л16 // Z0 = AL*BL // Z1 = (AH-AL)*(BH-BL) // Z2 = AH*BH
// AB = (BmA2+Bm)*Z2 - Bm*Z1 + (Bm+1)*Z2
AH = (uint16_t) (A >> 16);
AL = (uint16_t) (A & 0x0000FFFF) ;
BH = (uint16_t) (B >> 16);
BL = (uint16_t) (B & 0x0000FFFF);
Z0 = MULGF2_16(AL, BL) Z2 = MULGF2_16(AH, BH) if(AH >= AL){ AH -= AL; } else{ AH = AL - AH; } if(BH >= BL){ BH -= BL; } else{ BH = BL - BH; } Z1 = MULGF2_16(AH, BH); ZZ = ((uint64_t) Z2);
AB = ( ZZ + ((uint64_t) Z0) ) - ((uint64_t) Z1); AB <<= 16;
AB += ( ZZ << 32 ) + ((uint64_t) Z0); H = (uint32_t) (AB >> 32); L = (uint32_t) (AB & 0x00000000FFFFFFFF); return AB;}
Функция возвращает 64-разрядныи результат перемножения двух 32-разрядных машинных слов, а также отдельные верхнее и нижнее 32-разрядные слова результата. Как видно из листинга, в программнои реализации алгоритма Карацубы функциеи mulgf2_1 6 () перемножаются 16-разрядные машинные слова согласно следующим выражениям:
А = 216АН +АЬ, В = 216ВН + BL, Z2 = АНВН, Z± = (Ан — АЬ)(ВН — BL), Z0 = АЬВЬ, AB = (232 + 216)Z2 — 2Х% + (216 + 1)Z0. Поскольку разрядность этих машинных слов невелика, в общем случае наиболее производительным решением является применение таблиц умножения [10], соответствующих правилу:
(А2 + В2 — (А — В)2)
АВ = ----—.
2.
Подобные таблицы хранят только искомые квадраты значении величины и позволяют сократить используемыи объем памяти с 2ых2ых2ш бит до 2шх2ш. Реализация функции перемножения 16-разрядных машинных слов приведена в листинге 3.
Листинг 3. Функция табличного перемножения 16-разрядных чисел в поле Галуа.
uint32_t LUT16[sz16x2]; void CreateLUT16(){ uint32_t i;
LUT16[0] = (uint32_t)0;
for(i = 0; i < sz16x2-1; i++){
LUT16[i+1] = LUT16[i] + 2*i + 1;}
}
inline uint32_t MULGF2_16(uint16_t A, uint16_t B) {
uint32_t AsubB, Asqr, Bsqr, AsubBsqr; uint32_t AB; Asqr = LUT16[A]; Bsqr = LUT16[B] ;
if(A>=B) {
AsubB = A - B;
AsubBsqr = LUT16[AsubB];
AB = (((Asqr - AsubBsqr) >> 1) + ((Bsqr + 1) >> 1));
}
else {
AsubB = B - A; AsubBsqr = LUT16[AsubB];
AB = (((Bsqr - AsubBsqr) >> 1) + ((Asqr +1) >> 1));
}
return AB;
}
Таким образом, в работе приведена оригинальная программная реализация наиболее вычислительно емких алгоритмов, используемых в методе кодирования Рида—Соломона. Показано, что можно наити компромиссныи вариант алгоритма умножения в поле Галуа, использующии как таблицы для операндов малои разрядности, так и методы умножения Карацубы для операндов высокои разрядности. Подобныи подход к вычислению произведении множителеи позволяет построить коды Рида—Соломона в конечных полях с алфавитами большои мощности, подходящие под требования для создания систем хранения данных, устоичивых к сбоям и ошибкам в накопителях.
Работа проведена в рамках выполнения прикладных научных исследований при финансовой поддержке Министерства образования и науки Российской Федерации. Соглашения о предоставлении субсидий № 14.579.21.0010. Уникальный идентификатор Соглашения RFMEFI57914X0010.
Литература
1. Ivanichkina L. Computer Simulator of Failures in Super Large Data Storage / L. Ivanichkina, A. Neporada // Contemporary Engineering Sciences. - 2015. - Т. 8. - № 28. - C. 1679-1691.
2. Ivanichkina L. Mathematical methods and models of improving data storage reliability including those based on finite field theory / L. Ivanichkina, A. Neporada // Contemporary Engineering Sciences. - Т. 7. -№ 28. - 2014. - C. 1589 - 1602.
3. ETSI EN 300 744 V1.6.1 (2009-01) Digital Video Broadcasting (DVB); Framing structure, channel coding and modulation for digital terrestrial television // European Standard (Telecommunications series). - 2009. - 66 С.
4. Seroussi G. Table of low-weight binary irreducible polynomials. - Hewlett-Packard Laboratories, 1998.
5. Карацуба А. А., Офман Ю. П. Умножение многозначных чисел на автоматах //ДАН СССР. - 1961. - Т. 145. - № 2. - С. 293-294.
6. Toom A. L. The complexity of a scheme of functional elements realizing the multiplication of integers //Soviet Mathematics Doklady. - 1963. - Т. 3. - №. 4. - С. 714-716.
7. Schonhage D. D. A., Strassen V. Schnelle multiplikation grosser zahlen //Computing. - 1971. - Т. 7. - № 3-4. - С. 281-292.
8. Furer M. Faster integer multiplication //SIAM Journal on Computing. - 2009. - Т. 39. - № 3. - С. 979-1005.
9. Koc C. K., Acar T. Montgomery multiplication in GF (2k) //Designs, Codes and Cryptography. - 1998. - Т. 14. - № 1. - С. 5769.
10. Wang B. F., Chen C. L., Chen G. H. A simple approach to implementing multiplication with small tables //Information Processing Letters. - 1991. - Т. 37. - № 6. - С. 327-329.
References
1. Ivanichkina, L., and Neporada, A. (2015). Computer Simulator of Failures in Super Large Data Storage. Contemporary Engineering Sciences.-2015.-8 (28).-C, 1679-1691.
2. Ivanichkina, L., and Neporada, A. (2014). Mathematical methods and models of improving data storage reliability including those based on finite field theory. Contemporary Engineering Sciences, 7(28), 1589-1602.
3. ETSI EN 300 744 V1.6.1 (2009-01) Digital Video Broadcasting (DVB); Framing structure, channel coding and modulation for digital terrestrial television // European Standard (Telecommunications series), 66 p.
4. Seroussi, G. (1998). Table of low-weight binary irreducible polynomials. Hewlett-Packard Laboratories.
5. Karacuba, A. A. (1975). Berechnungen und die Kompliziertheit von Beziehungen. Elektronische Informationsverarbeitung Kybernetik, 11, 603-606.
6. Toom, A. L. (1963, June). The complexity of a scheme of functional elements realizing the multiplication of integers. In Soviet Mathematics Doklady (Vol. 3, No. 4, pp. 714-716).
7. Schonhage, D. D. A., and Strassen, V. (1971). Schnelle multiplikation grosser zahlen. Computing, 7(3-4), 281-292.
8. Furer, M. (2009). Faster integer multiplication. SIAM Journal on Computing, 39(3), 979-1005.
9. Koc, C. K., and Acar, T. (1998). Montgomery multiplication in GF (2k). Designs, Codes and Cryptography, 14(1), 57-69.
10. Wang, B. F., Chen, C. L., and Chen, G. H. (1991). A simple approach to implementing multiplication with small tables. Information Processing Letters, 37(6), 327-329.
Поступила: 14.10.2016
Об авторах:
Винников Владимир Владимирович, технический писатель ООО «Акронис», старший научный сотрудник отдела вычислительной физики Вычислительного центра им. А.А. Дородницына Федерального исследовательского центра «Информатика и управление» Российской академии наук, кандидат физико-математических наук, [email protected];
Иваничкина Людмила Владимировна, аспирант факультета управления и прикладной математики Московского физико-технического института, старший разработчик ООО «Проект Икс».