Jump to content
    

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

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

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

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

Share this post


Link to post
Share on other sites

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

Edited by sasamy

Share this post


Link to post
Share on other sites

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 не умеет нормально загружать произвольные константы в свои регистры.

Edited by repstosw

Share this post


Link to post
Share on other sites

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

Функция:

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:

 

Share this post


Link to post
Share on other sites

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

 

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

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

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

Share this post


Link to post
Share on other sites

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

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

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

Share this post


Link to post
Share on other sites

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

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

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

Share this post


Link to post
Share on other sites

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

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

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

https://godbolt.org/z/M453na8zs

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

 

Edited by sasamy

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

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

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

Edited by sasamy

Share this post


Link to post
Share on other sites

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

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

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

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

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

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

Share this post


Link to post
Share on other sites

6 minutes ago, thermit said:

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

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

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

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

Share this post


Link to post
Share on other sites

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

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

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

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

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

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...