|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
05.09.2012, 17:32 | #1 |
Форумчанин
Регистрация: 25.09.2009
Сообщений: 234
|
Оптимизация кода (ускорение вычисления)
Доброе время суток! Вот такая проблемка возникла: слишком долго работает (было еще дольше, раз в 5 дольше чем сейчас - оптимизировал как смог... но все равно надо быстрее). Среда VS2010. Основная проблема естественно в циклах, все что не в них особой роли не сыграет. Вот блок программы:
Код:
|
05.09.2012, 18:14 | #2 |
Белик Виталий :)
Старожил
Регистрация: 23.07.2007
Сообщений: 57,097
|
Круто...
А задача какая?
I'm learning to live...
|
05.09.2012, 18:50 | #3 |
Форумчанин
Регистрация: 25.09.2009
Сообщений: 234
|
В кратце суть самой проги: в результате исследования получился некий снимок (для программы это файл-изображения в черно-белом формате: в среднем 100Х100... но чем больше прога вывезет тем лучше для исследования). Сама прога определяет уровень влияния (для упрощения) "каждого пикселя на каждый" (за исключением некоторых случаев. На выходе даем обработанное изображение (файл с цветами белый, черный, градации серого - т.е. крайний левый столбец RGB политры). Собственно как то так.
естественно что внутри циклов, при 100х100, операции повторяются 500 млдр раз!!! А ведь там куча умножений, встерчаются вычесления корней, cos, sin, exp ... короче много тяжеловесных радостей. я уже сократил вызовы корней и умножений (посредством ввода доп переменных), раскрыл пару exp вручную, убрал работу с комплексными числами (математика рулит - за комп посчитал и дал ему готовую формулу)... Сейчас занимаюсь распаралельванием (подключаю MPI)... Но все равно бы еще какие уловки по сокращению количества операций внутри циклов или их ускорению... или же ускорить проверки (if-ы... я как то косо поглядываю на вот эти строки: Код:
может кто увидит какие нибудь способы ускорения (например, за счет приведения к битовым операциям), или может по логике (где нить я пропустил) вообще что нить сократить и убрать пару операций умножения и т.п. P.S. убрать хотя бы одну операцию умножения это уже убрать 500 млрд умножений!!!))) При удаче с распаралельванием прога будет отрабатывать на кластере))) Забыл добавить... MPI я только читать начал, не говоря уже о практическом применении... поэтому если кто уже практиковал такое, от советов и предложений точно не откажусь))) Последний раз редактировалось Stilet; 05.09.2012 в 21:01. |
05.09.2012, 20:28 | #4 |
Форумчанин
Регистрация: 15.01.2010
Сообщений: 948
|
Для начала на само описание агоритма (на формулы) хорошо бы посмотреть. Вряд-ли без них кто-то здесь позволит себе роскошь в этот, без единого комментария, код закопаться. Места, в которые буквально вслепую ткнул пальцем:
1. Что такое w , k и d ? d - точно число с плавающей? Что это за волшебная константа 5000 ? 2. Код:
2.2. Зачем эта коррекция расстояния между столбцами, и почему таковой нет между строками? 3. Код:
Что до оптимизации, то, для начала, в реальных "молотильных" программах с матрицами никто никогда этим Сишным двуступенчатым выделением памяти не пользуется. Выделяют одномерный массив и работают с приведенным индексами. |
05.09.2012, 21:07 | #5 | |
Белик Виталий :)
Старожил
Регистрация: 23.07.2007
Сообщений: 57,097
|
Цитата:
Я правильно понимаю - допустим в координате 0,0 есть серый пиксель скажем процентов 20% в темную сторону. Соответственно есть некий коэффициент-критерий, который говорит о том куда темнота этого пикселя дотягивается, фактически просчитывается "тень" пикселя. Так? Тогда ты заранее знаешь что в координате скажем 10,10 затухание будет по некоторому закону, скажем по логарифму равно нулю - т.е. тень пикселя эту координату уже не может накрывать. Соответственно тебе относительно этого пикселя нужно просчитывать не всю матрицу а только ту, на которую падает тень. Я правильно понял задачу?
I'm learning to live...
|
|
05.09.2012, 21:43 | #6 | |
Старожил
Регистрация: 20.04.2008
Сообщений: 5,526
|
Цитата:
Код:
программа — запись алгоритма на языке понятном транслятору
|
|
05.09.2012, 22:05 | #7 |
Форумчанин
Регистрация: 15.01.2010
Сообщений: 948
|
Кстати, в самом внутреннем цикле (по t) я могу вынести за цикл домножение на mConstZnak (ну, теперь с к-том 5000, конечно) или мне только так кажется?
ADDED 20:23 CET: И к dz цикл по t, по-моему, тоже инвариантен?.. Последний раз редактировалось Stilet; 05.09.2012 в 23:01. |
05.09.2012, 22:48 | #8 |
Пользователь
Регистрация: 24.06.2012
Сообщений: 36
|
Я конечно новичок, но что если в более загруженных цыклах for применить модификатор register int.
|
06.09.2012, 09:02 | #9 | ||
Старожил
Регистрация: 20.04.2008
Сообщений: 5,526
|
еще вариант потребует дополнительной памяти
предварительно рассчитать результаты сравнений Цитата:
Код:
Цитата:
Код:
программа — запись алгоритма на языке понятном транслятору
Последний раз редактировалось evg_m; 06.09.2012 в 09:13. |
||
06.09.2012, 15:52 | #10 | |||||
Форумчанин
Регистрация: 25.09.2009
Сообщений: 234
|
Vago:
Цитата:
Код:
Цитата:
Код:
Код:
Цитата:
Цитата:
Цитата:
|
|||||
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Оптимизация кода | LatuSerge | Общие вопросы Delphi | 10 | 27.12.2011 01:51 |
Оптимизация кода в си | dampirik | Помощь студентам | 4 | 07.07.2009 11:30 |
Оптимизация кода | nusik | Общие вопросы Delphi | 2 | 21.05.2009 17:55 |
Оптимизация кода | Terran | Общие вопросы Delphi | 6 | 01.11.2008 16:57 |
Оптимизация кода | [Smarik] | Gamedev - cоздание игр: Unity, OpenGL, DirectX | 9 | 20.08.2008 15:00 |