Рихтовка алгоритма
Feb. 7th, 2013 10:00 am![[personal profile]](https://www.dreamwidth.org/img/silk/identity/user.png)
Вчера провел небольшую "работу над ошибками" и нашел кое-какие мелкие "ашипки и очепятки", которые приводили к получению черт-те чего, но не того, что было нужно.
Пока что я и не думал об оптимизации: просто пробежался по полученной маске зеркала и в каждый "пиксель" с ненулевыми значениями маски "швырнул" N фотонов. N изменял от десяти тысяч до десяти миллионов. Так как заполнение матрицы изображения у меня выполняется только при помощи CPU (ну не работает почему-то у меня в куде атомарный инкремент!), сложно сказать, чьего вклада здесь больше. "Прямая" на графике "время/количество фотонов" получилась какой-то кривоватой. Возможно, еще неплохую роль сыграло то, что экспериментировал я с довольно "кривым" зеркалом, из-за чего от опыта к опыту количество ненулевых пикселей на маске менялось (в среднем их значение плавало около 29400).
Вот по этой табличке
получился такой график:
Грубая линейная аппроксимация дала: T = 4.7991·10¯⁴N + 76.438. Многовато будет: есть еще куда оптимизировать.
Так как маска у меня была маленькая (256×256 пикселей), максимальная интенсивность на изображении была несколько (примерно на 35%) меньше количества "фотонов" на пиксель маски. Увеличивать маску я не стал — уж очень долго бы процесс подсчета проходил.
Кстати, оказалось, что модель моя кривая: независимо от количества фотонов пики пятен представляли собой вот такое уродство: при том, что ожидалась форма куда как более гладкая! Сдается мне, что тип float был выбран неудачно. Надо попробовать с double (правда, прощай производительность!).
В общем, работать еще и работать! P.S. код я выложил на сосфорж.
Пока что я и не думал об оптимизации: просто пробежался по полученной маске зеркала и в каждый "пиксель" с ненулевыми значениями маски "швырнул" N фотонов. N изменял от десяти тысяч до десяти миллионов. Так как заполнение матрицы изображения у меня выполняется только при помощи CPU (ну не работает почему-то у меня в куде атомарный инкремент!), сложно сказать, чьего вклада здесь больше. "Прямая" на графике "время/количество фотонов" получилась какой-то кривоватой. Возможно, еще неплохую роль сыграло то, что экспериментировал я с довольно "кривым" зеркалом, из-за чего от опыта к опыту количество ненулевых пикселей на маске менялось (в среднем их значение плавало около 29400).
Вот по этой табличке
N, тысяч штук | T, секунд |
---|---|
10 | 50 |
50 | 73 |
100 | 102 |
200 | 160 |
500 | 303 |
1000 | 556 |
2000 | 1128 |
5000 | 2541 |
10000 | 4826 |
Так как маска у меня была маленькая (256×256 пикселей), максимальная интенсивность на изображении была несколько (примерно на 35%) меньше количества "фотонов" на пиксель маски. Увеличивать маску я не стал — уж очень долго бы процесс подсчета проходил.
Кстати, оказалось, что модель моя кривая: независимо от количества фотонов пики пятен представляли собой вот такое уродство: при том, что ожидалась форма куда как более гладкая! Сдается мне, что тип float был выбран неудачно. Надо попробовать с double (правда, прощай производительность!).
В общем, работать еще и работать! P.S. код я выложил на сосфорж.
no subject
Date: 2013-02-13 08:09 am (UTC)no subject
Date: 2013-02-13 08:21 am (UTC)no subject
Date: 2013-02-13 08:50 am (UTC)no subject
Date: 2013-02-13 09:42 am (UTC)Я сначала эту модель делал в октаве, но там получалось слишком грубо и медленно: этот вариант (даже еще не оптимизированный) за 5 минут выдает то, что октава считала бы неделю!
no subject
Date: 2013-02-13 11:51 am (UTC)