Перейти к содержанию
    

Определить корректирующую способность BCH кода

1 час назад, repstosw сказал:

Данный полином не удвовлетворил кодек Рида -Соломона.

Конечно. рс это 2^m-1. На счет медленнее - быстрее. Есть ветвление -  будут тормоза. Это правило. Избегать ветвлений.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

On 11/2/2023 at 11:28 AM, repstosw said:

В чём фокус? Функция попала целиком в кеш?  Или аппаратное выполнение по условию?

скорей всего в вашем наборе большинство данных меньше 65535, кстати попробуйте вариант modnn3()

https://godbolt.org/z/449ex98M7

https://scindeks-clanci.ceon.rs/data/pdf/1821-3251/2022/1821-32512202056S.pdf

Изменено пользователем sasamy

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 hours ago, sasamy said:

скорей всего в вашем наборе большинство данных меньше 65535, кстати попробуйте вариант modnn3()

https://godbolt.org/z/449ex98M7

unsigned int modnn3(unsigned int x)
{
  x=(x>>16)+(x&65535);
  x=(x>>16)+(x&65535);

 return x;
}

Даёт неверное значение при x=65535.  Должно быть 0, возвращает 65535.

А так, всё верно - тормоза при сравнении и вычитании, оно выходит составное:

 sub     r0, r0, #65280
 subs    r0, r0, #255

Всё потому, что ARM не умеет нормально загружать произвольные константы в свои регистры.

Изменено пользователем repstosw

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Тут  ещё попутно обнаружил, что компилятор создаёт монстров.

Функция:

unsigned int __attribute__ ((noinline)) modnnF(unsigned int x)
{
 while(x>=NN)
 {
  x-=NN;
  x=(x>>MM)+(x&NN);
 }
 return x;
}

Ассемблируется в полне нормальный вид:

modnnF:
	movw	r2, #65534
	cmp	r0, r2
	bxls	lr
.L3:
	sub	r0, r0, #65280
	sub	r0, r0, #255
	uxth	r3, r0
	add	r0, r3, r0, lsr #16
	cmp	r0, r2
	bhi	.L3
	bx	lr

Но если сделать так:

unsigned int __attribute__ ((noinline)) modnn1(unsigned int x)
{
 while(x>=NN)x-=NN;
 return x;
}

То на выходе будет ужас:

Spoiler
modnn1:
	movw	r3, #65534
	mov	r2, r0
	cmp	r0, r3
	bxls	lr
	sub	r0, r0, #65280
	movw	r1, #32769
	movt	r1, 32768
	sub	r0, r0, #255
	movw	r3, #65527
	umull	ip, r1, r1, r0
	movt	r3, 7
	cmp	r0, r3
	lsr	r1, r1, #15
	add	r1, r1, #1
	bls	.L8
	vdup.32	q8, r2
	vldr	d18, .L14
	vldr	d19, .L14+8
	vldr	d22, .L14+16
	vldr	d23, .L14+24
	vldr	d20, .L14+32
	vldr	d21, .L14+40
	vadd.i32	q8, q8, q9
	lsr	r0, r1, #2
	mov	r3, #0
.L9:
	vmov	q9, q8  @ v4si
	add	r3, r3, #1
	cmp	r0, r3
	vadd.i32	q8, q8, q11
	vadd.i32	q9, q9, q10
	bne	.L9
	bic	r3, r1, #3
	cmp	r1, r3
	sub	r3, r3, r3, lsl #16
	vmov.32	r0, d19[1]
	add	r2, r2, r3
	bxeq	lr
	sub	r0, r2, #65280
	sub	r0, r0, #255
.L8:
	movw	r3, #65534
	cmp	r0, r3
	bxls	lr
	mov	r0, #2
	movt	r0, 65534
	add	r0, r2, r0
	cmp	r0, r3
	bxls	lr
	mov	r0, #3
	movt	r0, 65533
	add	r0, r2, r0
	cmp	r0, r3
	bxls	lr
	sub	r0, r2, #261120
	sub	r0, r0, #1020
	cmp	r0, r3
	bxls	lr
	mov	r0, #5
	movt	r0, 65531
	add	r0, r2, r0
	cmp	r0, r3
	bxls	lr
	mov	r0, #6
	movt	r0, 65530
	add	r0, r2, r0
	cmp	r0, r3
	bxls	lr
	mov	r0, #7
	movt	r0, 65529
	add	r0, r2, r0
	cmp	r0, r3
	movhi	r0, #8
	movthi	r0, 65528
	addhi	r0, r2, r0
	bx	lr
.L15:
	.align	3
.L14:
	.word	0
	.word	-65535
	.word	-131070
	.word	-196605
	.word	-262140
	.word	-262140
	.word	-262140
	.word	-262140
	.word	-65535
	.word	-65535
	.word	-65535
	.word	-65535
	.size	modnn1, .-modnn1

 

GCC v. 10.3

Флаги компиляции:

CFLAGS=-DNDEBUG -DUSE_JPWL -Ofast -marm -mcpu=cortex-a7 -mfloat-abi=hard -mfpu=vfpv4 -mfpu=neon \
  -ftree-vectorize -fno-math-errno -fmax-errors=1 -ffunction-sections -fdata-sections

 

Как раз тот случай, когда считаешь компилятор дрУгом, а он оказывается врагом :lol:

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

20 minutes ago, repstosw said:

То на выходе будет ужас:

Если добавить барьер компилятору:

unsigned int __attribute__ ((noinline)) modnn1(unsigned int x)
{
 while(x>=NN)
 {
  x-=NN;
  asm volatile ("" ::: "memory");
 }
 return x;
}

То выглядит воплне прилично:

modnn1:
	movw	r3, #65534
	cmp	r0, r3
	bxls	lr
.L8:
	sub	r0, r0, #65280
	sub	r0, r0, #255
	cmp	r0, r3
	bhi	.L8
	bx	lr

 

Интересно, что-ж его понесло?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

On 11/2/2023 at 5:13 PM, repstosw said:

Интересно, что-ж его понесло?

думаю такие вещи надо руками писать, так работает ?

unsigned int modnn3(unsigned int x)
{
  unsigned int tmp = 65535;
  asm volatile ("cmp %0, %1\n\t"
    "subhs %0, %0, %1"
    :: "r" (x), "r" (tmp));
  return x;
}

https://godbolt.org/z/dd55Wjo68

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 часа назад, repstosw сказал:

Даёт неверное значение при x=65535.  Должно быть 0, возвращает 65535.

Не. Не надо на компилятор наезжать.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

On 11/2/2023 at 6:15 PM, thermit said:

Не. Не надо на компилятор наезжать.

я просто скопировал из статьи в лоб - у них наверняка еще "за кадром" изменения есть, жаль они не опубликовали исходники

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

20 минут назад, sasamy сказал:

я просто скопировал из статьи в лоб - у них наверняка еще "за кадром" изменения есть, жаль они не опубликовали исходники

Остается только на калькуляторе посчитать. Потом удивляемся, что ракеты не туда летят. Ну нажми на клавиши, продай талант. С какого хера 0?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

On 11/2/2023 at 6:59 PM, thermit said:

Остается только на калькуляторе посчитать. Потом удивляемся, что ракеты не туда летят. Ну нажми на клавиши, продай талант. С какого хера 0?

modnn1 - вариант из оригинального кода, для 65535 возвращает 0

https://godbolt.org/z/M453na8zs

внезапно остаток от деления 65535 на 65535 - 0

 

Изменено пользователем sasamy

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

    x=(x>>16)+(x&65535); при x=65535? Вы чего, издеваетесь? Я тут затрудняюсь что-либо возразить. Да хер с ним. Промолчу. Вам виднее.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

On 11/2/2023 at 7:53 PM, thermit said:

x=(x>>16)+(x&65535); при x=65535? Вы чего, издеваетесь? Я тут затрудняюсь что-либо возразить.

код и результат посмотрите прежде чем возражать, а то вы всё возражаете а о чём речь понять не можете - я предложил вариант из статьи про оптимизацию но он не подходит напрямую

Изменено пользователем sasamy

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Только что, sasamy сказал:

код и результат посмотрите прежде чем возражать, а то вы всё возражаете а о чём речь понять не можете

Ну давайте разберем.x=65535. Мы его эндим с 65535. Получаем 65535. И это чудо мы суммируем с 0. Что получится? Я пойду нахрен застрелюсь, если это будет 0. Обещаю.

7 минут назад, sasamy сказал:

код и результат посмотрите прежде чем возражать, а то вы всё возражаете а о чём речь понять не можете

Самый древний и убогий компилятор парсит эту конструкцию совершенно однозначно. Не надо фантазировать.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

6 minutes ago, thermit said:

Ну давайте разберем.x=65535. Мы его эндим с 65535. Получаем 65535. И это чудо мы суммируем с 0. Что получится? Я пойду нахрен застрелюсь, если это будет 0. Обещаю

Никто не спорит, что данное выражение даст 65535.

Но нам это не нужно!  Нам нужен остаток от деления на 65535.

Данное выражение не реализует остаток от деления на 65535.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 минуту назад, repstosw сказал:

Никто не спорит, что данное выражение даст 65535.

Но нам это не нужно!  Нам нужен остаток от деления на 65535.

Данное выражение не реализует остаток от деления на 65535.

Да. Так и есть. Все вычисления только через таблицу. Вы-то что хотите?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...