Разница в производительности в реализациях Jython и Java турбо-декодера
В настоящее время я делаю диссертацию по компьютерным наукам о многопоточной программной реализации турбодекодера. Основная проблема заключается в следующем:
- let (y1,..., yn) - последовательность битов с шумом, полученных через канал. Два SISO-декодера работают параллельно (каждый получает первый бит последовательности и бит четности y1j, j в {1,2}) - цель состоит в том, чтобы вычислить LLR (отношение логарифмической вероятности, которое дает информацию о вероятности что текущий бит равен 0 или 1), который затем подается на другой SISO-декодер для следующей итерации. Предположим, что полученные биты разбиты на более короткие кадры данных. (SISO означает мягкий ввод, мягкий вывод, потому что каждый декодер получает оценку вероятностей битов на входе и выводит свою собственную оценку)
Каждое вычисление LLR требует большого количества сериализованных операций ACS, в зависимости от количества битов в каждом кадре (и от количества битов, используемых кодером для создания битов четности для начальной последовательности). Такое вычисление можно суммировать с этими вложенными циклами (для каждого из двух параллельных декодеров SISO):
for i=1 to N_FRAMES:
for j=1 to N_ELS_FRAMES:
for k=1 to 4:
for l=1 to N_STATES:
do_ops()
Обратите внимание, что вышеприведенный цикл на самом деле не появляется в алгоритме, но он достаточно близко соответствует операциям, выполненным для каждой итерации. Как правило, N_STATES составляет около 8 или 16 (это зависит от количества битов, которые каждый кодер использует для вычисления битов четности во входной последовательности), а do_ops() требует суммирования, максимума и нормализации вектора.
Сначала я пытался сделать реализацию с использованием Jython, но результат был довольно обескураживающим: операции в вышеупомянутых вложенных циклах заняли - с многопоточной версией - около 20 минут (!) С умеренным (~2 мил) количеством битов.
С другой стороны, реализация Java требует ~1 сек с ~4 мил битами, используя однопоточную версию алгоритма.
Почему такая огромная разница?