Как решить простые ODE, используя Thrust и odeint в переполнении стека

Я пытаюсь создать простую программу, чтобы познакомиться с вычислительными возможностями 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 и еще не изучил все протоколы «вопросов и ответов», а также то, как много я должен пытаться решить проблему самостоятельно.

1

Решение

Этот вопрос немного сбивает с толку. Если вы хотите использовать графические процессоры, у вас обычно есть большие системы дифференциальных уравнений. Наличие только трех переменных обычно недостаточно. Одна отдельная инструкция на GPU медленная, но она может выполнять много операций параллельно в течение одной инструкции. Thrust разработан для обработки больших структур данных, таких как векторы, с множеством записей в графическом процессоре.

Чтобы ответить на ваши вопросы вкратце вам нужно

  1. добавить thrust_algebra и thrust_operations к определению вас степпер
  2. реализовать функцию системы с упором, который является наиболее сложным шагом, и
  3. добавлять #include <boost/numeric/odeint.hpp> а также #include <boost/numeric/odeint/external/thrust.hpp> к вашим исходным файлам. Конечно, вам также нужно связать с библиотеками CUDA и скомпилировать все с nvcc, В каталоге примеров файла odeint есть makefile, показывающий, как это работает.
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]