2016-04-10 11 views
1

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

ответ

1

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

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

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