Преобразование Гильберта на асме, срочно надо!

Тема в разделе "WASM.ASSEMBLER", создана пользователем alex_maslakov, 15 окт 2009.

Статус темы:
Закрыта.
  1. valterg

    valterg Active Member

    Публикаций:
    0
    Регистрация:
    19 авг 2004
    Сообщения:
    2.105
    Держи лентяй :)
    http://matlab.exponenta.ru/signalprocess/book1/12/hilbert.php
    Осталось только запрограммировать :)
    Там правда в алгоритме маленькая опечатка.
     
  2. alex_maslakov

    alex_maslakov New Member

    Публикаций:
    0
    Регистрация:
    15 окт 2009
    Сообщения:
    16
    Это конечно хорошо, спасибо.
    Вот только:
    1. Где там очепятка?
    2. Что запрограммить? Формулу как таковую я так и не нашел. Только алгоритм. Нужна хотя бы формула, которую потом уже можно запрограммить на MMX.
     
  3. TermoSINteZ

    TermoSINteZ Синоби даоса Команда форума

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.552
    Адрес:
    Russia
    alex_maslakov
    И так, вы ничего даже не почитали толком, по данной ссылке, судя по вашим вопросам.
    Признайтесь вы хотя бы ассемблер знаете? В чем тогда проблема алгоритм запрограммировать. ЗАЧЕМ вам формула, если есть уже алгоритм. Осталось только каждое действие запрограммировать.
    А то мы тут распинаемся, пытаемся вам помочь.. Вам в коммерц надо батенька. Это уже однозначно. Если не измените своего подхода - это тема будет закрыта, если не удалена.
     
  4. FatMoon

    FatMoon New Member

    Публикаций:
    0
    Регистрация:
    28 ноя 2002
    Сообщения:
    954
    Адрес:
    Russia
    Дык весь его наверно и не нужно переводить. Если тебя озадачили "без синусов-косинусов и деления", то вычисление массива Y можно оставить на дельфях, я полагаю?

    Разберем немного процедуру Conv, которую ты привел. Я не знаю, каков математический смысл Sh и So, но - дедуктивно! - предполагаю, что Sh - это количество данных в массиве (то есть, предельное значение i), а So - количество суммируемых узлов в сетке. Сравнения, из которых определяются начальное и конечное значение цикла по j - это для граничных случаев, начала (чтобы не начать от отрицательного значения) и конца (чтобы не перескочить через границу введенных данных). В остальном, вычисление суммы четко от i+1-So до i. Например, если So=2, то будут складываться
    y(1)*x(1)+y(2)*x(2)
    y(2)*x(2)+y(3)*x(3)
    и так далее. Если So=3, то слагаемых будет соответственно 3, и точно так же при So=1024 будет до 1024 слагаемых. К сожалению, тут нельзя ничего вынести за скобки :dntknw: Интересный момент - и то, и другое =1024, то есть слагаемых будет максимум 1024 (для i=1023), а остальные - это "краевые случаи" (причем их большинство).
    Предположим, мы можем загрузить сразу X(4),X(3),X(2),X(1) в один регистр, и умножить на Y(4), Y(3), Y(2), Y(1)... Потом занести X(5), X(4), X(3), X(2) во второй и умножить на Y(5),Y(4),Y(3), Y(2)... Потом сложить результаты. Мы сделали 5 операций (и только 3 арифметических!) - загрузка 1, умножение 1, загрузка 2, умножение 2, сложение 1 и 2. А получили в результате Y4*X4+Y5*X5, Y3*X3+Y4*X4, Y2*X2+Y3*X3, Y1*X1+Y2*X2. То есть, вместо 12 операций (8 умножений и 4 сложения) - только 3! Стоп, но это не совсем то, что нам надо? Не совсем, но похоже! Попробуй расписать на бумажке, как изменяются пределы цикла по j при заданных Sh=So=1024, при изменении i от 0 до 2*So-1. Потом попробуй расписать, как складываются произведения, хотя бы для 2-х или 3-х i. После этого чуть-чуть проясниться, как надо изменить алгоритм.
    А операции, загружающие сразу 4 вещественных 32-битных числа, умножающие по 4 числа, и складывающие по 4 числа - это SSE-инструкции, что-то типа addps-mulps. (Ага, ММХ нам не помогут - числа-то с плавающей точкой, а не целые! Только SSE)
     
  5. alex_maslakov

    alex_maslakov New Member

    Публикаций:
    0
    Регистрация:
    15 окт 2009
    Сообщения:
    16
    MMX препод сказал и все. Задание такое

    Я тоже не знаю, но предполагаю, что:
    Sh - size hillbert - это массив
    So - size original - тоже массив

    Сейчас почитаю, что ты написал, похоже на правду. Спасибо.
     
  6. valterg

    valterg Active Member

    Публикаций:
    0
    Регистрация:
    19 авг 2004
    Сообщения:
    2.105
    На MMX нельзя написать. Ты бы выложил все-таки текст на Дельфи полностью, иначе пока непонятно какой у тебя Гильберт - они разные бывают.
    А препод пусть вот это прочтет :
    http://ru.wikipedia.org/wiki/MMX
    http://ru.wikipedia.org/wiki/SSE
    В легковую машину конечно можно булыжники погрузить, но это будет некрасиво. Так и MMX.
    И никто не будет это дурацкое задание делать, если только за 500 баксов.
    А главное - раз задание именно конвеерные команды, то увы - здесь тебе вряд ли найти альтруистов - тяжелый случАй.
    Формулы там словами описаны. Реальные формулы наверняка есть в доках по Матлабу и в Интернете можно найти. Но мой интерес к этой проблеме уже закончилсь :)
     
  7. FatMoon

    FatMoon New Member

    Публикаций:
    0
    Регистрация:
    28 ноя 2002
    Сообщения:
    954
    Адрес:
    Russia
    Короче, когда распишешь на бумажке что именно складывается, надо использовать команды:

    addps - для сложения одновременно 4-х вещественных с другими 4-мя
    mulps - для умножения, аналогично
    movups - для загрузки из памяти и выгрузки в память в/из xmm-регистров

    Ну и в зависимости от алгоритма, который выберешь, может понадобиться еще

    subps - для 4-х вычитаний одновременно.
    shufps - для перестановки, поскольку там придется грузить или Y, или X в обратном порядке

    И при этом помнить, что все операции с памятью, кроме movups, требуют адреса, кратного 16 (иначе исключение) - то есть, это несколько усложнит задачу: или грузи в регистры, или рассчитывай алгоритм с шагом по 4 дворда.

    А еще надо рассмотреть вариант полного обращения элементов массива X, для удобства. В смысле, порядок элементов в памяти Х0, Х1, Х2, ..., Х1024 поменять на обратный, Х1024, Х1023, ..., Х2, Х1, Х0. Возможно, эта непредусмотренная процедура (на первый взгляд, все осложняющая), приведет к более простой записи циклов с SSE-операциями. Ничего более не могу добавить - вижу как минимум 3 разных варианта (начинать с середины, начинать с начала, считать единообразно и потом вычитать лишнее), но до конца додумывать не буду - работа, сорри =) Но это нормально для курсовой, при условии, что Гильберт был в лекциях, и ассемблер с SSE инструкциями тоже не для самостоятельного изучения оставлен... в смысле, где-то в лекциях упоминался. Интересно бы увидеть финальный алгоритм ;) Напишешь - запости.

    ЗЫ: я бы не стал наезжать на препода, преподы бывают разные. Кто-то обидится и припомнит, кто-то спохватится и извинится. Либо очень осторожно выяснить, в самом ли деле именно ММХ а не SSE, либо делать на SSE, а потом если что изобразить недоумение "Я думал это одно и тоже". Но "если что" не будет - задача именно на SSE, препод с вероятностью 95% имел в виду именно это.
    Тут смысла нет в ММХ - можно, но сложно, и никаких выйгрышей. Ну разве что, все сделать на FPU, и вставить две-три MMX-команды для выгрузки в память, просто чтобы препод отвязался (типа формально поставленные условия выполнены) =))). Или с помощью ММХ цикл инкрементировать, тоже смешно и бесполезно.
     
  8. valterg

    valterg Active Member

    Публикаций:
    0
    Регистрация:
    19 авг 2004
    Сообщения:
    2.105
    Формулы тут в конце. Много формул.
    h__p://w3.msi.vxu.se/exarb/mj_ex.pdf
    Теперь я кое-что прояснил для себя. Дискретное преобразование Гильберта может быть вычислено тремя способами :
    1) Через синусы-косинусы - это дискретное преобразование Фурье. Вроде наиболее точное.
    2) discrete convolution algorithm - быстрый, но не точный. Но в нем нужно насчитывать коэффициенты, а в них не только синусы, но и котангенсы.
    3) Через быстрое преобразование Фурье. Менее точный, но при 1024 точках вроде уже хорошо.
    Так как надо срочно, то единственный реальный вариант - посмотреть полный Дельфи и попробовать его в SSE запрограммировать. А преподу ткнуть в комментарий про xmm-регистры.
    Типа это mmx :derisive:
     
  9. ConstZ

    ConstZ New Member

    Публикаций:
    0
    Регистрация:
    18 фев 2008
    Сообщения:
    42
    David Hilbert, 1862 г.р. - он один такой :derisive:
    БПФ на 1024 точки дважды делать придётся, поэтому менее точную (почему?) свёртку широко применяют. Да и в исходном алгоритме TS она:
    Код (Text):
    1. // Оператор Дискретного Преобразования Гильберта (Функция для свёртки с оригиналом в результате которой получается Преобразование Гильберта)
    2. // y=2/(Pi*х) * sin^2((pi/2)*x)
    А что преподаватель MMX требует, - тоже правильно. PMADDx очень полезна в таких задачах.
     
  10. alex_maslakov

    alex_maslakov New Member

    Публикаций:
    0
    Регистрация:
    15 окт 2009
    Сообщения:
    16
    Ребята, говорю НАДО НА MMX.
     
  11. Aquila

    Aquila Самурай дзена

    Публикаций:
    0
    Регистрация:
    30 авг 2002
    Сообщения:
    1.467
    Адрес:
    Russia, Moscow
    Закрыто. Вся информация дана, если есть возможности - есть .COMMERCE.
     
Статус темы:
Закрыта.