CUDA推力中的指数阵列

CUDA推力中的指数阵列,cuda,thrust,Cuda,Thrust,我想知道如何在CUDA推力中使用索引数组。我的问题如下: vector<int> index(20); vector<float> data1(100), data2(100), result(20); for(int i=0;i<index.size();++i) result.push_back(do_something(data1[index[i]],data2[index[i]])); 向量索引(20); 向量数据1(100),数据2(100),结果

我想知道如何在CUDA推力中使用索引数组。我的问题如下:

vector<int> index(20);
vector<float> data1(100), data2(100), result(20);
for(int i=0;i<index.size();++i)
   result.push_back(do_something(data1[index[i]],data2[index[i]]));
向量索引(20);
向量数据1(100),数据2(100),结果(20);
对于(inti=0;i,我建议您阅读本手册,以获得对推力的基本理解,以及下面我将使用的一些概念

我不知道什么是最好的策略来有效地做这件事

示例中的大部分内容都应该直接映射到推力中的直接操作。for循环和
do\u something
操作将被推力所取代,可能带有一个合适的函子定义,该定义将模仿
do\u something
中的功能。一个易于使用的推力算法是hat可能适用于这种情况

使用
索引
数组进行间接寻址通常会使用一个推力
置换迭代器
,该迭代器正是为此目的而设计的

结合这些概念,并假设一个简单的例子,您的
do_something
操作将两个输入向量中每个索引元素的平方和,然后将该结果的平方根存储在
结果
向量中,我们可以有这样一个例子:

$ cat t74.cu
#include <thrust/device_vector.h>
#include <thrust/transform.h>
#include <thrust/iterator/permutation_iterator.h>
#include <thrust/copy.h>
#include <math.h>
#include <iostream>

struct do_something
{
  template <typename T>
  __host__ __device__ T operator()(const T &i1, const T &i2){
    return sqrtf(i1*i1 + i2*i2);
  }
};


int main(){
  //pythagorean triples
  float d1[] = { 3,  5,  8,  7, 20, 12,  9, 28};
  float d2[] = { 4, 12, 15, 24, 21, 35, 40, 45};
  int i1[] = {1, 3, 5, 7};
  const size_t isize = sizeof(i1)/sizeof(i1[0]);
  const size_t dsize = sizeof(d1)/sizeof(d1[0]);
  thrust::device_vector<int> index(i1, i1+isize);
  thrust::device_vector<float> data1(d1, d1+dsize);
  thrust::device_vector<float> data2(d2, d2+dsize);
  thrust::device_vector<float> result(isize);
  thrust::transform(thrust::make_permutation_iterator(data1.begin(), index.begin()), thrust::make_permutation_iterator(data1.begin(), index.end()), thrust::make_permutation_iterator(data2.begin(), index.begin()), result.begin(), do_something());
  thrust::copy_n(result.begin(), result.size(), std::ostream_iterator<float>(std::cout, ","));
  std::cout << std::endl;
}
$ nvcc -arch=sm_30 -o t74 t74.cu
$ ./t74
13,25,37,53,
$
$cat t74.cu
#包括
#包括
#包括
#包括
#包括
#包括
结构做什么
{
模板
__主机\uuuuuuuuuuuuuuuuuuuuuuuuuu设备\uuuuuuuuuuut运算符()(常数T&i1,常数T&i2){
返回sqrtf(i1*i1+i2*i2);
}
};
int main(){
//毕达哥拉斯三元组
浮点d1[]={3,5,8,7,20,12,9,28};
浮点数d2[]={4,12,15,24,21,35,40,45};
int i1[]={1,3,5,7};
const size_t isize=sizeof(i1)/sizeof(i1[0]);
const size_t dsize=sizeof(d1)/sizeof(d1[0]);
推力:装置的矢量指数(i1,i1+isize);
推力:装置矢量数据1(d1、d1+dsize);
推力:设备矢量数据2(d2,d2+dsize);
推力:设备矢量结果(isize);
推力::变换(推力::生成置换迭代器(data1.begin(),index.begin()),推力::生成置换迭代器(data1.begin(),index.end()),推力::生成置换迭代器(data2.begin(),index.begin()),result.begin(),dou something());
推力::复制(result.begin()、result.size()、std::ostream_迭代器(std::cout,“,”);

std::cout please post a我无法发布一个示例,因为我不知道如何做。这是问题的本质。这是一个非常基本的推力用法问题,我建议阅读以了解基本用法。MCVE请求的会帮助其他人帮助你,因为如果你概述了exac做什么的典型示例tly(例如,按元素添加
data1
data2
),那么其他人可能会向您展示如何在推力算法中实现这一点。