Опыт использования технологии CUDA для реализации...

21
3 ТЕХНИКА РАДИОСВЯЗИ Выпуск 1 (21) 2014 УДК 621.391:681.3 ОПЫТ ИСПОЛЬЗОВАНИЯ ТЕХНОЛОГИИ CUDA ДЛЯ РЕАЛИЗАЦИИ ТУРБОДЕКОДЕРА © В.С. Виноградов, В.В. Коробицын, Д.П. Монастыренко, М.Н. Московцев, Д.О. Пукса, Ю.В. Романов Приведены результаты сравнения производительности многопоточной реали- зации декодера турбокода на базе процессоров Intel и графических процессоров nVidia выпуска 2010–2013 гг . Показано, что внутри одного поколения и ценовой категории процессоров использование технологии CUDA позволяет получить вы- игрыш по быстродействию в 3…10 раз относительно центрального процессора. Определены факторы, ограничивающие область применения технологии CUDA при реализации турбодекодера. Ключевые слова: турбокод, турбодекодер, помехоустойчивость, параллель- ные вычисления, многопоточность, CUDA, GPU, nVidia. USAGE EXPERIENCE OF CUDA TECHNOLOGY FOR TURBODECODER REALIZATION © V.S. Vinogradov, V.V. Korobizyn, D.P. Monastyrenko, M.N. Moskovtsev, D.O. Puksa, Yu.V. Romanov The results of efficiency comparison of multiple-stream realization of turbocode decoder on the base of Intel and graphic processors nVidia 2010-2013 are presented. It was shown that inside of one generation and pricing policy of processors the usage of CUDA technology allows to have speed 3...10 times in comparison with center processor. The factors, limiting application field of CUDA technology by turbodecoder realization were defined. Keywords: turbocode, turbodecoder, error correction, parallel computing, multiple-stream, CUDA, GPU, nVidia. Введение Современная аппаратура радиосвязи строится по технологии SDR (software-defined radio – программно-определяемое радио), что обусловливает широкое использование методов цифровой обработки сигналов (ЦОС). Рост производительности аппаратных платформ позволяет использовать все более совершенные и требовательные к ресурсам алгоритмы обработки сигналов. Тур- бодекодеры, используемые в радиомодемах, относятся именно к такой катего- рии алгоритмов. При реализации единичных КВ-радиомодемов с полосой 3100 Гц, исполь- зующих турбодекодер, могут применяться стандартные вычислительные плат- формы (CPU ПЭВМ, цифровые сигнальные процессоры, ПЛИС). Современной тенденцией в области КВ-радиомодемов является расширение полосы сигнала [1], что повышает требование к производительности аппаратной платформы ра-

Transcript of Опыт использования технологии CUDA для реализации...

3

ТЕХНИКА РАДИОСВЯЗИ Выпуск 1 (21) 2014 УДК 621.391:681.3

ОПЫТ ИСПОЛЬЗОВАНИЯ ТЕХНОЛОГИИ CUDA ДЛЯ РЕАЛИЗАЦИИ ТУРБОДЕКОДЕРА

© В.С. Виноградов, В.В. Коробицын, Д.П. Монастыренко, М.Н. Московцев, Д.О. Пукса, Ю.В. Романов

Приведены результаты сравнения производительности многопоточной реали-зации декодера турбокода на базе процессоров Intel и графических процессоров nVidia выпуска 2010–2013 гг. Показано, что внутри одного поколения и ценовой категории процессоров использование технологии CUDA позволяет получить вы-игрыш по быстродействию в 3…10 раз относительно центрального процессора. Определены факторы, ограничивающие область применения технологии CUDA при реализации турбодекодера.

Ключевые слова: турбокод, турбодекодер, помехоустойчивость, параллель-ные вычисления, многопоточность, CUDA, GPU, nVidia.

USAGE EXPERIENCE OF CUDA TECHNOLOGY

FOR TURBODECODER REALIZATION

© V.S. Vinogradov, V.V. Korobizyn, D.P. Monastyrenko, M.N. Moskovtsev, D.O. Puksa, Yu.V. Romanov

The results of efficiency comparison of multiple-stream realization of turbocode decoder on the base of Intel and graphic processors nVidia 2010-2013 are presented. It was shown that inside of one generation and pricing policy of processors the usage of CUDA technology allows to have speed 3...10 times in comparison with center processor. The factors, limiting application field of CUDA technology by turbodecoder realization were defined.

Keywords: turbocode, turbodecoder, error correction, parallel computing, multiple-stream, CUDA, GPU, nVidia.

Введение Современная аппаратура радиосвязи строится по технологии SDR

(software-defined radio – программно-определяемое радио), что обусловливает широкое использование методов цифровой обработки сигналов (ЦОС). Рост производительности аппаратных платформ позволяет использовать все более совершенные и требовательные к ресурсам алгоритмы обработки сигналов. Тур-бодекодеры, используемые в радиомодемах, относятся именно к такой катего-рии алгоритмов.

При реализации единичных КВ-радиомодемов с полосой 3100 Гц, исполь-зующих турбодекодер, могут применяться стандартные вычислительные плат-формы (CPU ПЭВМ, цифровые сигнальные процессоры, ПЛИС). Современной тенденцией в области КВ-радиомодемов является расширение полосы сигнала [1], что повышает требование к производительности аппаратной платформы ра-

4

диомодемов. Высокопроизводительные вычислительные платформы необходи-мы и при построении узловых КВ радиоцентров, где требуется одновременное обслуживание десятков и сотен каналов приема одновременно.

В 2004 г. группа энтузиастов из Стэнфордского университета продемон-стрировала возможность создания на базе видеокарты nVidia вычислителя, пре-восходящего по производительности существующие на тот момент центральные процессоры семейства Intel Pentium 4 [2]. Этот результат стал возможным бла-годаря существенно большему количеству вычислительных ядер графических процессоров (GPU) по сравнению с CPU.

В 2006 г. компания nVidia впервые продемонстрировала технологию CUDA (Compute Unified Device Architecture – программно-аппаратная архитек-тура параллельных вычислений), а в феврале 2007 г. был представлен фирмен-ный комплект средств разработки для реализации параллельных вычислений на базе видеокарт – CUDA SDK [3].

Параллельные вычисления на базе видеокарт поддерживает и второй ли-дер этого рынка – AMD, но в Омском НИИ приборостроения получила распро-странение технология CUDA, что в совокупности с имеющимся опытом обусло-вило выбор данной платформы совместной с ОмГУ им. Ф.М. Достоевского ла-бораторией параллельных вычислений и математического моделирования.

Преимущество технологии CUDA при решении ряда задач обусловило пере-ход ее в разряд промышленных с созданием соответствующей профессиональной аппаратной платформы – nVidia Tesla. Вычислители nVidia Tesla отличаются от бы-товых видеокарт с поддержкой технологии CUDA большей надежностью, произво-дительностью и объемом памяти, что позволяет осуществлять на их базе математи-ческие расчеты в течение нескольких суток без сбоев и зависаний.

Количество CUDA-ядер современных вычислителей Tesla составляет по-рядка 3000 [4]. Для сравнения: количество ядер наиболее производительных серверных процессоров Intel Xeon E7 не больше 15 [5], при этом выигрыш про-цессоров Xeon по тактовой частоте не превышает 4 раз.

Преимуществом вычислительных систем, построенных на платформе Tesla, является бóльшая энергетическая и экономическая эффективность по сравнению с системами на основе ЦПУ типа Intel Xeon. Выигрыш достигается за счет использования большого числа ядер с умеренной тактовой частотой. Мно-гоядерность уже долгие годы является ключевой тенденцией развития вычисли-тельной техники [6], достигаемое за счет нее преимущество в производительно-сти GPU иллюстрируется рисунком 1 [7].

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

5

Рис. 1. Динамика роста производительности CPU и GPU (по вертикальной оси указана производительность в GFLOPS

в логарифмическом масштабе)

1. Модель системы передачи данных по каналу связи При сопоставлении различных помехоустойчивых кодов и методов их де-

кодирования анализ нередко проводят для модели канала с постоянными пара-метрами и аддитивным белым гауссовым шумом (АБГШ), при этом в качестве сигнала используют двоичную фазовую телеграфию. Воспользуемся данным распространенным подходом для сопоставления полученных в ходе работы ре-зультатов с общепризнанными.

2. Турбокодер. Одним из наиболее востребованных в настоящем классов помехоустойчивых кодов является класс турбокодов, что объясняется наличием методов декодирования, позволяющих при приемлемых вычислительных затра-тах приблизиться к границе Шеннона, т.е. к теоретическому пределу помехо-устойчивости [8]. Cхема параллельного турбокодера (рис. 2) включает два ком-понентных кодера, перемежитель и мультиплексор.

Рис. 2. Cхема параллельного турбокодера

В качестве компонентных кодов часто используются рекурсивные систе-матические сверточные коды (Recursive Systematic Convolutional, RSC). В случае с компонентными RSC-кодерами символы входного потока передаются напря-мую в выходной поток: систематические биты, биты выходных потоков кодеров – паритетные биты.

6

Компонентные сверточные кодеры описываются с использованием циф-рового представления, определяющего позиции выводов между сдвиговыми ре-гистрами для каждого выходного потока. Обычно применяется пара чисел в восьмеричной системе вида (прямой выход, рекурсивный выход). Например, кодер, показанный на рис. 3, описывается как (17, 15)8, где рекурсивный выход – поток битов, образующий положительную обратную связь с кодируемым пото-ком битов, и прямой выход – поток битов, непосредственно передаваемых на выход декодера, без обратной связи с входным потоком.

Мультиплексор размещает биты трех выходов в один выходной поток би-тов, чередуя их в следующем порядке: сначала первый бит систематический, первый бит из паритетных битов № 1 и первый бит из паритетных битов № 2, затем вторые биты, третий и т. д.

Рис. 3. Схема рекурсивного систематического сверточного кодера (17, 15)8 3. Общая схема турбодекодера. Структура турбодекодера включает де-

мультиплексор, два компонентных декодера, соединенных через перемежитель и деперемежитель (рис. 4).

Рис. 4. Схема турбодекодера

На вход декодера поступает поток отсчетов, полученных из канала связи после демодуляции. Отсчеты представлены вещественными значениями, припи-санными принятым символам. Демультиплексор разделяет поток входных отсче-тов на три потока: систематические биты, паритетные биты № 1, паритетные биты №2, – выбирая для каждого по одному отсчету из трех последовательно идущих. Каждый компонентный декодер имеет три входных потока: поток систематиче-ских битов, поток паритетных битов и поток от другого компонентного декодера. Значения выходных потоков каждого из компонентных декодеров представлены «мягкими» оценками. Эти оценки, в свою очередь, представлены вещественными числами, определяющими своим знаком ожидаемое значение, 0 или 1 для каждого

7

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

Турбодекодер работает итеративно. На первой итерации первый компо-нентный декодер принимает на вход поток битов, полученных из канала связи, соответствующих первому кодеру из турбокодера. Так как это первая итерация, значения априорной информации неизвестны, и они игнорируются или прини-маются равными нулю. «Мягкий» выход, предоставляемый первым декодером, используется для вычисления внешней информации, используемой в качестве априорной для второго декодера. Далее второй компонентный декодер оценива-ет биты, основываясь уже на информации, полученной из канала связи, соответ-ствующей второму кодеру, а также априорной информации, предоставляемой первым декодером. Далее происходит вторая итерация. Первый декодер снова получает поток битов из входного канала связи, дополняя его априорной ин-формацией от выхода второго декодера на предыдущей итерации. Как и раньше, второй декодер получает априорную информацию от первого и дополняет ее паритетными битами из канала связи. Этот цикл продолжается до тех пор, пока не будет выполнен определенный критерий, например достигнуто фиксирован-ное число итераций. На каждой итерации повышается достоверность принимае-мых решений, но с ростом числа итераций снижается производительность тур-бодекодера. Когда итеративный процесс окончен, ожидаемая последователь-ность принимается на выходе второго декодера.

Алгоритм декодирования, используемый в каждом компонентном декодере, должен предоставлять на выходе «мягкие» биты. Подходящими алгоритмами деко-деров являются: алгоритм максимальной апостериорной вероятности (Maximum A-Posteriori, MAP) и алгоритм Витерби с «мягким» выходом (Soft Output Viterbi Algorithm, SOVA). В дополнение к MAP-алгоритму существуют упрощенные вари-анты Log-MAP и Max-Log-MAP. В данной работе использован алгоритм Log-MAР.

4. Параллельная реализация турбодекодера 4.1. Общая схема реализации. Для обеспечения параллельной обработки

сообщение перед отправкой разбивается на блоки одинаковой длины N бит. При кодировании эти блоки кодируются независимо друг от друга, что позволяет декодировать их параллельно. Кроме того, алгоритм декодирования при вычис-лении γ-вероятностей можно распараллелить на S×N потоков, где S – число со-стояний кода (глубина кода). Распараллеливание осуществляется по сетке трел-лиса по количеству состояний S и количеству бит N в блоке. Однако нельзя рас-параллелить вычисление α- и β-вероятностей (метрики прямого и обратного прохода) более чем на S потоков. Это обусловлено неразрешимой внутренней рекуррентной зависимостью. Значение α-вероятностей для (n+1)-го бита зависит в явном виде от значения n-го бита, и вывести формулу для n-го элемента в зависи-мости от нулевого невозможно. Аналогично при вычислении β-вероятностей значе-ние для (n–1)-го бита зависит от n-го. Поэтому при вычислении α- и β-вероятностей максимальное количество параллельных потоков не может превышать числа S. Возможно реализовать части алгоритма, не связанные с вычислением α- и β-вероятностей, параллельно в S×N потоках, а связанные – в S потоках. Тогда для

8

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

Как показала практика, применение нескольких функций ядер для вычис-лений с разными конфигурациями для этапов алгоритма на GPU неэффективно. Создание и запуск функции ядра на GPU требует затрат времени, которые ниве-лируют выигрыш от параллельного вычисления γ-вероятностей. Вычисление N значений вероятностей в одном потоке происходит быстрее, чем завершение одного вычислительного процесса и запуск другого. Выгоднее создать S пото-ков, которые будут работать параллельно на протяжении всей процедуры деко-дирования. Именно так и предлагается делать.

Использование графического процессора для декодирования одного со-общения, даже большóго, оказывается неэффективным. Поскольку количество потоков не превышает числа состояний декодера S (типично принимающего значения 4, 8 или 16), такой подход не позволяет обеспечить полную загрузку GPU, имеющего сотни и тысячи потоковых процессоров. Соответственно, для полной загрузки GPU необходимо передавать в него несколько блоков данных одновременно. Количество передаваемых одновременно блоков данных B зави-сит от конкретной конфигурации GPU (количества поточных процессоров, P) и количества состояний декодера S: B ≤ P/S. Согласно приведенной конфигурации ядра (B блоков в сетке), каждый блок потоков обрабатывает одно сообщение. Количество потоков в одном блоке равно числу состояний декодера S. Выигрыш от параллельной обработки сообщения большой длины на GPU получится, если сообщение можно разбить на большое количество независимых блоков, которые будут обрабатываться параллельно. Только так можно обеспечить максималь-ную загрузку GPU и получить высокую скорость декодирования.

При использовании в качестве вычислителя платформы, построенной на основе CPU в качестве управляющего процессора и GPU в качестве вычисли-тельного сопроцессора (математического ускорителя), алгоритм работы с моду-лем турбодекодера имеет следующие этапы:

1) начальные установки, выделение памяти, копирование вспомогатель-ных массивов (все, что не связано с сообщением), в целях оптимизаций в реали-зации используются очереди задач и асинхронные функции;

2) копирование М сообщений длины N из CPU в GPU, при этом все блоки должны быть объединены в единый массив для ускорения процесса;

3) запуск на GPU ядра декодера с конфигурацией: размер сетки = B, раз-мер блока = S;

4) копирование декодированных сообщений на CPU; 5) освобождение памяти GPU (декодер больше не нужен). Первый и последний этапы не связаны с обработкой конкретного сообще-

ния, поэтому выполняются единожды во время инициализации и удаления мо-дуля турбодекодера. Этапы с 2-го по 4-й показывают традиционный способ ра-боты с GPU при использовании технологии CUDA – GPU применяется в каче-стве вычислительного сопроцессора.

Декодер получает на вход блоки отсчетов одинаковой длины 3×N, пред-ставляющих оценки принятых символов (вещественные числа), приписанных систематическим и паритетным битам исходного сообщения. Задачей декодера является восстановление исходной информации объемом N бит.

9

4.2. Данные, используемые турбодекодером. При декодировании на GPU необходимо передавать данные с CPU на GPU, что обычно является «узким» местом в повышении производительности вычислительных программ с исполь-зованием GPU. Кроме того, объем памяти GPU, как правило, меньше объема ОЗУ компьютера. По этим двум причинам очень важно точно рассчитать требу-емый объем памяти для программы декодирования на GPU.

Все используемые данные можно разделить на четыре группы: параметры кодека, входные данные, выходные данные, промежуточные данные декодиро-вания. В определении данных используются следующие параметры: S – количе-ство состояний кодера, M – количество блоков задержки кодера (S=2M), N – длина блока данных.

Перечислим все группы данных. 1 Параметры кодека вычисляются до начала передачи и должны быть

инициализированы до начала декодирования. В эту группу входят следующие массивы (в квадратных скобках указаны размерности массивов, после двоето-чия – тип данных):

• output[2][S]: bool – выходы кодера; • fromstate[2][S]: unsigned int – предыдущие состояния; • tostate[2][S]: unsigned int – следующие состояния; • intarray[N]: unsigned int – перестановки перемежителя; • deintarray[N]: unsigned int – обратные перестановки перемежителя. 2. Входные данные передаются декодеру из канала (после демодулятора).

В эту группу входят массивы: • mesg[B][2][N]: float – полученные отсчеты систематических битов; • parity[B][2][N+M]: float – полученные отсчеты паритетных битов; • trail[B][2][M]: float – вспомогательные биты для получения состояния ко-

дера, при котором все регистры заполнены нулями. 3. Выходные данные передаются приемнику после декодирования. В эту

группу входит массив: • mesg[B][2][N]: float – декодированное сообщение в виде «мягких» оценок. 4. Промежуточные данные декодирования используются для реализации

итеративного декодирования по методу максимума апостериорной вероятности. В эту группу входят массивы:

• a[B][N+M][S]:float – α-вероятности; • b[B][N+M][S]: float – β-вероятности; • L[B][2][N+M]: float – LLR- оценки битов сообщения; • gamma[B][2][N+M][S]: float – γ-вероятности; • gammaE[B][2][2][N+M][S]: float – γE-вероятности.

Здесь используются следующие обозначения типов данных: • bool – одиночные биты в представлении двоичных чисел (1 байт); • unsigned int – целые числа разрядностью 32 бита (4 байта); • float – числа с плавающей точкой в формате IEEE 754-2008 (4 байта). Приведем расчет необходимого объема памяти для размещения данных

при декодировании B блоков: 1) параметры кодека объемом 18·S + 8·N + 36 байт. Постоянный объем па-

мяти в 36 байт выделяется под структуры данных;

10

2) входные/выходные данные объемом 16·(N+M) байт; 3) промежуточные данные объемом 8·(N+M)·B·(4·S + 1) байт. Общий объем требуемой памяти составляет R = 18·S+8·N+36+8·B·(2·N+(N+M)·(4·S+1)) байт. Объем требуемой памяти на GPU растет линейно с увеличением длины

блока (рис. 5). На рисунке приведена кривая роста объема требуемой памяти, необходимой для декодирования одного блока сообщения. Зная объем свобод-ной памяти устройства, можно определить количество блоков, которые можно разместить в памяти устройства, и выполнять декодирование одновременно.

Рис. 5. Зависимость объема требуемой памяти R от размера блока N (код с параметрами S = 16, M = 4 для B = 1)

4.3. Последовательность операций декодирования. На вход декодера поступают данные второй группы, которые используются для вычислений чет-вертой и в итоге третьей групп, см. п. 4.2. Последовательность вычислений про-межуточных данных и результата представлены на блок-схеме (рис. 6). Блок-схема демонстрирует последовательность этапов декодирования одного блока данных.

Основные этапы декодирования: • установка начальных значений массивов a и b; • цикл итераций от 0 до Iterations; • цикл по двум декодерам dec=0, 1; • вычисление γ-вероятностей; • вычисление значений массивов a, b, L; • перестановка значений отсчетов систематических и паритетных битов; • вычисление результатов декодирования mesg. Эти этапы выполняются параллельно в S потоках для каждого блока дан-

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

11

рабатываться некоторое число B блоков данных. Тогда на GPU будет запущено S×B параллельных потоков.

Рис. 6. Блок-схема алгоритма декодирования

12

5. Тестирование реализации турбокодека 5.1. Тестирование исправляющей способности Для проверки корректности работы реализованного турбодекодера путем

компьютерного имитационного моделирования с использованием описанной выше модели системы передачи данных были получены кривые помехоустойчивости и произведено их сопоставление с приведенными в [9] результатами (рис. 7).

В [9] приведены результаты тестирования турбокодера со следующими параметрами: скорость кодера R = 1/2, количество состояний 16 (4 блока за-держки), генератор G1 = 37, G2 = 21, блочный перемежитель с размером блока 256×256 = 65536 бит.

В нашем эксперименте использовался турбокодер со следующими отличи-ями: генератор G1 = 23, G2 = 35 (это эквивалентный генератор), перемежитель аналогичной длины, но со случайной перестановкой отсчетов. Результаты оцен-ки исправляющей способности декодера показаны на рис. 8 кривыми, обозна-ченными: 0 – без использования кодирования; 1–18 показывают количество ите-раций декодирования.

Рис. 7. Оценка исправляющей способности турбодекодера из [1, fig. 9]

Хорошее совпадение полученных результатов с общепризнанными позво-

ляет считать разработанную модель системы передачи данных, включая ко-дер/декодер, корректной и использовать ее в ходе дальнейшей работы.

13

Рис. 8. Оценка исправляющей способности турбодекодера, результаты моделирования

(от 1 до 18 итераций декодирования) 5.2. Оценка влияния размера блока данных на результат декодирования Как отмечал Шеннон, потенциальная помехоустойчивость достижима при

передаче сообщений бесконечной длины. Соответственно, для приближения к по-тенциальной помехоустойчивости необходимо увеличивать размер блока данных.

Ниже приведены результаты оценки влияния длины блока данных при турбокодировании на качество декодирования, полученные с использованием описанной выше модели. Оценку производили при следующих параметрах ко-дера: 16 состояний, скорость кодера – 1/2 (два потока паритетных бит с выкалы-ванием каждого второго бита), перемежитель со случайной перестановкой, дли-на блока данных от 32 бит до 8 Мбит. Качество декодирования оценивалось по вероятности ошибки на бит на выходе декодера (BER, ВОБ). В декодере исполь-зовалось 18 итераций.

Сопоставление кривых помехоустойчивости на рис. 8 и 9 показывает ха-рактерную зависимость: чем больше размер блока данных и количество итера-ций в декодере, тем сильнее проявляется пороговый эффект зависимости ВОБ от ОСШ, и тем ниже значение этого порога по ОСШ. После превышения соотно-шением сигнал/шум порогового значения происходит резкое снижение вероят-ности битовой ошибки. Пороговое значение по ОСШ уменьшается асимптоти-чески к значению 0,6 дБ при увеличении длины блока до значений, стремящихся к бесконечности (рис. 10).

14

Рис. 9. Зависимость ВОБ от ОСШ при различных длинах блока данных

(от 32 бит до 8 Мбит, 18 итераций)

Рис. 10. Зависимость порогового значения ОСШ

от длины блока данных при 18 итерациях декодирования

15

5.3. Описание тестовых стендов Разработанная программа турбодекодирования испытана на ряде вычисли-

тельных стендов, описанных в приложении. При проведении экспериментов возникали определенные трудности с за-

пусками программы на стационарном компьютере и ноутбуке. Поскольку гра-фический процессор на обычном компьютере (не на вычислительном сервере) используется для вывода графики и пользовательского интерфейса, то выполне-ние длительных вычислений на GPU приводит к «замиранию» экрана компью-тера. С этим эффектом «борется» драйвер видеокарты, который аварийно за-вершает выполнение программы, если функция-ядро долго не возвращает управление. В результате происходит прерывание вычислений на больших бло-ках данных. Отключение контроля выхода по «тайм-ауту» не позволило обойти эту проблему. На специально предназначенной для вычислений платформе Tesla такие проблемы отсутствуют, т.к. она не работает с выводом графики.

5.4. Оценка производительности реализации декодера на различных тестовых стендах с использованием технологии CUDA

Реализованная программа декодирования позволяет одновременно деко-дировать несколько блоков данных, каждый из которых обрабатывается в одном блоке потоков CUDA по S потоков в каждом (по количеству состояний). Мак-симальная производительность программы декодирования может быть достиг-нута при максимальной загрузке вычислительного устройства. Необходимо одно-временно запустить на обработку такое количество блоков B, чтобы B·S ≤ Pmax и (B+1)·S > Pmax, где Pmax – максимальное количество параллельно запускаемых по-токов CUDA на конкретном вычислительном устройстве. Таким образом, суще-ствуют два условия, ограничивающие скорость декодирования на вычислитель-ном устройстве:

1) количество одновременно размещаемых блоков данных на устройстве (табл. 1),

2) максимальное количество запускаемых параллельных потоков Pmax.

Таблица 1 Максимальное количество блоков данных, которые можно разместить

в памяти устройства на тестовых стендах

Длина блока N, бит

Объем требуемой памяти

на 1 блок, байт

Tesla C2075,

4915 МБ

GeForce GT420 819МБ

GeForce GT620M 1638 МБ

32 19 812 260 064 43 344 86 712 64 37 220 138 432 23 064 46 152 128 72 036 71 456 11 904 23 832 256 141 036 36 288 6 048 12 120 512 280 932 18 256 3 048 6 096

1 024 559 460 9 184 1 512 3 048 2 048 1 116 516 4 592 768 1 536 4 096 2 230 628 2 240 384 768 8 192 4 458 852 1 120 192 384

16

Окончание табл . 1

Длина блока N, бит

Объем требуемой памяти

на 1 блок, байт

Tesla C2075,

4915 МБ

GeForce GT420 819МБ

GeForce GT620M 1638 МБ

16 384 8 915 300 560 96 192 32 768 17 828 196 224 48 96 65 536 35 653 988 112 24 48 131 072 71 305 572 72 12 24 262 144 142 608 740 36 6 12 524 288 285 215 076 18 3 6 1 048 576 570 427 748 9 1 3 2 097 152 1 140 853 092 4 0 1 4 194 304 2 281 703 780 2 0 0 6 291 456 3 422 554 468 1 0 0 8 388 608 4 563 405 156 1 0 0

___________________________ Примечание: серым цветом выделены оптимальные значения.

Величина Pmax вычисляется с помощью формулы Pmax = CK·CT, где CK – ко-личество ядер процессора, CT – количество запускаемых потоков на одном ядре (для нашей программы это число составило 4 потока на одно ядро). Зная Pmax, легко вычислить максимальное количество параллельно обрабатываемых блоков данных: Bmax = Pmax / S.

Полученные значения параметров для тестовых стендов (для декодера с 16-ю состояниями): первый стенд – Pmax = 1792, Bmax = 112, второй и третий стенды – Pmax = 384, Bmax = 24.

Данные табл. 1 показывают максимальное количество блоков, которое можно разместить в памяти устройства, при разных длинах блоков. Причем если количество блоков больше Bmax, то указывается величина кратная Bmax. По-скольку объем требуемой памяти для декодирования зависит линейно от N, то объем информации, помещаемой в память устройства, практически всегда оди-наковый и соответствует значениям: для первого стенда – 9 Мбит, для второго – 1,5 Мбит, для третьего – 3 Мбит. Это дает приблизительную оценку затрат па-мяти: 1,5 Мбит декодируемой информации на 1 ГБ памяти устройства.

Оптимальным с точки зрения производительности будет размер блока, при котором количество размещаемых блоков в памяти устройства совпадет с величиной Bmax, поскольку при уменьшении длины блока не все блоки будут об-рабатываться одновременно (B > Bmax), а при увеличении – не все ядра графиче-ского процессора будут загружены (P < Pmax).

Предельная скорость декодирования не может превышать скорости, опре-деляемой указанными выше ограничениями. Максимальная теоретическая ско-рость декодирования Di

Bmax оценивается формулой DiBmax = Bmax·D1

1 / i, где Bmax – максимальное количество параллельно обрабатываемых блоков, D1

1 – скорость выполнения одной итерации декодирования при работе с одним блоком данных, i – количество итераций. Величина D1

1 характерна для каждого устройства и

17

может быть вычислена экспериментально. Необходимо отметить, что эта вели-чина не зависит от длины блока данных.

Проиллюстрируем на примере первого тестового стенда, как влияет раз-мер декодируемых блоков на скорость декодирования. При фиксированном ко-личестве итераций (в нашем случае 3) скорость декодирования не превышает максимальной теоретической скорости декодирования Perf_max. На рис. 11 это горизонтальная линия. При увеличении длины блока скорость падает ввиду ограниченности памяти устройства. Вторая кривая Mem_max (на рис. 11 экспо-ненциально убывающая кривая) соответствует максимальной теоретической скорости декодирования, получаемой при запуске стольких потоков декодиро-вания, сколько блоков данных можно разместить в памяти устройства. Кривая реальной скорости декодирования Real_perf ограничена кривыми Perf_max и Mem_max.

Рис. 11. Ограничения предельной скорости декодирования Real_perf максимально возможной производительностью Perf_max и размером памяти Mem_max вычислительного устройства (случай с 16 состояниями кодека и 3 итерациями декодирования,

на тестовом стенде №1 с одним устройством Tesla)

В результате экспериментов для тестовых стендов были найдены значения параметра D1

1 для разных вычислительных устройств. Значения меняются в пре-делах от 32,3 кбит/с на одну итерацию для 9-го стенда до 50,9 кбит/с – для 2-го. Значение этой величины обусловливается тактовой частотой вычислительного устройства. Достигнутая реальная производительность декодирования для трех итераций (обеспечивающих достаточную помехоустойчивость при высоких ОСШ) составила: 2706,4 кбит/с для первого стенда при использовании двух устройств одновременно и 1353,2 кбит/с – при применении только одного устройства (см. рис. 11). Величина максимальной производительности зависит не только от величины D1

1, но и от количества ядер на устройстве. Безусловно, производительность тем выше, чем больше вычислительных ядер на устройстве, что подтверждается экспериментом (подробнее см. табл. 2).

18

5.5. Оценка выигрыша в производительности, обеспечиваемого за счет ис-пользования технологии CUDA, при реализации декодера

Применение технологии CUDA, как и любой другой технологии параллельно-го программирования, требует обоснования целесообразности ее использования в каждом конкретном случае.

В случае с технологиями параллельного программирования от их внедрения ожидается существенный прирост производительности. Однако на практике это происходит не всегда. Поэтому было проведено сравнение производительности тра-диционной (последовательной) реализации на базе CPU с реализацией на базе вы-числителей с поддержкой CUDA.

В качестве последовательной реализации турбодекодера был использован адаптированный текст программы Р. Морелоса-Сарагосы и М. Вальмы [10]. Для те-стирования последовательной реализации декодера были использованы те же тесто-вые стенды (п. 5.3), как и для CUDA-версии, так как они включают в свой состав традиционные CPU. Поскольку на этих стендах установлены многоядерные CPU, обеспечивающие номинальную производительность только при загрузке всех вы-числительных ядер, то тестирование производилось при запуске как одной копии программы в одном потоке операционной системы, так и числа копий программы по числу доступных ядер CPU.

В процессе тестирования один исполняемый файл запускался несколько раз с разными блоками исходных данных. Операционная система обеспечивала парал-лельность выполнения копий программы. Ожидаемый прирост производительности должен быть пропорционален количеству ядер процессора. В реальности прирост оказывается несколько меньше расчетного, что иллюстрируется значениями пара-метра G(B) табл. 2.

На каждом стенде тестирование производилось в три этапа: 1) определение параметра D1

1, показывающего скорость выполнения одной итерации декодирования в одной последовательной программе при загрузке одного ядра;

2) теоретическая оценка максимальной скорости декодирования PM на трех итерациях декодирования при использовании максимально возможного числа Bmax ядер процессора;

3) определение реальной скорости декодирования PR на трех итерациях при запуске Bmax экземпляров программы.

Для получения максимальной производительности эксперименты производи-лись при размере блока данных с оптимальным размером, указанным в табл. 2.

Аналогичный эксперимент проделан и для CUDA-реализации. В этом случае параметр D1

1 определяется при запуске с одним фрагментом данных, а показатель PR – при максимальной загрузке вычислительного устройства. Результаты тестирования, приведенные в табл. 2, иллюстрируют эффект от использования распараллеливания при реализации турбодекодера на различных платформах.

Параметр D11 характеризует производительность вычислительного устройства

при использовании последовательного подхода и задействовании одного ядра. По-лученные результаты демонстрируют безусловное превосходство использования CPU над GPU в однопоточных задачах, обусловленное более высокой тактовой ча-стотой и архитектурой.

Графические процессоры имеют более простые и менее производительные ядра по сравнению с центральными процессорами (при близких годах разработки), но за счет их большого количества при параллельной реализации программы GPU

19

обеспечивает выигрыш, что подтверждают результаты, приведенные в колонке «PR» табл. 2.

Таблица 2 Оценка эффективности использования распараллеливания

при декодировании на разных тестовых стендах

№ тестового стенда, устройство, среда

D11,

кбит/с

CR Bmax PM,

кбит/с PR,

кбит/с UF G(B) PG

1, 2xXeon, Ubuntu 67,0 2×6(12) 12 268,0 259,3 0,97 11,6

1, 2xTesla C2075, CUDA

40,8 2×448 224 3046,4 2706,4 0,89 199,0 10,4

2, Core i7, Win7 323,9 4(8) 4 431,9 369,3 0,86 3,42

2, GTX770, CUDA 50,9 1536 128 2171,7 2031,8 0,94 119,8 5,5

3, Core i7, Win7 302,8 6(12) 6 605,6 574,2 0,95 5,7

3, GTX670, CUDA 47,2 1344 112 1762,1 1511,0 0,86 96,0 2,6

4, Core i5, Win8 321,9 4 4 429,1 381,0 0,89 3,6

4, GTX660, CUDA 44,6 960 80 1189,3 1153,7 0,97 77,6 3,0

5, Core i5, Win7 250,8 4 4 334,4 315,4 0,94 3,7

5, GT440, CUDA 47,2 96 16 251,7 237,0 0,94 15,1 0,75

6, Core 2 Quad, WinXP 89,6 4 4 119,5 113,8 0,95 3,8

6, Tesla C2050, CUDA 34,6 448 112 1291,7 1193,5 0,92 103,5 10,5

7, Core i7M, Win8 280,4 4(8) 4 373,8 352,5 0,94 3,8

7, GT740M, CUDA 41,7 384 32 444,8 432,9 0,97 31,1 1,23

8, Core i7U, Win8 231,7 2(4) 4 309,0 212,0 0,68 2,7

8, GT620M, CUDA 40,7 96 16 217,0 203,2 0,94 15,0 0,96

9, Core i3M, Win7 175,0 4 4 233,4 163,6 0,70 2,8

9, GT425M, CUDA 32,3 96 16 172,1 162,3 0,94 15,1 0,99

__________________________

Примечание: D1

1 – скорость выполнения одной итерации декодирования при работе с одним блоком данных; CR – количество вычислительных ядер; если количество поддерживаемых потоков больше, то оно указывается в скобках; Bmax – максимальное количество параллельно обрабатываемых блоков; PM – теоретическая пиковая скорость декодирования при трех итерациях; PR – достигнутая скорость декодирования при трех итерациях; UF – соотношение между теоретической пиковой скоростью декодирования и фактически достиг-нутой, разы; G(B) – обеспечиваемое за счет параллельных вычислений увеличение скорости декодирования относительно однопоточной реализации, разы; с учетом трех итераций декодирования вычисляет-ся по формуле G(B) = (3 · PR) / D1

1, PG – увеличение скорости декодирования на GPU по сравнению с CPU на том же стенде, разы; вычисляется по формуле PG = PRGPU / PRCPU.

20

Сопоставление полученных результатов позволяет сделать ряд выводов, приведенных ниже. При этом следует отметить, что использованный вычисли-тель Tesla C2075 выпущен на рынок в 2011 г. и приблизительно в 6 раз уступает современным решениям в линейке Tesla по числу CUDA-ядер. Число ядер наиболее мощных серверных процессоров Intel Xeon увеличилось по сравнению с 2011 г. с 6 до 15.

Выводы 1. Созданная реализация турбодекодера для вычислительных устройств,

поддерживающих технологию CUDA, работает корректно и позволяет прово-дить модельные эксперименты по оценке эффективности параллельной реализа-ции турбодекодера.

2. Увеличение длины блока кодируемых данных реализованного декодера позволяет повысить качество декодирования и приблизиться к границе Шенно-на. Безошибочное декодирование на модельной задаче при соотношении сиг-нал/шум, равном 0,7 дБ, достигается при длине блока длиной 128 кбит и более.

3. Объем оперативной памяти, требуемый для программы декодирования, пропорционален количеству состояний кодера и длине блока декодируемого со-общения. Для кодера с 16 состояниями требуется 1 ГБайт памяти на каждые 1,5 Мбит блока данных. Максимальный размер блока данных, декодируемый с помощью созданной реализации на устройстве nVidia Tesla C2075 (объем памя-ти 6 ГБайт), не превышает 9 Мбит.

4. Увеличение количества итераций декодирования позволяет повысить качество декодирования. Прирост помехоустойчивости во всех рассмотренных случаях практически прекращается при числе итераций более 18.

5. Предельное значение помехоустойчивости, достигнутое в эксперименте при использовании двоичной фазовой телеграфии совместно с турбокодом со скоростью 1/2 , 18 итерациями декодирования и размером блока данных 6 Мбит в канале с постоянными параметрами и аддитивным белым гауссовым шумом, характеризуется безошибочной передачей данных при соотношении сигнал/шум 0,65 дБ.

6. Скорость декодирования зависит от производительности вычислитель-ного устройства, при этом она прямо пропорциональна количеству выполняе-мых параллельно блоков декодирования и обратно пропорциональна количеству итераций. Максимально достигнутая скорость декодирования для устройства NVIDIA GeForce GTX770 составила 2031,8 кбит/с при трех итерациях для бло-ков данных длиной 4 кбит с 16 состояниями кодера.

7. Применительно к рассмотренному декодеру в однопоточном режиме работы в пределах одного поколения и класса центральные процессоры (CPU) существенно превосходят графические процессоры (GPU). Проигрыш бытовых видеокарт по максимально достижимой скорости декодирования превысил 6 раз, проигрыш профессионального CUDA вычислителя линейки nVidia Tesla – 1,5 раза.

8. Применительно к рассмотренному декодеру в режиме параллельных вычислений как бытовые видеокарты, так и профессиональные вычислители NVIDIA Tesla существенно превосходят в пределах одного поколения и класса центральные процессоры. Выигрыш бытовых видеокарт по максимально дости-

21

жимой скорости декодирования превысил 3…5 раз, выигрыш профессионально-го CUDA вычислителя линейки nVidia Tesla – 10 раз.

9. При реализации рассмотренного декодера турбокода на базе современ-ных центральных процессоров достижима скорость декодирования более 300 кбит/с при трех итерациях декодирования с 16 состояниями кодера для блоков данных длиной 64 кбит.

10. Увеличение числа итерацией декодирования, требующееся для низких соотношений сигнал/шум, либо отклонение размера блока данных от оптималь-ного с точки зрения загрузки процессора значений приведут к невозможности реализации требуемых модему при работе в полосе 40 кГц скоростей передачи данных, превышающих 120 кбит/с.

Соответственно, использование специализированных мощных CUDA вы-числителей при реализации декодера турбокода высокоскоростных КВ-радиомодемов с полосой до 40 кГц и близкой к предельной помехоустойчиво-стью является целесообразным.

ЛИ Т Е Р А Т У Р А

1. Пукса Д.О. Романов Ю.В. Результаты трассовых испытаний высокоскоростного

КВ радиомодема разработки ОАО «ОНИИП» // Успехи современной радиоэлектроники. –2012. – № 11. – С. 19–25.

2. URL: http://www.old.computerra.ru/hitech/34282 (дата обращения: 23.03.14). 3. URL: http://www.netler.ru/pc/cuda.htm (дата обращения: 23.03.14). 4. URL: http://www.nvidia.ru/object/tesla-server-gpus-ru.html (дата обращения: 23.03.14). 5. URL: http://www.intel.ru/content/www/ru/ru/processor-comparison/compare-intel-

processors.html?select=server (дата обращения: 23.03. 14). 6. Романов Ю.В. Профессиональная радиосвязь в диапазонах ВЧ/ОВЧ/УВЧ: совре-

менное состояние и тенденции развития // Техника радиосвязи. – 2007. - № 12. – С. 3–17. 7. Процессоры Intel. Показатели производительности процессоров Intel в соответствии с

экспортными требованиями. – URL: http://www.intel.com/support/ru/processors/sb/cs-017346.htm (дата обращения: 13.03. 14).

8. Морелос-Сарагоса Р. Искусство помехоустойчивого кодирования. Методы, ал-горитмы, применение. – М.: Техносфера, 2005. – 320 с.

9 Berrou C., Glavieux A. Near Optimum Error Correcting Coding And Decoding: Tur-bo-Codes // IEEE Transactions on Communications. –Vol. 44. – № 10, October 1996.

10. Morelos-Zaragoza R. The Error Correcting Codes (ECC) Page. – URL: www.eccpage.com (дата обращения: 01.04.14).

Приложение (обязательное) Описание тестовых стендов. 1. Вычислительный сервер SuperMicro с вычислительными модулями nVidia Tesla сле-дующей конфигурации. Сервер: CPU – 2×Intel Xeon E5645, 2,67 ГГц; 6 ядер, 12 потоков; 57,6 GFLOPS; объем ОЗУ – 32 ГБ; 1-й кв. 2010 г.; ОС – Linux Ubuntu 11.10. GPU: 2×nVidia Tesla C2075, 1,15 ГГц; объем ОЗУ – 6144 МБ; количество ядер CUDA – 448; теоретическая производительность – 1288 GFLOPS; 3-й кв. 2011 г.; драйвер CUDA версии 5.0. 2. Стационарный компьютер следующей конфигурации.

22

CPU – Intel Core i7-3770K, 3,5 ГГц; 4 ядра, 8 потоков; 112 GFLOPS; объем ОЗУ – 32 ГБ; 2-й кв. 2012 г.; ОС Windows 7×64. GPU: nVidia GeForce GTX770, 1046 МГц, объем ОЗУ – 4096 МБ; количество ядер CUDA – 1536; теоретическая производительность – 3213 GFLOPS; 2-й кв. 2013 г.; драйвер CUDA версии 5.5. 3. Стационарный компьютер следующей конфигурации. CPU – Intel Core i7-3930K, 3,2 ГГц; 6 ядер, 12 потоков; 153,6 GFLOPS; объем ОЗУ – 64 ГБ; 4-й кв. 2011 г.; ОС Windows 7×64. GPU: nVidia GeForce GTX670, 915 МГц, объем ОЗУ – 4096 МБ; количество ядер CUDA – 1344; теоретическая производительность – 2459 GFLOPS; 2-й кв. 2012 г.; драйвер CUDA версии 5.5. 4. Стационарный компьютер следующей конфигурации. CPU – Intel Core i5-3570, 3,4 ГГц; 4 ядра, 4 потока; 108,8 GFLOPS; объем ОЗУ – 8 ГБ; 2-й кв. 2012 г.; ОС Windows 8.1×64. GPU: nVidia GeForce GTX660, 980 МГц, объем ОЗУ – 2048 МБ; количество ядер CUDA – 960; теоретическая производительность – 1881 GFLOPS; 4-й кв. 2012 г.; драйвер CUDA версии 5.5. 5. Стационарный компьютер следующей конфигурации. CPU – Intel Core i5-2310, 2,9 ГГц; 4 ядра, 4 потока; 92,8 GFLOPS; объем ОЗУ – 8 ГБ; 2-й кв. 2011 г.; ОС Windows 7×64. GPU: nVidia GeForce GT440, 810 МГц, объем ОЗУ – 1024 МБ; количество ядер CUDA – 96; теоретическая производительность – 311 GFLOPS; 1-й кв. 2011 г.; драйвер CUDA версии 5.5. 6. Стационарный компьютер следующей конфигурации. CPU – Intel Core 2 Quad Q6600, 2,4 ГГц; 4 ядра, 4 потока; 38,4 GFLOPS; объем ОЗУ – 2 ГБ; 1-й кв. 2007 г.; ОС Windows XP SP3×32. GPU: nVidia Tesla C2050, 1150 МГц, объем ОЗУ – 3072 МБ; количество ядер CUDA – 448; теоретическая производительность – 1288 GFLOPS; 3-й кв. 2010 г.; драйвер CUDA версии 5.5. 7. Ноутбук следующей конфигурации. CPU – Intel Core i7-4700MQ, 2,4 ГГц; 4 ядра, 8 потоков; объем ОЗУ – 8 ГБ; 2-й кв. 2013 г.; ОС Windows 8.1×64. GPU: nVidia GeForce GT740M, 810 МГц; объем ОЗУ – 2048 МБ; количество ядер CUDA – 384; теоретическая производительность – 622 GFLOPS; 2-й кв. 2013 г.; драйвер CUDA версии 5.5. 8. Ноутбук следующей конфигурации. CPU – Intel Core i7-3517U, 1,9 ГГц; 2 ядра, 4 потока; 30,4 GFLOPS; объем ОЗУ – 10 ГБ; 2-й кв. 2012 г.; ОС Windows 8.1×64. GPU: nVidia GeForce GT620M, 625 МГц; объем ОЗУ – 1024 МБ; количество ядер CUDA – 96; теоретическая производительность – 120 GFLOPS; 1-й кв. 2012 г.; драйвер CUDA версии 5.5. 9. Ноутбук следующей конфигурации. CPU – Intel Core i3-380M, 2,53 ГГц; 2 ядра, 4 потока; 20,6 GFLOPS; объем ОЗУ – 4 ГБ; 3-й кв. 2010 г.; ОС Windows 7×64. GPU: nVidia GeForce GT425M, 560 МГц; объем ОЗУ – 1024 МБ; количество ядер CUDA – 96; теоретическая производительность – 108 GFLOPS; 3-й кв. 2010 г.; драйвер CUDA версии 5.5. Квартал и год появления CPU и GPU на рынок указаны для большей наглядности срав-нения, так как вычислительная техника быстро устаревает, соответственно, сравнивать эффективность CPU и GPU корректно в пределах одного поколения.

23

Сведения об авторах Виноградов Вячеслав Сергеевич – студент Омского государственного университета имени Ф.М. Достоевского. E-mail: [email protected].

Коробицын Виктор Викторович – канд. физ.-мат. наук, доцент, заведующий кафедрой вычислительных систем ОмГУ им. Ф.М. Достоевского. E-mail: [email protected].

Монастыренко Дмитрий Павлович – преподаватель кафедры вычислительных систем ОмГУ им. Ф.М. Достоевского. E-mail: [email protected].

Московцев Михаил Николаевич – преподаватель кафедры вычислительных систем

ОмГУ им. Ф.М. Достоевского. E-mail: [email protected].

Пукса Денис Олегович – руководитель группы ОАО «ОНИИП». E-mail: [email protected].

Романов Юрий Владимирович – заместитель начальника НТЦ, начальник отдела ОАО «ОНИИП». E-mail: [email protected].

Статья поступила в апреле 2014 г.