用CUDA推力计算非线性偏微分方程的递推关系

时间:2015-02-03 01:36:16

标签: algorithm cuda thrust differential-equations

我需要计算格式

的双精度递归关系
  1. X [n] = A [n] * X [n-1] + B [n]
  2. X [n] = A [n] * X [n-1] + B [n] * X [n-2] + C [n]
  3. 我将这些与非线性PDE结合使用。 Thrust的包容性扫描操作员是否足够灵活来计算这些?

1 个答案:

答案 0 :(得分:3)

正如talonmies所提到的,非线性偏微分方程解中涉及的递归关系与前缀和不同。

上述关系通常采用 update 关系的形式,如

enter image description here

另见隋孙成的“偏差方程式”一书。

要同时评估此更新方程式,可能会将zip迭代器与变换结合使用,如下例所示

#include <thrust\device_vector.h>

struct Recurrence{
template <typename Tuple>
    __host__ __device__ double operator()(Tuple a) {

        // --- X[n] = A[n]*X[n-1] + B[n]*X[n-2] + C[n]
        return (thrust::get<0>(a) * thrust::get<3>(a) + thrust::get<1>(a) * thrust::get<4>(a) + thrust::get<2>(a));

    }
};


int main() {

    const int N = 10;

    thrust::device_vector<double> d_x(N, 1.f);
    thrust::device_vector<double> d_a(N, 2.f);
    thrust::device_vector<double> d_b(N, 3.f);
    thrust::device_vector<double> d_c(N, 4.f);

    thrust::transform(thrust::make_zip_iterator(thrust::make_tuple(d_a.begin() + 2, d_b.begin() + 2, d_c.begin() + 2, d_x.begin() + 1,     d_x.begin())), 
                      thrust::make_zip_iterator(thrust::make_tuple(d_a.begin() + N, d_b.begin() + N, d_c.begin() + N, d_x.begin() + N - 1, d_x.begin() + N - 2)), 
                      d_x.begin() + 2, Recurrence());

    for (int i=2; i<N; i++) {
        double temp = d_x[i];
        printf("%i %f\n", i, temp);
    }

    return 0;
}