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。有没有办法修复此错误以使用每个向量元素访问结构的成员?
答案 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_vector
和device_vector
的大小(元素数量,而不是对象的大小)。你还cudaMemcpy
矢量对象本身;它也复制了他们的内容吗?它甚至被允许了吗?我没有使用Thrust的经验,但根据this page,有更简单的方法来创建device_vector
。