具有偏移的推力函数访问元素

时间:2014-10-26 03:08:27

标签: c++ cuda thrust

在推力函数中,如何使用偏移

访问向量元素

例如,如果需要使用input_vector1 [0]和input_vector2 [3]计算output_vector [0],那么在thrust :: transform中,如何做到这一点?

1 个答案:

答案 0 :(得分:1)

有多种方法可以实现这一目标。如果你有向量,并且你希望变换能够处理向量中的连续序列,只是在不同的偏移量下,那么你可以直接将所需的偏移量添加到传递给thrust::transform调用的迭代器中:

$ cat t602.cu
#include <iostream>
#include <thrust/device_vector.h>
#include <thrust/transform.h>
#include <thrust/sequence.h>
#include <thrust/copy.h>

#define DSIZE 10

int main(){

  thrust::device_vector<int> i1(DSIZE), i2(DSIZE), o(DSIZE);
  thrust::sequence(i1.begin(), i1.end());
  thrust::sequence(i2.begin(), i2.end());
  thrust::transform(i1.begin(), i1.begin()+4, i2.begin()+3, o.begin(), thrust::plus<int>());
  thrust::copy(o.begin(), o.begin()+4, std::ostream_iterator<int>(std::cout, " "));
  std::cout << std::endl;
}
$ nvcc -arch=sm_20 -o t602 t602.cu
$ ./t602
3 5 7 9
$

在上面的例子中,output_vector [0]是input_vector1 [0]和input_vector2 [3]的总和,就像你问的那样。访问是连续的,因此ouput_vector [1]是input_vector1 [1]和input_vector2 [4]的总和。只需添加适当的偏移量,就可以对设备指针和主机指针进行类似的操作。如果您想要一个随机访问模式而不是连续访问模式来计算向量元素的操作,那么您可以使用permutation iterators