Автор |
Сообщение |
|
|
Заголовок сообщения: |
|
|
|
Одна из наиболее насущных проблем при программировании ядер SEAforth40 - относительно небольшой объем оперативной памяти, вследстии чего, приходится постоянно искать компромис между привычным стилем программирования на Форте - определение "мелких" слов и их последующий вызов и "ассемблерным" стилем - прямой код + макровставки. Иногда ценой "красивого" структурированного кода можно выиграть пару-тройку свободных слов.
Контроль размера кода лежит на программисте, т.к. компилятор о выходе за границу 64х слов скромно умалчивает ( по крайней мере та версия, что установлена у меня).
Есть и альтернативный выход - исполнение кода с одного (или нескольких) из портов, объем линейной программы для ядра при этом может дорасти слов до 250-ти--300, но ценой снижения скорости исполнения (где-то 1,5--2 раза)
Одна из наиболее насущных проблем при программировании ядер SEAforth40 - относительно небольшой объем оперативной памяти, вследстии чего, приходится постоянно искать компромис между привычным стилем программирования на Форте - определение "мелких" слов и их последующий вызов и "ассемблерным" стилем - прямой код + макровставки. Иногда ценой "красивого" структурированного кода можно выиграть пару-тройку свободных слов.
Контроль размера кода лежит на программисте, т.к. компилятор о выходе за границу 64х слов скромно умалчивает ( по крайней мере та версия, что установлена у меня).
Есть и альтернативный выход - исполнение кода с одного (или нескольких) из портов, объем линейной программы для ядра при этом может дорасти слов до 250-ти--300, но ценой снижения скорости исполнения (где-то 1,5--2 раза)
|
|
|
|
Добавлено: Сб дек 26, 2009 14:18 |
|
|
|
|
|
Заголовок сообщения: |
|
|
|
для N=16 конвейер короткий получается. Т.е. у вас "степень" параллелизма 4. А влоб было 16. А эффективность быстрого преобразования для такой размерности выше ломового всего в три раза.
Т.е. 3*4<16
Все логично.
N увеличивайте. Или/и этапы распараллеливайте.
для N=16 конвейер короткий получается. Т.е. у вас "степень" параллелизма 4. А влоб было 16. А эффективность быстрого преобразования для такой размерности выше ломового всего в три раза.
Т.е. 3*4<16
Все логично.
N увеличивайте. Или/и этапы распараллеливайте.
|
|
|
|
Добавлено: Чт дек 17, 2009 23:54 |
|
|
|
|
|
Заголовок сообщения: |
|
|
|
распараллеливание ручное в данном случае.
распараллеливание ручное в данном случае.
|
|
|
|
Добавлено: Чт дек 17, 2009 15:25 |
|
|
|
|
|
Заголовок сообщения: |
|
|
|
хм... не может ли быть так, что распараллеливание - само настолько сложный алгоритм, что приносит пользу только если его "выполнил сложный компилятор зараннее" а в случае с простым компилятором форта ... ?
хм... не может ли быть так, что распараллеливание - само настолько сложный алгоритм, что приносит пользу только если его "выполнил сложный компилятор зараннее" а в случае с простым компилятором форта ... ?
|
|
|
|
Добавлено: Чт дек 17, 2009 14:17 |
|
|
|
|
|
Заголовок сообщения: |
|
|
|
forther писал(а): А быстрое преобразование Хартли будет?
что-то черновые результаты по быстрому алгоритму Хартли не очень радуют, по крайней мере для выбранной на данный момент стратегии: задействовано всего 7 ядер, распараллеливание конвейерное по этапам, локализация вычислений в ядрах (одно или два ядра выполняют преобразования этапа - или расчёт бабочек, или перемежение данных, или генерацию индексов).
по времени получается пока от прихода сигнала до выдачи спектра Хартли приходит около 10000 тиков (ну или примерно 14 мкс). на последний этап уходит порядка 6000 тиков (при удачном раскладе можно попробовать уложиться в 2000-3000 тиков ), что и определит скорость преобразования в непрерывном режиме работы (для метода грубой силы получалось почти в два раза быстрее, да и алгоритмы работы ядер по-проще).
[quote="forther"]А быстрое преобразование Хартли будет?[/quote]
что-то черновые результаты по быстрому алгоритму Хартли не очень радуют, по крайней мере для выбранной на данный момент стратегии: задействовано всего 7 ядер, распараллеливание конвейерное по этапам, локализация вычислений в ядрах (одно или два ядра выполняют преобразования этапа - или расчёт бабочек, или перемежение данных, или генерацию индексов).
по времени получается пока от прихода сигнала до выдачи спектра Хартли приходит около 10000 тиков (ну или примерно 14 мкс). на последний этап уходит порядка 6000 тиков (при удачном раскладе можно попробовать уложиться в 2000-3000 тиков ), что и определит скорость преобразования в непрерывном режиме работы (для метода грубой силы получалось почти в два раза быстрее, да и алгоритмы работы ядер по-проще). :-)
|
|
|
|
Добавлено: Чт дек 17, 2009 14:10 |
|
|
|
|
|
Заголовок сообщения: |
|
|
|
И, как вы и сами наверно уже догадались, было бы ошибкой тащить это в цикл, чтоб поделить на 16.
Код: : d16/ $3fff0 # and a! +* +* +* +* a@ ;
И, как вы и сами наверно уже догадались, было бы ошибкой тащить это в цикл, чтоб поделить на 16.
[code]: d16/ $3fff0 # and a! +* +* +* +* a@ ;[/code]
|
|
|
|
Добавлено: Ср дек 09, 2009 10:01 |
|
|
|
|
|
Заголовок сообщения: |
|
|
|
хм..... не в пример проще
хм..... не в пример проще :-)
|
|
|
|
Добавлено: Вт дек 08, 2009 19:39 |
|
|
|
|
|
Заголовок сообщения: |
|
|
|
почти
: d2/ 2/ 2* a! +*
a@ ;
почти
: d2/ 2/ 2* a! +*
a@ ;
|
|
|
|
Добавлено: Вт дек 08, 2009 18:56 |
|
|
|
|
|
Заголовок сообщения: |
|
|
|
forther писал(а): diver писал(а): заменить деление сдвигом (но баловаться со сдвигами чисел двойной точности то ещё удовольствие) Показать "ответ" или сами попробуете? Есть (на мой взгляд) элегантный вариант d2/. Конечно, как задача для всех она не подходит, потому что завязана на специфику SEAforth. Но вы, если подумаете, то сможете найти это решение.
примерно как-то так :
Код: : d2/ ( dh dl -- d2/h d2/l ) \ используем особенности реализации команды +* a! dup push \ a=dl ; -- dh ; r: -- dh dup xor \ -- 0 ; a=dl r: -- dh pop \ -- 0 dh ; a=dl r: -- . +* \ -- 0 dh2/ ; a=мл.бит_dh_dl/2; push \ -- 0 ; a=мл.бит_dh_dl/2; r: -- dh/2 drop pop a@ \ -- d2/h d2/l ;
[quote="forther"][quote="diver"]заменить деление сдвигом (но баловаться со сдвигами чисел двойной точности то ещё удовольствие)[/quote]
Показать "ответ" или сами попробуете? Есть (на мой взгляд) элегантный вариант d2/. Конечно, как задача для всех она не подходит, потому что завязана на специфику SEAforth. Но вы, если подумаете, то сможете найти это решение.[/quote]
примерно как-то так :-) :
[code] : d2/ ( dh dl -- d2/h d2/l ) \ используем особенности реализации команды +* a! dup push \ a=dl ; -- dh ; r: -- dh dup xor \ -- 0 ; a=dl r: -- dh pop \ -- 0 dh ; a=dl r: -- . +* \ -- 0 dh2/ ; a=мл.бит_dh_dl/2; push \ -- 0 ; a=мл.бит_dh_dl/2; r: -- dh/2 drop pop a@ \ -- d2/h d2/l ; [/code]
|
|
|
|
Добавлено: Вт дек 08, 2009 12:55 |
|
|
|
|
|
Заголовок сообщения: |
|
|
|
побалуюсь ещё.
:-) побалуюсь ещё.
|
|
|
|
Добавлено: Пн дек 07, 2009 23:34 |
|
|
|
|
|
Заголовок сообщения: |
|
|
|
diver писал(а): заменить деление сдвигом (но баловаться со сдвигами чисел двойной точности то ещё удовольствие)
Показать "ответ" или сами попробуете? Есть (на мой взгляд) элегантный вариант d2/. Конечно, как задача для всех она не подходит, потому что завязана на специфику SEAforth. Но вы, если подумаете, то сможете найти это решение.
[quote="diver"]заменить деление сдвигом (но баловаться со сдвигами чисел двойной точности то ещё удовольствие)[/quote]
Показать "ответ" или сами попробуете? Есть (на мой взгляд) элегантный вариант d2/. Конечно, как задача для всех она не подходит, потому что завязана на специфику SEAforth. Но вы, если подумаете, то сможете найти это решение.
|
|
|
|
Добавлено: Пн дек 07, 2009 23:01 |
|
|
|
|
|
Заголовок сообщения: |
|
|
|
forther писал(а): А быстрое преобразование Хартли будет?
Если в "бабочках" разберусь .
[quote="forther"]А быстрое преобразование Хартли будет?[/quote]
Если в "бабочках" разберусь :-).
|
|
|
|
Добавлено: Пн дек 07, 2009 23:01 |
|
|
|
|
|
Заголовок сообщения: |
|
|
|
А быстрое преобразование Хартли будет?
А быстрое преобразование Хартли будет?
|
|
|
|
Добавлено: Пн дек 07, 2009 22:51 |
|
|
|
|
|
Заголовок сообщения: |
|
|
|
mOleg, ссылки на источники завтра добавлю и на преобразования и на доки по процессору. С кпк это не очень удобно .
forther писал(а): Здорово! Большое спасибо. А без деления на константу нельзя было обойтись?
В принципе можно попробовать, варианты могут быть следующие:
- учесть константу при задании таблиц cas(vt);
- работать с операндами такой длиры, чтобы результат произведения был не более 18-ти бит (в принципе для случая обработки сигналов с АЦП ситуация реальная);
- заменить деление сдвигом (но баловаться со сдвигами чисел двойной точности то ещё удовольствие);
- дописать умножение 2-словного числа на 1-словное.
Если рассматривать в плане выигрыша по времени - реальнее вариант второй. Остальные дадут порядка сотни тактов.
mOleg, ссылки на источники завтра добавлю и на преобразования и на доки по процессору. С кпк это не очень удобно . :-)
[quote="forther"]Здорово! Большое спасибо. А без деления на константу нельзя было обойтись?[/quote]
В принципе можно попробовать, варианты могут быть следующие:
- учесть константу при задании таблиц cas(vt);
- работать с операндами такой длиры, чтобы результат произведения был не более 18-ти бит (в принципе для случая обработки сигналов с АЦП ситуация реальная);
- заменить деление сдвигом (но баловаться со сдвигами чисел двойной точности то ещё удовольствие);
- дописать умножение 2-словного числа на 1-словное.
Если рассматривать в плане выигрыша по времени - реальнее вариант второй. Остальные дадут порядка сотни тактов.
|
|
|
|
Добавлено: Пн дек 07, 2009 22:30 |
|
|
|
|
|
Заголовок сообщения: |
|
|
|
Здорово! Большое спасибо. А без деления на константу нельзя было обойтись?
Здорово! Большое спасибо. А без деления на константу нельзя было обойтись?
|
|
|
|
Добавлено: Пн дек 07, 2009 21:27 |
|
|
|
|