algorithm - 使用 CUDA Thrust 评估非线性偏微分方程的递推关系

标签 algorithm cuda thrust differential-equations

我需要计算以下形式的 double 递推关系

  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]

我将它们与非线性偏微分方程结合使用。 Thrust 的包容性扫描运算符是否足够灵活来计算这些?

最佳答案

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

上述关系通常采用更新关系的形式,例如

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

关于algorithm - 使用 CUDA Thrust 评估非线性偏微分方程的递推关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28289960/

相关文章:

graphics - 3D 网格连接

c++ - 对相邻的数组元素使用共享内存?

cuda - Nvidia 的 nvprof 输出为 FLOPS

c++11 - CUDA 和 Thrust 库 : Trouble with using . cuh .cu 和 .cpp 文件以及 -std=c++0x

cuda - 在 CUDA C 项目中使用推力::max_element

c - 面试-位操作

java - 搜索两个数组进行匹配,没有额外的内存

algorithm - 开始时缓慢增加而结束时快速增加的数学函数

cuda - RTX 2080 Ti cuda-memcheck 在创建 Cublas 上下文开始时遇到错误

cuda - 使用 CUDA Thrust 并行执行多个一维移动平均线