我在使用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或使用任何其他优化快速完成工作?
答案 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)
我建议您使用cuda
和thrust
来使用GPU。就性能而言。是的,它会更快。
请查看this帖子。它有一个非常清晰的描述。
如果你必须多次调用compute_l1_distance
,你可以使用pthread
来调用该方法,从而并行执行它。