Я пытаюсь создать простую программу, чтобы познакомиться с вычислительными возможностями Thrusts на GPU и возможностью решения ODE от odeint. Я хотел бы иметь возможность решать простые ODE (то есть dy / dx = 3x ^ 2y), используя метод Runge-Kutta на графическом процессоре, в надежде перейти к более сложным проблемам в дальнейшем. Я могу сделать это с относительной легкостью, используя только odeint:
#include <boost/lambda/lambda.hpp>
#include <boost/numeric/odeint.hpp>
#include <iostream>
#include <iterator>
#include <algorithm>
using namespace boost::numeric::odeint;
using namespace std;
typedef std::vector<double> state_type;
void sys( state_type &y, state_type &dydx, double x){
dydx[0] = 3*x*x*y[0]; // dydx = 3*x^2*y
}
int main(){
state_type y(3);
runge_kutta4< state_type > rk4;
y[0] = 2; // y0 = 2
double x = 1; // x0 = 1
double h = 0.1; // h = 0.1
for (int i = 0; i < 100; i++,x+=h){
rk4.do_step(sys,y,x,h);
cout << "(";
cout << x+h;
cout << ",";
cout << y[0];
cout << ")";
cout << endl;
}
}
У меня, однако, проблемы с пониманием того, как тяга вступит в игру. Большинство онлайн-ресурсов, с которыми я сталкивался, содержат исследование параметров Лоренца в качестве примера, но я чувствую, что оно слишком продвинуто для моего текущего уровня.
Я понимаю концепцию устройства и векторов хоста, но не понимаю, как моя проблема будет адаптирована для решения с помощью графического процессора. Из моего собственного исследования я смог решить простые алгебраические (недифференциальные) уравнения, используя CUDA (не тягу). Тем не менее, объединение моих знаний об одеинте и тяге оказывается сложнее, чем я ожидал.
В частности, я запутался в:
1) Адаптация степпера Рунге-Кутта
2) Адаптация самой системной функции (dydx = 3 * x * x * y [0] в этом примере).
3) Включение в программу каталогов odeint и Thrust / boost
Я прошу прощения, если этот вопрос слишком простой или задает слишком много; Я новичок в StackOverflow и еще не изучил все протоколы «вопросов и ответов», а также то, как много я должен пытаться решить проблему самостоятельно.
Этот вопрос немного сбивает с толку. Если вы хотите использовать графические процессоры, у вас обычно есть большие системы дифференциальных уравнений. Наличие только трех переменных обычно недостаточно. Одна отдельная инструкция на GPU медленная, но она может выполнять много операций параллельно в течение одной инструкции. Thrust разработан для обработки больших структур данных, таких как векторы, с множеством записей в графическом процессоре.
Чтобы ответить на ваши вопросы вкратце вам нужно
thrust_algebra
и thrust_operations
к определению вас степпер#include <boost/numeric/odeint.hpp>
а также #include <boost/numeric/odeint/external/thrust.hpp>
к вашим исходным файлам. Конечно, вам также нужно связать с библиотеками CUDA и скомпилировать все с nvcc
, В каталоге примеров файла odeint есть makefile, показывающий, как это работает.Других решений пока нет …