Занимаюсь эмуляцией физического процесса. Хочется перенести его на GPU.
Есть много (~миллионы) частиц, у каждой из которых N (~тысячи) параметров (на самом деле, либо много частиц, либо много параметров, но не того и другого сразу)
Есть глобальные параметры: вектор из K величин, которые задают свойства окружения.
Параметры частиц меняются по простой формуле (функция из арифметических операций от параметров частицы и глобальных параметров).
Задача 1: собственно, эмуляция. При данном значении глобальных параметров и данном значении параметров частиц рассчитать параметры частиц через шаг времени dt.
Задача 2(более актуальна): подбор оптимальных глобальных параметров. Есть критерий качества установки, который является функцией от глобальных параметров, и считается как сумма некой f(глоб. параметры, частица) по всем частицам. f дифференцируема по глобальным параметрам, поэтому можно воспользоваться градиентным спуском. Поэтому думаю сделать так: записываю параметры частиц в текстуру, где строчка - частица, столбец - параметр. Если надо - использую несколько текстур. Изначально глобальные параметры генерируются случайно, в каком-то разумном диапазоне. Шейдер принимает на вход текстуры и текущее значение глобальных параметров, на выходе - сумму градиентов (куда надо сместить глобальные параметры). Программа смещает параметры, и снова пропускает через шейдер. Повторяет до сходимости.
Собственно, вопрос:
Насколько адекватен подход в целом, и какие подводные камни я встречу?
Куда читать?
P.S. так как точных формул я не знаю, буду делать а-ля фреймворк, а параметров много - потому что это коэффициенты ряда в разложении сложной функции по Тейлору/чему-нибудь ещё.