2016-04-10 12 views
1

Thrusts'ın GPU hesaplama yeteneği ve odeint'in ODE çözme yeteneğini öğrenmek için basit bir program oluşturmaya çalışıyorum. Daha sonra daha karmaşık problemlere geçme umuduyla GPU üzerindeki Runge-Kutta yöntemini kullanarak basit ODE'leri (yani dy/dx = 3x^2y) çözebiliyorum. Sadece odeint kullanılarak göreli kolaylıkla bunu yapabilmek duyuyorum:Basit ODE'lerin Nasıl Çözümü C++ 'da Thrust ve odeint Kullanılıyor

#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; 
    } 

} 

Ben, ancak bu belayı itme devreye girer nasıl anlayış değilim. Karşılaştığım çevrimiçi kaynakların çoğu örnek olarak Lorenz parametre çalışmasını içeriyor, ancak bunun mevcut seviyem için çok gelişmiş olduğunu hissediyorum.

Cihaz ve ana makine vektörleri kavramını anlıyorum, ancak sorunumun GPU kullanılarak nasıl çözüleceğini anlayamıyorum. Kendi araştırmalarımdan CUDA (değil itme) kullanarak basit cebirsel (diferansiyel olmayan) denklemleri çözebildim. Ancak, odeint ve itki bilgimi birleştirmek, tahmin ettiğimden daha zor olduğunu kanıtlıyor.

1) Runge Kutta

2) sistem işlevlerinin uyarlanması step uyarlanması bu (dydx = 3 * x * x * y [0]: Özellikle

, karıştı üzereyken örnek). odeint ve

Bu soru çok basit ya da çok fazla soran ise özür dileriz programa İtme/boost dizinleri hem dahil

3); StackOverflow'ta yeniyim ve henüz tüm "soru sorma" protokolünü ve sorunu kendi başıma çözmem için ne kadar çaba göstermem gerektiğini öğrendim.

cevap

1

Bu soru biraz kafa karıştırıcı. Eğer GPU'ları kullanmak istiyorsanız, genellikle büyük diferansiyel denklem sistemleri vardır. Sadece üç değişkene sahip olmak genellikle yeterli değildir. Bir GPU üzerindeki tek bir komut yavaştır, ancak bir komut sırasında paralel olarak birçok işlem yapabilir. Thrust, bir GPU üzerinde birçok girişe sahip vektörler gibi büyük veri yapılarını işlemek için tasarlanmıştır.

Eğer thrust_algebra ve RK
  • en zor adımdır itme ile sistem işlevi uygulamak step size tanımına thrust_operations ve
  • eklemek

    1. gereken kısacası sorularınıza cevap vermek Kaynak dosyalarınıza
    2. #include <boost/numeric/odeint.hpp> ve #include <boost/numeric/odeint/external/thrust.hpp> ekleyin. Tabii ki, CUDA kütüphanelerine karşı bağlantı kurmanız ve nvcc ile her şeyi derlemeniz gerekiyor. Bunun nasıl çalıştığını gösteren odeint'in örnek dizininde makefile vardır.