Давненько я не писал
Jan. 17th, 2013 09:28 am![[personal profile]](https://www.dreamwidth.org/img/silk/identity/user.png)
Что-то новогодние празднички сильно подзатянулись. Хоть я уже неделю как «вышел из запоя», ничего серьезного сделать не успел еще.
На сам НГ у нас были наблюдения: 31 декабря и 1 января. Причем первого было совсем «весело»: до утра сидели из-за того, что решили обнулить по-человечески датчики A и Z БТА, причем обнуление прошло успешно далеко не с первого раза… Еще должны были быть наблюдения 8 января, но как только мы открылись и собрались фокусироваться, начался такой ветродуй, что пришлось закрываться. Бывает здесь такое: небо вроде идеальное, а ветер — больше 20м/с.
Пока у нас тишина с ИК (денег-то все равно не будет до марта-апреля), я решил заняться двумя полезными вещами: на работе сделать человеческую модель «кривого зеркала» (по которой можно было бы все свои методы анализа гартманнограмм отлаживать — а то появились кое-какие идеи), а дома — дописать свою CGI'шную библиотеку (добавить простые вебсокеты).
Оба занятия оказались не такими уж и простыми: приличных работающих библиотек вебсокетов я не нашел, поэтому открыл стандарт и стал перепиливать нерабочую (а нерабочая была написана еще 3 года назад, когда стандарты другими были).
Моделирование потребовало еще уймы дополнительных вычислительных процедур: сразу же я столкнулся с необходимостью делать интерполяцию данных. Попробовал B-сплайны (по статье Ruijters, Romeny & Suetens «Efficient GPU-Based Texture Interpolation using Uniform B-Splines») — получилась какая-то фигня. Вот, например, этот тестовый кусок
превращается черт те во что:
Придется ковырять более сложные методы. Хотя этот был таким заманчивым. Совершенно простой код:
Да, еще. Я решил заодно обкатать возможность совмещения вычислений на GPU и на CPU. Наделал макросов (кривоватых, правда) и сделал обертку, которая в случае, если пакет компилировался на системе с кудой, сначала пытается запустить ресурсоемкую задачу на GPU. Если не получается — задача отдается CPU. Если и там не выходит — увы, ошибка.
Из-за этого своего хотения я получил еще дополнительные проблемы, т.к. простенький код для CUDA надо будет еще и дублировать для OpenMP, что посложнее. OpenCL использовать не хочу: уж больно уродские там конструкции.
Изготовление платы я пока забросил. Оказалось, что подложка от самоклейки не годится: дорожки отвалились от нее еще в самом принтере. Надо будет попробовать со страничкой из линукс-формата (если я еще эту макулатуру не выкинул).
Учитывая то, что лучше всего у меня продвигаются дела с вебсокетами, следующая статейка, похоже, будет про них. Заодно обругаю дурацкий стандарт, из-за которого простенький код разросся так, что может быть даже не влезет в мегабайт памяти STM32F4xx (а ведь туда еще и стек IP надо всунуть, и для своих задач места оставить).
На сам НГ у нас были наблюдения: 31 декабря и 1 января. Причем первого было совсем «весело»: до утра сидели из-за того, что решили обнулить по-человечески датчики A и Z БТА, причем обнуление прошло успешно далеко не с первого раза… Еще должны были быть наблюдения 8 января, но как только мы открылись и собрались фокусироваться, начался такой ветродуй, что пришлось закрываться. Бывает здесь такое: небо вроде идеальное, а ветер — больше 20м/с.
Пока у нас тишина с ИК (денег-то все равно не будет до марта-апреля), я решил заняться двумя полезными вещами: на работе сделать человеческую модель «кривого зеркала» (по которой можно было бы все свои методы анализа гартманнограмм отлаживать — а то появились кое-какие идеи), а дома — дописать свою CGI'шную библиотеку (добавить простые вебсокеты).
Оба занятия оказались не такими уж и простыми: приличных работающих библиотек вебсокетов я не нашел, поэтому открыл стандарт и стал перепиливать нерабочую (а нерабочая была написана еще 3 года назад, когда стандарты другими были).
Моделирование потребовало еще уймы дополнительных вычислительных процедур: сразу же я столкнулся с необходимостью делать интерполяцию данных. Попробовал B-сплайны (по статье Ruijters, Romeny & Suetens «Efficient GPU-Based Texture Interpolation using Uniform B-Splines») — получилась какая-то фигня. Вот, например, этот тестовый кусок
0.117 1.132 0.034 1.035
превращается черт те во что:
0.137 0.185 0.284 0.440 0.642 0.872 1.116 1.357 0.133 0.181 0.280 0.435 0.638 0.867 1.112 1.354 0.125 0.173 0.272 0.427 0.630 0.859 1.104 1.347 0.112 0.161 0.259 0.414 0.616 0.846 1.092 1.337 0.099 0.147 0.245 0.400 0.602 0.832 1.079 1.325 0.088 0.136 0.234 0.388 0.590 0.819 1.067 1.315 0.085 0.133 0.230 0.383 0.584 0.813 1.060 1.308 0.091 0.138 0.235 0.388 0.587 0.815 1.061 1.306
Придется ковырять более сложные методы. Хотя этот был таким заманчивым. Совершенно простой код:
__device__ float interpolate_bicubic(float x, float y){
// transform the coordinate from [0,extent] to [-0.5, extent-0.5]
float2 coord_grid = make_float2(x - 0.5f, y - 0.5f);
float2 index = floor(coord_grid);
float2 fraction = coord_grid - index;
float2 one_frac = 1.0f - fraction;
float2 one_frac2 = one_frac * one_frac;
float2 fraction2 = fraction * fraction;
float2 w0 = one_frac2 * one_frac / 6.f;
float2 w1 = 2.0f/3.0f - fraction2 * (1.0f - fraction / 2.f);
float2 w2 = 2.0f/3.0f - one_frac2 * (1.0f + fraction) / 2.f;
float2 w3 = fraction2 * fraction / 6.f;
float2 g0 = w0 + w1;
float2 g1 = w2 + w3;
// h0 = w1/g0 - 1, move from [-0.5, extent-0.5] to [0, extent]
float2 h0 = (w1 / g0) - 0.5f + index;
float2 h1 = (w3 / g1) + 1.5f + index;
// fetch the four linear interpolations
float tex00 = tex2D(data_texture, h0.x, h0.y);
float tex10 = tex2D(data_texture, h1.x, h0.y);
float tex01 = tex2D(data_texture, h0.x, h1.y);
float tex11 = tex2D(data_texture, h1.x, h1.y);
// weigh along the y-direction
tex00 = lerp(tex01, tex00, g0.y);
tex10 = lerp(tex11, tex10, g0.y);
// weigh along the x-direction
//return tex2D(data_texture, x+0.5,y+0.5);
return lerp(tex10, tex00, g0.x);
}
Да, еще. Я решил заодно обкатать возможность совмещения вычислений на GPU и на CPU. Наделал макросов (кривоватых, правда) и сделал обертку, которая в случае, если пакет компилировался на системе с кудой, сначала пытается запустить ресурсоемкую задачу на GPU. Если не получается — задача отдается CPU. Если и там не выходит — увы, ошибка.
Из-за этого своего хотения я получил еще дополнительные проблемы, т.к. простенький код для CUDA надо будет еще и дублировать для OpenMP, что посложнее. OpenCL использовать не хочу: уж больно уродские там конструкции.
Изготовление платы я пока забросил. Оказалось, что подложка от самоклейки не годится: дорожки отвалились от нее еще в самом принтере. Надо будет попробовать со страничкой из линукс-формата (если я еще эту макулатуру не выкинул).
Учитывая то, что лучше всего у меня продвигаются дела с вебсокетами, следующая статейка, похоже, будет про них. Заодно обругаю дурацкий стандарт, из-за которого простенький код разросся так, что может быть даже не влезет в мегабайт памяти STM32F4xx (а ведь туда еще и стек IP надо всунуть, и для своих задач места оставить).