C ++:两个`std :: vector <double>`向量之间L1距离的快速/并行计算

时间:2018-01-31 13:23:51

标签: c++ gpu linear-algebra

我在使用Nvidia GPU和Cuda8的机器上工作,我有一个C ++应用程序,应该计算由std::vector<double>表示的两个向量之间的L1距离。

目前,我的代码根本不是并行的,只使用CPU:

double compute_l1_distance(const std::vector<double> &v1, const std::vector<double> &v2) {
    if (v1.size() != v2.size()) {
        return -1;
    }
    double result = 0;
    for (int i = 0 ; i < v1.size() i++) {
        double val = v1[i] - v2[i];
        if (val < 0) {
            val = 0 - val;
        }
        result += val;
    }

    return result;
}

如何提高此计算的性能?我如何利用GPU?是否有推荐的库可以使用GPU或使用任何其他优化快速完成工作?

2 个答案:

答案 0 :(得分:2)

使用thrust库,它看起来像:

double compute_l1_distance(const std::vector<double> &v1, 
                           const std::vector<double> &v2) {
    if (v1.size() != v2.size()) {
        return -1;
    }
    thrust::device_vector<double> dv1 = v1;
    thrust::device_vector<double> dv2 = v2;
    auto begin = thrust::make_zip_iterator(thrust::make_tuple(
                                               dv1.begin(), dv2.begin())); 
    auto end   = thrust::make_zip_iterator(thrust::make_tuple(
                                               dv1.end(),   dv2.end()  )); 
    const auto l1 = [](const thrust::tuple<double,double>& arg) {
        return fabs(thrust::get<0>(arg) - thrust::get<1>(arg));
    }
    const auto add = [](double a, double b) { return a+b; }

    return thrust::transform_reduce(first, last, l1, 0.0, add);
}

答案 1 :(得分:1)

我建议您使用cudathrust来使用GPU。就性能而言。是的,它会更快。

请查看this帖子。它有一个非常清晰的描述。

如果你必须多次调用compute_l1_distance,你可以使用pthread来调用该方法,从而并行执行它。