在结构中包装推力设备向量?

时间:2013-02-20 18:17:38

标签: cuda thrust

我正在实现一个数学算法,需要保留~15个不同的浮点向量。我想将所有这些设备向量包装到结构

typedef struct {
  thrust::device_vector<float> ...
} data;

并将此结构传递给不同的函数。有可能有这样的包装?当我尝试初始化一个这样的结构

data* mydata = (data*) malloc(sizeof(struct data)); 

我收到此错误

错误:typedef“data”不能用于精心设计的类型说明符

此外,我怀疑当其内容没有驻留在主机内存中时,将大小 data 的内存块进行mallocing

1 个答案:

答案 0 :(得分:2)

正如评论中所提到的,标题中描述的原始错误与推力无关,但由于使用了struct datadata已经是类型定义的。

在回应评论中提出的其他问题时,我只是试图说明我没有充分考虑在结构中使用thrust::device_vector<>的后果。当我说可能考虑使用thrust::device_ptr<>时,我想到了这样的事情,这似乎对我有用:

#include <stdio.h>
#include <thrust/host_vector.h>
#include <thrust/device_vector.h>
#include <thrust/device_ptr.h>
#include <thrust/sequence.h>
#include <thrust/transform.h>
#include <thrust/functional.h>

#define N 10

typedef struct {
  thrust::device_ptr<float> dp1;
  thrust::device_ptr<float> dp2;
  int i;
} data;


int main(){

  thrust::negate<int> op;

  data *mydata = (data *)malloc(sizeof(data));
  thrust::host_vector<float> h1(N);
  thrust::sequence(h1.begin(), h1.end());
  thrust::device_vector<float> d1=h1;
  mydata->dp1=d1.data();
  mydata->dp1[0]=mydata->dp1[N-1];

  thrust::transform(mydata->dp1, mydata->dp1 + N, mydata->dp1, op); // in-place transformation

  thrust::copy(d1.begin(), d1.end(), h1.begin());
  for (int i=0; i<N; i++)
    printf("h1[%d] = %f\n", i, h1[i]);

  return 0;
}

话虽如此,在结构体中使用device_vector的原始方法可能有用,我只是不知道并且没有探索它。