repstosw 18 2 ноября, 2023 Опубликовано 2 ноября, 2023 · Жалоба 2 hours ago, sasamy said: https://godbolt.org/z/dd55Wjo68 Работает, но вот реализация оказалась быстрее: static inline unsigned int modnn1(unsigned int x) { for(;x>=NN;x-=NN)asm volatile ("" ::: "memory"); return x; } modnn1: movw r3, #65534 cmp r0, r3 bxls lr sub r0, r0, #65280 sub r0, r0, #255 bx lr Удалось поднять производительность кодера - на 12%, путём замены на суммирование: static inline unsigned int gf_sub(unsigned int x,unsigned int y) { y=x-y; return y+(y>x)*NN; } #define gf_add(x,y) gf_sub(x,NN-(y)) void encode_rs(dtype *data) { dtype *bb=&data[KK]; gf feedback; register int i,j; CLEAR(bb,EE); for(i=K-1;i>=0;i--) { feedback=Index_of[data[i]^bb[EE-1]]; if(feedback!=A0) /* feedback term is non-zero */ { for(j=EE-1;j>0;j--)if(Gg[j]!=A0)bb[j]=bb[j-1]^Alpha_to[ gf_add(Gg[j],feedback) /*modnn(Gg[j]+feedback)*/ ]; else bb[j]=bb[j-1]; bb[0]=Alpha_to[ gf_add(Gg[0],feedback) /*modnn(Gg[0]+feedback)*/ ]; } else /* feedback term is zero. encoder becomes a single-byte shifter */ { for(j=EE-1;j>0;j--)bb[j]=bb[j-1]; bb[0]=0; } } } Но декодер, плохо поддаётся оптимизации. Было 14.3 FPS, стало 14.6 2 minutes ago, thermit said: Вы-то что хотите? Ускорить работу декодера с 14 FPS , до 16. Это как минимум. В идеале - больше, чтобы больше ошибок исправлялось. 14,6 уже есть. 5 minutes ago, thermit said: Все вычисления только через таблицу. Слишком хаотичные выборки из таблицы. Кеш мажет. С увеличением таблицы - падает производительность. Это в GF 2^8 всё быстро, так как таблицы небольшие. Для GF 2^16 таблицы раздуваются. Пробовал жать RAR-архивом таблицы Index_Of, Alpha_to - практически не сжимаются. Потому что хаоса там предостаточно. 8 minutes ago, repstosw said: static inline unsigned int gf_sub(unsigned int x,unsigned int y) { y=x-y; return y+(y>x)*NN; } Асм даёт вот такое изящество - без условий, от того и быстро работает кодер: gf_sub: subs r0, r0, r1 addcc r0, r0, #65280 addcc r0, r0, #255 bx lr Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
thermit 1 2 ноября, 2023 Опубликовано 2 ноября, 2023 · Жалоба 4 минуты назад, repstosw сказал: Работает, но вот реализация оказалась быстрее: static inline unsigned int modnn1(unsigned int x) { for(;x>=NN;x-=NN)asm volatile ("" ::: "memory"); return x; } modnn1: movw r3, #65534 cmp r0, r3 bxls lr sub r0, r0, #65280 sub r0, r0, #255 bx lr Удалось поднять производительность кодера - на 12%, путём замены на суммирование: static inline unsigned int gf_sub(unsigned int x,unsigned int y) { y=x-y; return y+(y>x)*NN; } #define gf_add(x,y) gf_sub(x,NN-(y)) void encode_rs(dtype *data) { dtype *bb=&data[KK]; gf feedback; register int i,j; CLEAR(bb,EE); for(i=K-1;i>=0;i--) { feedback=Index_of[data[i]^bb[EE-1]]; if(feedback!=A0) /* feedback term is non-zero */ { for(j=EE-1;j>0;j--)if(Gg[j]!=A0)bb[j]=bb[j-1]^Alpha_to[ gf_add(Gg[j],feedback) /*modnn(Gg[j]+feedback)*/ ]; else bb[j]=bb[j-1]; bb[0]=Alpha_to[ gf_add(Gg[0],feedback) /*modnn(Gg[0]+feedback)*/ ]; } else /* feedback term is zero. encoder becomes a single-byte shifter */ { for(j=EE-1;j>0;j--)bb[j]=bb[j-1]; bb[0]=0; } } } Но декодер, плохо поддаётся оптимизации. Было 14.3 FPS, стало 14.6 Ускорить работу декодера с 14 FPS , до 16. Это как минимум. В идеале - больше, чтобы больше ошибок исправлялось. 14,6 уже есть. Рс обычно в каскаде используется. Со сверточным. Ну или с другим блочным, типа хемминга. Ну или советую использовать коды типа турбо. Но сильно перформанса это вам не добавит. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sasamy 0 3 ноября, 2023 Опубликовано 3 ноября, 2023 (изменено) · Жалоба On 11/2/2023 at 8:15 PM, repstosw said: Но декодер, плохо поддаётся оптимизации. Было 14.3 FPS, стало 14.6 а сколько это мегабит в секунду ? попробовал симулятор на этом процессоре (t113-s3) в линуксе кодирование + декодирование и мне кажется он значительно больше показывает - порядка 1.340 Mb/s, ваши параметры не знаю - пальцем в небо ткнул исправлять 100 ошибок на 2047 символов https://github.com/aff3ct/aff3ct Quote # aff3ct -C "RS" -T 100 -N 2047 -m 1.0 -M 5.0 -s 1.0 # ---------------------------------------------------- # ---- A FAST FORWARD ERROR CORRECTION TOOLBOX >> ---- # ---------------------------------------------------- # Parameters: # * Simulation ------------------------------------ # ** Type = BFER # ** Type of bits = int32 # ** Type of reals = float32 # ** Date (UTC) = 1970-01-02 01:30:41 # ** Git version = v3.0.2 # ** Code type (C) = RS # ** Noise range = 1 -> 5 dB # ** Noise type (E) = EBN0 # ** Seed = 0 # ** Statistics = off # ** Debug mode = off # ** Inter frame level = 1 # ** Multi-threading (t) = 2 thread(s) # ** Coset approach (c) = no # ** Coded monitoring = no # ** Bad frames tracking = off # ** Bad frames replay = off # ** Bit rate = 0.902296 (1847/2047) # * Source ---------------------------------------- # ** Type = RAND # ** Implementation = STD # ** Info. bits (K_info) = 20317 # * Codec ----------------------------------------- # ** Type = RS # ** Info. bits (K) = 20317 # ** Codeword size (N_cw) = 22517 # ** Frame size (N) = 22517 # ** Code rate = 0.902296 (1847/2047) # ** Symbols Source size = 1847 # ** Symbols Codeword size = 2047 # * Encoder --------------------------------------- # ** Type = RS # ** Systematic = yes # * Decoder --------------------------------------- # ** Type (D) = ALGEBRAIC # ** Implementation = STD # ** Systematic = yes # ** Galois field order (m) = 11 # ** Correction power (T) = 100 # * Modem ----------------------------------------- # ** Type = BPSK # ** Implementation = STD # ** Bits per symbol = 1 # ** Sigma square = on # * Channel --------------------------------------- # ** Type = AWGN # ** Implementation = STD # ** Complex = off # ** Add users = off # * Monitor --------------------------------------- # ** Lazy reduction = off # ** Frame error count (e) = 100 # ** Compute mutual info = no # * Terminal -------------------------------------- # ** Show Sigma = off # ** Enabled = yes # ** Frequency (ms) = 500 # # The simulation is running... # ---------------------||------------------------------------------------------||--------------------- # Signal Noise Ratio || Bit Error Rate (BER) and Frame Error Rate (FER) || Global throughput # (SNR) || || and elapsed time # ---------------------||------------------------------------------------------||--------------------- # ----------|----------||----------|----------|----------|----------|----------||----------|---------- # Es/N0 | Eb/N0 || FRA | BE | FE | BER | FER || SIM_THR | ET/RT # (dB) | (dB) || | | | | || (Mb/s) | (hhmmss) # ----------|----------||----------|----------|----------|----------|----------||----------|---------- 0.55 | 1.00 || 101 | 134929 | 101 | 6.58e-02 | 1.00e+00 || 1.330 | 00h00'01 1.55 | 2.00 || 102 | 94278 | 102 | 4.55e-02 | 1.00e+00 || 1.344 | 00h00'01 2.55 | 3.00 || 102 | 59862 | 102 | 2.89e-02 | 1.00e+00 || 1.340 | 00h00'01 3.55 | 4.00 || 102 | 34270 | 102 | 1.65e-02 | 1.00e+00 || 1.345 | 00h00'01 4.55 | 5.00 || 102 | 17291 | 102 | 8.34e-03 | 1.00e+00 || 1.344 | 00h00'01 # End of the simulation. тоже самое но исправлять 200 шибок 0.66 Mb/s Quote # aff3ct -C "RS" -T 200 -N 2047 -m 1.0 -M 5.0 -s 1.0 # ---------------------------------------------------- # ---- A FAST FORWARD ERROR CORRECTION TOOLBOX >> ---- # ---------------------------------------------------- # Parameters: # * Simulation ------------------------------------ # ** Type = BFER # ** Type of bits = int32 # ** Type of reals = float32 # ** Date (UTC) = 1970-01-02 02:25:00 # ** Git version = v3.0.2 # ** Code type (C) = RS # ** Noise range = 1 -> 5 dB # ** Noise type (E) = EBN0 # ** Seed = 0 # ** Statistics = off # ** Debug mode = off # ** Inter frame level = 1 # ** Multi-threading (t) = 2 thread(s) # ** Coset approach (c) = no # ** Coded monitoring = no # ** Bad frames tracking = off # ** Bad frames replay = off # ** Bit rate = 0.804592 (1647/2047) # * Source ---------------------------------------- # ** Type = RAND # ** Implementation = STD # ** Info. bits (K_info) = 18117 # * Codec ----------------------------------------- # ** Type = RS # ** Info. bits (K) = 18117 # ** Codeword size (N_cw) = 22517 # ** Frame size (N) = 22517 # ** Code rate = 0.804592 (1647/2047) # ** Symbols Source size = 1647 # ** Symbols Codeword size = 2047 # * Encoder --------------------------------------- # ** Type = RS # ** Systematic = yes # * Decoder --------------------------------------- # ** Type (D) = ALGEBRAIC # ** Implementation = STD # ** Systematic = yes # ** Galois field order (m) = 11 # ** Correction power (T) = 200 # * Modem ----------------------------------------- # ** Type = BPSK # ** Implementation = STD # ** Bits per symbol = 1 # ** Sigma square = on # * Channel --------------------------------------- # ** Type = AWGN # ** Implementation = STD # ** Complex = off # ** Add users = off # * Monitor --------------------------------------- # ** Lazy reduction = off # ** Frame error count (e) = 100 # ** Compute mutual info = no # * Terminal -------------------------------------- # ** Show Sigma = off # ** Enabled = yes # ** Frequency (ms) = 500 # # The simulation is running... # ---------------------||------------------------------------------------------||--------------------- # Signal Noise Ratio || Bit Error Rate (BER) and Frame Error Rate (FER) || Global throughput # (SNR) || || and elapsed time # ---------------------||------------------------------------------------------||--------------------- # ----------|----------||----------|----------|----------|----------|----------||----------|---------- # Es/N0 | Eb/N0 || FRA | BE | FE | BER | FER || SIM_THR | ET/RT # (dB) | (dB) || | | | | || (Mb/s) | (hhmmss) # ----------|----------||----------|----------|----------|----------|----------||----------|---------- 0.06 | 1.00 || 102 | 142719 | 102 | 7.72e-02 | 1.00e+00 || 0.663 | 00h00'02 1.06 | 2.00 || 102 | 101748 | 102 | 5.51e-02 | 1.00e+00 || 0.663 | 00h00'02 2.06 | 3.00 || 102 | 67254 | 102 | 3.64e-02 | 1.00e+00 || 0.663 | 00h00'02 3.06 | 4.00 || 102 | 40828 | 102 | 2.21e-02 | 1.00e+00 || 0.663 | 00h00'02 4.06 | 5.00 || 102 | 21950 | 102 | 1.19e-02 | 1.00e+00 || 0.663 | 00h00'02 # End of the simulation. исправлять 300 ошибок 0.39 Mb/s Quote # aff3ct -C "RS" -T 300 -N 2047 -m 1.0 -M 5.0 -s 1.0 # ---------------------------------------------------- # ---- A FAST FORWARD ERROR CORRECTION TOOLBOX >> ---- # ---------------------------------------------------- # Parameters: # * Simulation ------------------------------------ # ** Type = BFER # ** Type of bits = int32 # ** Type of reals = float32 # ** Date (UTC) = 1970-01-02 02:22:40 # ** Git version = v3.0.2 # ** Code type (C) = RS # ** Noise range = 1 -> 5 dB # ** Noise type (E) = EBN0 # ** Seed = 0 # ** Statistics = off # ** Debug mode = off # ** Inter frame level = 1 # ** Multi-threading (t) = 2 thread(s) # ** Coset approach (c) = no # ** Coded monitoring = no # ** Bad frames tracking = off # ** Bad frames replay = off # ** Bit rate = 0.706888 (1447/2047) # * Source ---------------------------------------- # ** Type = RAND # ** Implementation = STD # ** Info. bits (K_info) = 15917 # * Codec ----------------------------------------- # ** Type = RS # ** Info. bits (K) = 15917 # ** Codeword size (N_cw) = 22517 # ** Frame size (N) = 22517 # ** Code rate = 0.706888 (1447/2047) # ** Symbols Source size = 1447 # ** Symbols Codeword size = 2047 # * Encoder --------------------------------------- # ** Type = RS # ** Systematic = yes # * Decoder --------------------------------------- # ** Type (D) = ALGEBRAIC # ** Implementation = STD # ** Systematic = yes # ** Galois field order (m) = 11 # ** Correction power (T) = 300 # * Modem ----------------------------------------- # ** Type = BPSK # ** Implementation = STD # ** Bits per symbol = 1 # ** Sigma square = on # * Channel --------------------------------------- # ** Type = AWGN # ** Implementation = STD # ** Complex = off # ** Add users = off # * Monitor --------------------------------------- # ** Lazy reduction = off # ** Frame error count (e) = 100 # ** Compute mutual info = no # * Terminal -------------------------------------- # ** Show Sigma = off # ** Enabled = yes # ** Frequency (ms) = 500 # # The simulation is running... # ---------------------||------------------------------------------------------||--------------------- # Signal Noise Ratio || Bit Error Rate (BER) and Frame Error Rate (FER) || Global throughput # (SNR) || || and elapsed time # ---------------------||------------------------------------------------------||--------------------- # ----------|----------||----------|----------|----------|----------|----------||----------|---------- # Es/N0 | Eb/N0 || FRA | BE | FE | BER | FER || SIM_THR | ET/RT # (dB) | (dB) || | | | | || (Mb/s) | (hhmmss) # ----------|----------||----------|----------|----------|----------|----------||----------|---------- -0.51 | 1.00 || 101 | 146269 | 101 | 9.10e-02 | 1.00e+00 || 0.394 | 00h00'04 0.49 | 2.00 || 102 | 108893 | 102 | 6.71e-02 | 1.00e+00 || 0.397 | 00h00'04 1.49 | 3.00 || 102 | 75191 | 102 | 4.63e-02 | 1.00e+00 || 0.397 | 00h00'04 2.49 | 4.00 || 102 | 48286 | 102 | 2.97e-02 | 1.00e+00 || 0.397 | 00h00'04 3.49 | 5.00 || 102 | 28165 | 102 | 1.73e-02 | 1.00e+00 || 0.397 | 00h00'04 # End of the simulation. Изменено 3 ноября, 2023 пользователем sasamy Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
repstosw 18 3 ноября, 2023 Опубликовано 3 ноября, 2023 (изменено) · Жалоба 1 hour ago, sasamy said: а сколько это мегабит в секунду ? попробовал симулятор на этом процессоре (t113-s3) в линуксе кодирование + декодирование и мне кажется он значительно больше показывает - порядка 1.340 Mb/s, ваши параметры не знаю - пальцем в небо ткнул исправлять 100 ошибок на 2047 символов Параметры такие: M=16 (GF 2^16) -- степень полинома (Galois field order) NN = 65535 -- общая длина блока в 16-битных символах EE = 584 -- размер блока проверочных символов K = 2392 -- размер блока полезных символов (отличается от KK = NN - EE ) Оптимизированный мод даёт на T113-s3 (1200 МГц) такие показатели - причём время декодирования здесь в случае, когда число ошибок максимально и декодер может восстановить пакет (число ошибок = половина от числа проверочных символов). Ясен фиг, что если ошибок будет меньше - декодирование пойдёт быстрее. T113-s3... FEC T113-s3 CPU ===> Encode: 35.68 FPS Decode: 14.60 FPS T113-s3 CPU ===> Encode: 35.71 FPS Decode: 14.60 FPS T113-s3 CPU ===> Encode: 35.70 FPS Decode: 14.60 FPS T113-s3 CPU ===> Encode: 35.70 FPS Decode: 14.62 FPS T113-s3 CPU ===> Encode: 35.70 FPS Decode: 14.61 FPS T113-s3 CPU ===> Encode: 35.71 FPS Decode: 14.60 FPS T113-s3 CPU ===> Encode: 35.70 FPS Decode: 14.63 FPS T113-s3 CPU ===> Encode: 35.70 FPS Decode: 14.61 FPS T113-s3 CPU ===> Encode: 35.68 FPS Decode: 14.60 FPS T113-s3 CPU ===> Encode: 35.69 FPS Decode: 14.64 FPS T113-s3 CPU ===> Encode: 35.72 FPS Decode: 14.62 FPS T113-s3 CPU ===> Encode: 35.70 FPS Decode: 14.63 FPS T113-s3 CPU ===> Encode: 35.71 FPS Decode: 14.60 FPS Воркбенч с кодеком приложил: rs_fec.zip Суть моей оптимизации - ускорение поиска Ченя: упрощены вычисления, на промежутке [ K .. KK - 1 ], где находятся нули в блоке (не используются): Spoiler /* * Find roots of the error+erasure locator polynomial. By Chien * Search */ COPY(®[1],&lambda[1],EE); count = 0; /* Number of roots of lambda(x) */ for (i = NN-1; i >= KK; i--) //Parity { q = 1; for (j = deg_lambda; j > 0; j--) if (reg[j] != A0 ) { reg[j]= /*gf_add(reg[j],j)*/ modnn1(reg[j]+j) ; q ^= Alpha_to[reg[j]]; } // if(q)continue; if (!q) { /* store root (index-form) and error location number */ root[count] =NN-i; // loc[count] = i; //позиции ошибочных байт // count++; if(++count==deg_lambda)break; } } for(j=deg_lambda;j>0;j--)if(reg[j]!=A0)reg[j]= /*gf_add(reg[j],nool[j])*/ modnnF(reg[j]+(j*(KK-K))) /*modnn1(reg[j]+nool[j])*/ ; //!!! for (i = K-1; i >= 0 ; i--) //Data { q = 1; for (j = deg_lambda; j > 0; j--) if (reg[j] != A0) { reg[j]= /*gf_add(reg[j],j)*/ modnn1(reg[j]+j) ; q ^= Alpha_to[reg[j]] ; } // if(q)continue; if (!q) { /* store root (index-form) and error location number */ root[count] =NN-i; // loc[count] = i; //позиции ошибочных байт // count++; if(++count==deg_lambda)break; } } 1 hour ago, sasamy said: исправлять 300 ошибок 0.39 Mb/s Galois field order = 11. Нечестно! У меня 16 : как раз чтобы 2 байта компактно разместить в один символ. И ошибок по-больше. Параметры блока напиcал в предыдущем посте. Изменено 3 ноября, 2023 пользователем repstosw Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sasamy 0 3 ноября, 2023 Опубликовано 3 ноября, 2023 · Жалоба On 11/3/2023 at 1:15 PM, repstosw said: Galois field order = 11. Нечестно! У меня 16 : как раз чтобы 2 байта компактно разместить в один символ. 16 не получается симулировать система аварийно завершает симулятор, да и зачем если он такой тормозной :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
repstosw 18 4 ноября, 2023 Опубликовано 4 ноября, 2023 · Жалоба On 11/3/2023 at 3:24 AM, thermit said: Рс обычно в каскаде используется. Со сверточным. Слишком дорогое удовольствие - сверточный кодер. CR = 1/2, 1/3, 1/6. Я могу позволить выделить на проверочные символы не более 1/4. (25%) от всего фрейма. Имплементация сверточного кодера с CR 3/4 , 4/5, 5/6, 7/8 - существует? На сях. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
thermit 1 4 ноября, 2023 Опубликовано 4 ноября, 2023 · Жалоба 4 часа назад, repstosw сказал: Слишком дорогое удовольствие - сверточный кодер. CR = 1/2, 1/3, 1/6. Я могу позволить выделить на проверочные символы не более 1/4. (25%) от всего фрейма. Имплементация сверточного кодера с CR 3/4 , 4/5, 5/6, 7/8 - существует? На сях. 3/4 и все такое получаются из 1/4 через выкалывание. Реализации существуют. Надо в хухеле поискать. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
repstosw 18 5 ноября, 2023 Опубликовано 5 ноября, 2023 · Жалоба 23 hours ago, thermit said: 3/4 и все такое получаются из 1/4 через выкалывание. Реализации существуют. Надо в хухеле поискать. "Прикольный" ответ. Предполагалось, что задавший вопрос излазил весь интернет в поисках нужного, и не найдя, задал вопрос здесь. Плюс декодирование Витерби: каким образом восстанавливается то, что выкололи или чем замещается? Вопрос имплементации свёрточника 3/4 на Си остаётся в силе. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
thermit 1 5 ноября, 2023 Опубликовано 5 ноября, 2023 · Жалоба 1 час назад, repstosw сказал: "Прикольный" ответ. Предполагалось, что задавший вопрос излазил весь интернет в поисках нужного, и не найдя, задал вопрос здесь. Плюс декодирование Витерби: каким образом восстанавливается то, что выкололи или чем замещается? Вопрос имплементации свёрточника 3/4 на Си остаётся в силе. Мне своим кодом делиться не хочется. Уж извините. А выкалывание делается так: на передающей стороне на 3 входных бита получаем 12 на выходе кодера. 8 бит выкидываются. Получаем 3/4. На приемной стороне недостающие биты заполняются 0. Корректирующие свойства такого кода не очень. Ну и http://www.eccpage.com. Очень полезный. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
repstosw 18 5 ноября, 2023 Опубликовано 5 ноября, 2023 (изменено) · Жалоба 1 hour ago, thermit said: А выкалывание делается так: на передающей стороне на 3 входных бита получаем 12 на выходе кодера. 8 бит выкидываются. Получаем 3/4. На приемной стороне недостающие биты заполняются 0. Исчерпывающе. Попробую из 1/2 сделать 3/4. 1 hour ago, thermit said: Ну и http://www.eccpage.com. Очень полезный. Неплохо. Правда Generic всё - придется оптимизировать. Немного удалось поднять скорость кодера RS на нужных мне параметрах (2976 символов сообщения + 584 проверочных, GF 2^16). На Allwinner T113-s3 (ARM A7, 1200 МГц) кодирование было 32 FPS, стало 39. Изначально вообще было 6 FPS (без укорочения циклов до длины полезной части сообщения) С декодированием всё хуже, самые ресурсоёмкие места: поиск синдромов и Чень. Второй уже ускорен, с первым не получается. Поиск синдромов: //Alpha_to - статический массив //modnn - остаток от деления на 65535. //K - число символов сообщения //EE - число проверочных символов //KK - число сивмволов сообщения + нули for(i=0;i<K+EE;i++)recd[i]=Index_of[data[i]]; /* data[] is in polynomial form, copy and convert to index form */ /* first form the syndromes; i.e., evaluate recd(x) at roots of g(x) * namely @**(B0+i), i = 0, ... ,(EE-1) */ syn_error=0; for(i=0;i<EE;i++) { tmp=0; unsigned int w[2]={0,i*KK}; gf *v[2]={&recd[0],&recd[K]}; int n[2]={K,EE}; while(n[0]--) { if(*v[0]!=A0)tmp^=Alpha_to[modnnF(*v[0]+w[0])]; v[0]++; w[0]+=i; } while(n[1]--) { if(*v[1]!=A0)tmp^=Alpha_to[modnnF(*v[1]+w[1])]; v[1]++; w[1]+=i; } syn_error|=tmp; /* set flag if non-zero syndrome => error */ s[i+1]=Index_of[tmp]; /* store syndrome in index form */ } if(!syn_error) { /* * if syndrome is zero, data[] is a codeword and there are no * errors to correct. So return data[] unmodified */ printf("Syndrome OK!\n"); return 0; Было: 14,3 FPS, стало 14,7 FPS (изначально было 2,3 FPS). Что можно ещё придумать с кодом выше? Изменено 5 ноября, 2023 пользователем repstosw Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
thermit 1 5 ноября, 2023 Опубликовано 5 ноября, 2023 (изменено) · Жалоба Разве что убрать объявление переменных внутри цикла ну и избавится от +1 при индексировании. Принципиально тут ничего оптимизировать нельзя. Изменено 5 ноября, 2023 пользователем thermit Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
repstosw 18 9 ноября, 2023 Опубликовано 9 ноября, 2023 · Жалоба On 11/6/2023 at 2:48 AM, thermit said: Принципиально тут ничего оптимизировать нельзя. Сейчас смотрю в сторону преобразований Винограда и Китайскую теорему об остатках. Есть научные выкладки на сайте nasa.gov , что в алгоритме поиска синдромов можно сократить вычисления. Пришлось курить линейную алгебру, вспоминать матрицы, вектора и операции над ними. Пока работаю в поле GF(2^4) - это всего 16 элементов: 0..15 Собственно вопрос, как определить третий и пятый корни ? Порождающий полином: 1 + x + x^3. Поле GF(16) GF(2^4) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
repstosw 18 10 ноября, 2023 Опубликовано 10 ноября, 2023 (изменено) · Жалоба 20 hours ago, repstosw said: Собственно вопрос, как определить третий и пятый корни ? Порождающий полином: 1 + x + x^3. Поле GF(16) GF(2^4) Вопрос решён. Сделал имплементацию 3-точечного преобразования на Си - для GF(2^4): цикл нахождения синдромов длиной 15 итераций сжался до длины 5 итераций. Результат сравнил с результатами по старому методу. https://ipnpr.jpl.nasa.gov/progress_report/42-43/43Q.PDF Значит, аналогично можно сделать и для GF(2^16). Изменено 10 ноября, 2023 пользователем repstosw Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
repstosw 18 13 ноября, 2023 Опубликовано 13 ноября, 2023 · Жалоба Ещё одна статья, как быстро считать синдромы, применяя много-ступенчатое преобразование: https://ipnpr.jpl.nasa.gov/progress_report2/42-52/52J.PDF И ещё https://ipnpr.jpl.nasa.gov/progress_report2/42-54/54K.PDF Сделал 4-х ступенчатые преобразования для: GF(2^16): 3*5*17*257 и GF(2^12): 5*7*9*13 Выигрыш в скорости нахождения синдромов ошибок с помощью разложений - колоссален. Теперь слабым местом стал поиск Ченя. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
repstosw 18 15 ноября, 2023 Опубликовано 15 ноября, 2023 · Жалоба On 11/13/2023 at 11:24 AM, repstosw said: Теперь слабым местом стал поиск Ченя. Оптимизировал и его. Результат: Декодирование ускорено в 2.6 раз, кодирование - в 1.8 раз (по сравнению с исходным вариантом, для Cortex-A7). https://github.com/rep-stosw/reed-solomon Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться