alexPec 6 December 4, 2024 Posted December 4, 2024 · Report post Всем доброго дня! Есть задача реализовать свертку исключительно в положительных числах - АЛУ не поддерживает отрицательные. После свертки можно что-то добавить или вычесть, но сама свертка (операции умножения и сложения) должна быть только в положительных числах. Проблема в том, что исходные наборы данных (функция и ядро свертки) содержат отрицательные числа. Т.е. нужно сделать свертку функций, представленных положительными и отрицательными числами, на АЛУ, поддерживающем только положительные числа. Нужно чтобы результат свертки в положительных числах (после какого-то преобразования результата "положительной" свертки - поделить, умножить, вычесть, прибавить что-то) совпадал с результатом свертки в исходных числах (положительных и отрицательных). Что-то не соображу сходу, такое возможно? Quote Share this post Link to post Share on other sites More sharing options...
Arlleex 334 December 4, 2024 Posted December 4, 2024 · Report post 22 минуты назад, alexPec сказал: Есть задача реализовать свертку исключительно в положительных числах - АЛУ не поддерживает отрицательные. Это у кого такой АЛУ, интереса ради? Quote Share this post Link to post Share on other sites More sharing options...
alexPec 6 December 4, 2024 Posted December 4, 2024 · Report post ПЛИСовый, самописный. Так проще - очень быстро. Quote Share this post Link to post Share on other sites More sharing options...
Arlleex 334 December 4, 2024 Posted December 4, 2024 · Report post Организовать флаги отрицательного результата и переполнения нынче в ПЛИС слишком дорого? Больше для работы с представлением отрицательных чисел ничего не нужно. Quote Share this post Link to post Share on other sites More sharing options...
Alex11 13 December 4, 2024 Posted December 4, 2024 · Report post Арифметика показывает, что нереально. Даже если исходные данные сместить в положительную область, там появляется операция вычитания, которая может выдать отрицательный результат. Можно обойтись чисто положительным умножителем, но сложение и вычитание должно быть со знаком. 1 Quote Share this post Link to post Share on other sites More sharing options...
_4afc_ 50 December 4, 2024 Posted December 4, 2024 · Report post 2 hours ago, alexPec said: ПЛИСовый, самописный. Так проще - очень быстро. С каких пор АЛУ, хоть в ПЛИС хоть где - стал работать со знаковыми числами? Переполнение само по себе вроде знак распространяет? Quote Share this post Link to post Share on other sites More sharing options...
alexPec 6 December 4, 2024 Posted December 4, 2024 · Report post 1 час назад, _4afc_ сказал: С каких пор АЛУ, хоть в ПЛИС хоть где - стал работать со знаковыми числами? Переполнение само по себе вроде знак распространяет? Чтобы было понятно проблему, для знаковых int8: -1*20 = 0xffec = -20 для беззнаковых uint8 255*20 =13ec Не вдаваясь в детали аппаратной реализации, скажу что никак не могу сделать из 13ec ffec. Понятно что надо просто распространить знак на все остальные старшие разряды, но сделать это в моем случае нельзя. Поэтому дальше в сумматор идет не 0xffec (как надо бы), а 0x13ec. Между умножителем и сумматором я не могу производить никаких действий. Можно добавить а исходным данным 128 (и к ядру, и к функции), но это уже будет совсем другая свертка, и к исходной результат "смещенной" не преобразовать, или я не прав? Quote Share this post Link to post Share on other sites More sharing options...
_4afc_ 50 December 4, 2024 Posted December 4, 2024 · Report post 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]}; // беззнаковое умножение Quote Share this post Link to post Share on other sites More sharing options...
alexPec 6 December 4, 2024 Posted December 4, 2024 · Report post 2 часа назад, _4afc_ сказал: 65535*20=13FFEC assign C16={{8{A8[7]}},A8[7:0]} * {{8{B8[7]}},B8[7:0]}; // беззнаковое умножение Входные данные - 8бит unsigned. Это тоже исходное условие. Quote Share this post Link to post Share on other sites More sharing options...
_4afc_ 50 December 4, 2024 Posted December 4, 2024 · Report post 3 hours ago, alexPec said: Входные данные - 8бит unsigned. Это тоже исходное условие. В смысле в диапазоне 0-255? А коэффициенты signed +-127? А акумулятор сколько разрядов? pipeline регистры в умножителе есть? PS: результат операции {} - всегда "беззнаковый" для синтезатора 1 Quote Share this post Link to post Share on other sites More sharing options...
alexPec 6 December 5, 2024 Posted December 5, 2024 · Report post 12 часов назад, _4afc_ сказал: В смысле в диапазоне 0-255? А коэффициенты signed +-127? Да. диапазоны такие, все верно Аккумулятор 32разряда Регистр только на выходе аккумулятора Quote Share this post Link to post Share on other sites More sharing options...
_4afc_ 50 December 5, 2024 Posted December 5, 2024 · Report post 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 библиотеке: там тоже знаковое умножение было выполнено как беззнаковое с инверсией старших бит, только сейчас не могу найти этот текст... Quote Share this post Link to post Share on other sites More sharing options...
Diusha 1 December 9, 2024 Posted December 9, 2024 (edited) · Report post Разбиваем 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 December 9, 2024 by Diusha Quote Share this post Link to post Share on other sites More sharing options...
alexPec 6 December 10, 2024 Posted December 10, 2024 · Report post Спасибо! Как вариант, но к сожалению, в моем случае это 4х кратное увеличение времени, теряется весь смысл быстро вычислять ... Quote Share this post Link to post Share on other sites More sharing options...
Diusha 1 December 12, 2024 Posted December 12, 2024 · Report post 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 нечасто меняют знак. Еще (под)вариант – скопипастить еще одно АЛУ. 1 Quote Share this post Link to post Share on other sites More sharing options...