Емельянов Эдуард Владимирович (eddy_em) wrote,
Емельянов Эдуард Владимирович
eddy_em

Categories:

Давненько я не писал

Что-то новогодние празднички сильно подзатянулись. Хоть я уже неделю как «вышел из запоя», ничего серьезного сделать не успел еще.
На сам НГ у нас были наблюдения: 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 надо всунуть, и для своих задач места оставить).
Tags: всячина
Subscribe

  • Опять Подорванка смыла мост

    В четверг лило настолько, что, похоже, опять на подорванке забилась стремнина бревнами, а потом внезапно это все прорвало. МЧСовсцы перетаскивали…

  • Diskworld

    Смотрели вчера с женой на кухне "Крепкого орешка" и зацепился мой взгляд за дочкину поделку: Я жене и говорю: прямо-таки просится эти белые…

  • Юпитер и Сатурн

    Слишком близко к Солнцу, чтобы что-то получилось, а также слишком разные по яркости, чтобы без обработки их можно было бы снять одновременно.

promo eddy_em august 17, 2019 12:33 3
Buy for 10 tokens
Юра намедни напечатал корпус для хронометра. Для первого блина получилось неплохо: И еще немного фотографий:
  • Post a new comment

    Error

    Anonymous comments are disabled in this journal

    default userpic
  • 0 comments