推力device_vector

时间:2016-08-13 08:24:38

标签: cuda max thrust

我正在尝试找到最大值及它的推力:: device_vecotr的位置。 下面的机制可以保存最大值的位置,但是,我找不到max_val。

我有cout语句来跟踪运行顺序以及崩溃的位置。它似乎在这条线上崩溃了     int max_val = * iter; 它显示了这个结果:

  

在抛出'thrust :: system :: system_error'的实例后终止调用     what():无效的参数   1234567

这是代码

#include <thrust/device_vector.h>
#include <thrust/host_vector.h>
#include <thrust/reduce.h>
#include <thrust/extrema.h>
#include <iostream>
#include <iomanip>

template <typename Vector>
void print_vector(const std::string& name, const Vector& v)
{
  typedef typename Vector::value_type T;
  std::cout << "  " << std::setw(20) << name << "  ";
  thrust::copy(v.begin(), v.end(),     std::ostream_iterator<T>(std::cout, " "));
  std::cout << std::endl;
}

int main()
{
std::cout<<"1";
thrust::host_vector<int>h_vec(5);
h_vec.push_back(10);
h_vec.push_back(11);
h_vec.push_back(12);
h_vec.push_back(13);
h_vec.push_back(14);
std::cout<<"2";
thrust::device_vector<int>d_vec(5);
std::cout<<"3";

thrust::copy_n(h_vec.begin(),5,d_vec.begin());
std::cout<<"4";
//  print_vector("D_Vec",d_vec);
std::cout<<"5";

thrust::device_vector<int>::iterator iter=thrust::max(d_vec.begin(),d_vec.end());
std::cout<<"6";
unsigned int position = iter - d_vec.begin();
std::cout<<"7";
int max_val = *iter;
std::cout<<"8";

std::cout<<"Max Val= "<<14<<" @"<<position<<    std::endl;


return 0;
}

请帮助..另外,如果有更好的方法可以使用THRUST库在device_vector中提取最大值及其位置,那么我们非常感激。

1 个答案:

答案 0 :(得分:2)

您没有正确使用向量。 push_back() adds an element onto the end of an existing vector。很明显,您希望替换现有元素。

此外,您想要的推力算法是thrust::max_element,而不是thrust::max

这是一个完整工作的代码,修复了这些问题:

$ cat t1229.cu
#include <thrust/device_vector.h>
#include <thrust/host_vector.h>
#include <thrust/reduce.h>
#include <thrust/extrema.h>
#include <iostream>
#include <iomanip>

template <typename Vector>
void print_vector(const std::string& name, const Vector& v)
{
  typedef typename Vector::value_type T;
  std::cout << "  " << std::setw(20) << name << "  ";
  thrust::copy(v.begin(), v.end(),     std::ostream_iterator<T>(std::cout, " "));
  std::cout << std::endl;
}

int main()
{
std::cout<<"1" <<std::endl;
thrust::host_vector<int>h_vec(5);
h_vec[0] = 10;
h_vec[1] = 11;
h_vec[2] = 12;
h_vec[3] = 13;
h_vec[4] = 14;
std::cout<<"2" << std::endl;
thrust::device_vector<int>d_vec(5);
std::cout<<"3" << std::endl;

thrust::copy_n(h_vec.begin(),5,d_vec.begin());
std::cout<<"4" << std::endl;
//  print_vector("D_Vec",d_vec);
std::cout<<"5" << std::endl;

thrust::device_vector<int>::iterator iter=thrust::max_element(d_vec.begin(),d_vec.end());
std::cout<<"6" << std::endl;
unsigned int position = iter - d_vec.begin();
std::cout<<"7" << std::endl;
int max_val = d_vec[position];
std::cout<<"8" << std::endl;

std::cout<<"Max Val= "<<max_val<<" @"<<position<<    std::endl;


return 0;
}
$ nvcc -o t1229 t1229.cu
$ ./t1229
1
2
3
4
5
6
7
8
Max Val= 14 @4
$