如何访问thrust :: device_vector <struct>的成员

时间:2018-06-15 17:38:07

标签: c++ vector cuda thrust

CUDA在这里找到了一些文档:https://docs.nvidia.com/cuda/thrust/index.html#vectors允许在设备内存/代码中使用向量。我正在尝试创建一个结构类型的向量,用于一般处理。以下是示例代码:

#include <thrust/host_vector.h>
#include <thrust/device_vector.h>
#include <iostream>

struct Data
{
  double first, second, total;
};

__global__
void add(thrust::device_vector<Data> *d_matrix)
{
  &d_matrix[1].total = &d_matrix[1].first + &d_matrix[1].second;
}

int main()
{
  thrust::host_vector<Data> matrix;
  thrust::device_vector<Data> *d_matrix;
  int size = sizeof(thrust::host_vector<Data>);

  matrix[1].first = 2100;
  matrix[1].second = 100;

  cudaMalloc(&d_matrix, size);

  cudaMemcpy(d_matrix, &matrix, size, cudaMemcpyHostToDevice);

  add<<<1,1>>>(d_matrix);

  cudaMemcpy(&matrix, d_matrix, size, cudaMemcpyDeviceToHost);

  cudaFree(d_matrix);

  std::cout << "The sum is: " << matrix[1].total;

  return 0;
}

我收到以下错误:

  

gpuAnalysis.cu(13):错误:类“thrust :: device_vector&gt;”没有会员“总计”

     

gpuAnalysis.cu(13):错误:类“thrust :: device_vector&gt;”没有会员“第一”

     

gpuAnalysis.cu(13):错误:类“thrust :: device_vector&gt;”没有会员“第二”

     

编译中检测到3个错误   “/tmp/tmpxft_000013c9_00000000-8_gpuAnalysis.cpp1.ii”。

根据nvidia网站上提供的文档,这些向量能够将所有数据类型存储为std :: vector。有没有办法修复此错误以使用每个向量元素访问结构的成员?

1 个答案:

答案 0 :(得分:1)

void add(thrust::device_vector<Data> *d_matrix) {
   &d_matrix[1].total = &d_matrix[1].first + &d_matrix[1].second;
}

在此代码中,d_matrix参数实际上是类型为thrust::device_vector<Data>的对象的指针。表达式&d_matrix[1].total是由于C ++运算符优先级被评估,因此d_matrix[1]被认为是某些不存在的thrust::device_vector<Data>类型元素数组的第二个元素,因为指针可以被处理作为一个数组自动。然后,这个(不存在的)第二个元素将成为.total成员访问的主体,这是不存在的。

请尝试(*d_matrix)[1].total = ...

此外,我不确定您的代码是否正确。例如,您没有指定host_vectordevice_vector的大小(元素数量,而不是对象的大小)。你还cudaMemcpy矢量对象本身;它也复制了他们的内容吗?它甚至被允许了吗?我没有使用Thrust的经验,但根据this page,有更简单的方法来创建device_vector