如何在推力转换期间重新排序矢量?

时间:2011-09-29 20:07:43

标签: cuda nvidia thrust

我怎样才能将这个简单的代码转换为推力代码?

for (i=0;i<cA-rA;i++)
    sn[i]=c[n_index[i]]-sn[i];

更多信息: cA和rA是常数整数,因此我们可以将其设为'n'= cA-rA sn:浮点数组(n) n_index:int(n)数组 c:float数组(cA)

我的问题是n_index [i]指向C数组的元素。 谢谢!

2 个答案:

答案 0 :(得分:3)

您可以使用thrust::transformpermutation_iterator与“收集”操作融合来实现此目的:

#include <thrust/device_vector.h>
#include <thrust/iterator/permutation_iterator.h>
#include <thrust/transform.h>
#include <thrust/sequence.h>
#include <thrust/functional.h>

int main()
{
  size_t n = 100;

  // declare storage
  thrust::device_vector<int> sn(n);
  thrust::device_vector<int> n_index(n);
  thrust::device_vector<int> c(n);

  // initialize vectors with some sequential values for demonstrative purposes
  thrust::sequence(sn.begin(), sn.end());
  thrust::sequence(n_index.begin(), n_index.end());
  thrust::sequence(c.begin(), c.end());

  // sn[i] = c[n_index[i]] - sn[i]
  thrust::transform(thrust::make_permutation_iterator(c.begin(), n_index.begin()),
                    thrust::make_permutation_iterator(c.end(), n_index.end()),
                    sn.begin(),
                    sn.begin(),
                    thrust::minus<int>());

  return 0;
}

答案 1 :(得分:2)

我尝试了第一个并没有得到正确的结果。第二个permutation_iterator需要位于 BOTH 向量的末尾。

尝试以下更正:

// sn[i] = c[n_index[i]] - sn[i]
thrust::transform(thrust::make_permutation_iterator(c.begin(), n_index.begin()),
            thrust::make_permutation_iterator(c.end(), n_index.end()),
            sn.begin(),
            sn.begin(),
            thrust::minus<int>());