Jump to content
    

Свертка в положительных числах, возможно?

Всем доброго дня!
Есть задача реализовать свертку исключительно в положительных числах - АЛУ не поддерживает отрицательные. После свертки можно что-то добавить или вычесть, но сама свертка (операции умножения и сложения) должна быть только в положительных числах.
Проблема в том, что исходные наборы данных (функция и ядро свертки) содержат отрицательные числа.

Т.е. нужно сделать свертку функций, представленных положительными и отрицательными числами, на АЛУ, поддерживающем только положительные числа.

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

Что-то не соображу сходу, такое возможно?

Share this post


Link to post
Share on other sites

22 минуты назад, alexPec сказал:

Есть задача реализовать свертку исключительно в положительных числах - АЛУ не поддерживает отрицательные.

Это у кого такой АЛУ, интереса ради?

Share this post


Link to post
Share on other sites

Организовать флаги отрицательного результата и переполнения нынче в ПЛИС слишком дорого?

Больше для работы с представлением отрицательных чисел ничего не нужно.

Share this post


Link to post
Share on other sites

Арифметика показывает, что нереально. Даже если исходные данные сместить в положительную область, там появляется операция вычитания, которая может выдать отрицательный результат. Можно обойтись чисто положительным умножителем, но сложение и вычитание должно быть со знаком.

Share this post


Link to post
Share on other sites

2 hours ago, alexPec said:

ПЛИСовый, самописный. Так проще - очень быстро. 

С каких пор АЛУ, хоть в ПЛИС хоть где - стал работать со знаковыми числами? Переполнение само по себе вроде знак распространяет?

Share this post


Link to post
Share on other sites

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

С каких пор АЛУ, хоть в ПЛИС хоть где - стал работать со знаковыми числами? Переполнение само по себе вроде знак распространяет?

Чтобы было понятно проблему, для знаковых int8:

-1*20 = 0xffec = -20

для беззнаковых uint8

255*20 =13ec

Не вдаваясь в детали аппаратной реализации, скажу что никак не могу сделать из 13ec ffec. Понятно что надо просто распространить знак на все остальные старшие разряды, но сделать это в моем случае нельзя. 

Поэтому дальше в сумматор идет не 0xffec (как надо бы), а 0x13ec. Между умножителем и сумматором я не могу производить никаких действий.

Можно добавить а исходным данным 128 (и к ядру, и к функции), но это уже будет совсем другая свертка, и к исходной результат "смещенной" не преобразовать, или я не прав?

 

 

Share this post


Link to post
Share on other sites

1 hour ago, alexPec said:

255*20 =13ec

65535*20=13FFEC

 

1 hour ago, alexPec said:

Понятно что надо просто распространить знак на все остальные старшие разряды, но сделать это в моем случае нельзя. 

Между умножителем и сумматором я не могу производить никаких действий.

assign C16={{8{A8[7]}},A8[7:0]} * {{8{B8[7]}},B8[7:0]}; // беззнаковое умножение

 

Share this post


Link to post
Share on other sites

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

65535*20=13FFEC

 

assign C16={{8{A8[7]}},A8[7:0]} * {{8{B8[7]}},B8[7:0]}; // беззнаковое умножение

 

Входные данные - 8бит unsigned. Это тоже исходное условие.

Share this post


Link to post
Share on other sites

3 hours ago, alexPec said:

Входные данные - 8бит unsigned. Это тоже исходное условие.

В смысле в диапазоне 0-255? А коэффициенты signed +-127?

А акумулятор сколько разрядов?

pipeline регистры в умножителе есть?

 

PS: результат операции {} - всегда "беззнаковый" для синтезатора

Share this post


Link to post
Share on other sites

12 часов назад, _4afc_ сказал:

В смысле в диапазоне 0-255? А коэффициенты signed +-127?

 

Да. диапазоны такие, все верно

Аккумулятор 32разряда

Регистр только на выходе аккумулятора

Share this post


Link to post
Share on other sites

31 minutes ago, alexPec said:

Да. диапазоны такие, все верно

Почитайте пока Signed serial-/parallel multiplication, особенно в части:

Quote

Inverting the sign bit and adding zero as MSB adds the positive weight of the sign bit and guarantees a non-negative number.

 

Что-то подобное я видел в исходниках VHDL ieee библиотеке: там тоже знаковое умножение было выполнено как беззнаковое с инверсией старших бит, только сейчас не могу найти этот текст...

Share this post


Link to post
Share on other sites

Разбиваем f(x) на 2 функции:

f(x) = fp(x)–fm(x),

где

fp(x)=f(x) при f(x)>=0, fp(x)=0 при f(x)<0,

fm(x)=–f(x) при f(x)<=0, fm(x)=0 при f(x)>0.

fp и fm – неотрицательные функции.

То же самое делаем с g и тупо подставляем в формулу свертки (S – сумма):

S[y=1...M][f(y)*g(x-y)] =

= S[y=1...M][(fp(y)-fm(y))*(gp(x-y)gm(x-y))] =

= S[fp*gp]+S[fm*gm]S[fp*gm]S[fm*gp]

Надо просто вычислить 4 свертки c неотрицательными функциями.

Edited by Diusha

Share this post


Link to post
Share on other sites

Спасибо!

Как вариант, но к сожалению, в моем случае это 4х кратное увеличение времени, теряется весь смысл быстро вычислять ...

Share this post


Link to post
Share on other sites

S[fp*gp] и S[fm*gm] можно объединить в одну свертку. Так же S[fp*gm] и S[fm*gp] тоже в одну свертку (вторую). Потом из 1-ой вычесть 2-ю.

Если при 2-кратном увеличении времени смысл все равно теряется, то можно обратить внимание, что количество перемножений, когда ОБА сомножителя не нулевые, ровно такое же, как в исходном случае. Поэтому можно было бы не выполнять умножение и прибавление, если хотя бы один из множителей 0. Но это сыграло бы роль только если у Вас умножение выполняется не «мгновенно».

Или вычислять 2 свертки не по всем точкам, а по участкам 2-х типов: (а) f(y) и g(x-y) имеют одинаковый знак и (б) разные. Количество операций такое же, как в исходном. Но это оправдано, если только f и g нечасто меняют знак.

Еще (под)вариант – скопипастить еще одно АЛУ.

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...