Я пытаюсь создать простую программу, чтобы ознакомиться с вычислительной способностью GPU от Thrusts и возможностями ODE для Odeint. Я хотел бы иметь возможность решать простые ОДУ (т. Е. Dy/dx = 3x^2y) с использованием метода Рунге-Кутты на GPU в надежде перейти к более сложным проблемам позже. Я могу сделать это с относительной легкостью, используя только odeint:Как решить простые ODE с помощью Thrust и odeint в C++
#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;
}
}
У меня возникли проблемы, однако понимание того, как тяга будет вступать в игру. Большинство онлайн-ресурсов, с которыми я столкнулся, включают в себя пример исследования Lorenz, но я считаю, что это слишком продвинуто для моего текущего уровня.
Я понимаю концепцию устройств и векторов хоста, но я не понимаю, как моя проблема будет адаптирована для решения с использованием графического процессора. Из моих собственных исследований я смог решить простые алгебраические (недифференциальные) уравнения, используя CUDA (не тягу). Однако объединение моих знаний о odeint и thrust оказывается более сложным, чем я ожидал.
В частности, я путать о:
1) Адаптация Рунге-Кутта шагового
2) Адаптация самой функции системы (dydx = 3 * х * х * у [0] в этом пример).
3) Включая как odeint и Thrust/наддува каталогов в программу
Извиняюсь, если этот вопрос является слишком основной или просят слишком много; Я новичок в StackOverflow и еще не изучил весь «вопрос-запрос», а также не должен пытаться решить проблему самостоятельно.