我需要计算以下形式的 double 递推关系
- X[n] = A[n]*X[n-1] + B[n]
- X[n] = A[n]*X[n-1] + B[n]*X[n-2] + C[n]
我将它们与非线性偏微分方程结合使用。 Thrust 的包容性扫描运算符是否足够灵活来计算这些?
最佳答案
正如 talonmies 所提到的,非线性偏微分方程求解中涉及的递推关系与前缀和不同。
上述关系通常采用更新关系的形式,例如
另见隋孙成所著的《偏微分方程》一书。
要并行评估此更新方程,可以将 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/