如何在将向量返回到另一个设备函数的设备中正确实现内联函数?

时间:2015-12-17 05:11:59

标签: cuda gpgpu thrust

我想正确实现一个内联设备函数,它填充动态大小的向量并返回填充的向量,如:

__device__  inline   thrust::device_vector<double> make_array(double zeta, int l)
{
  thrust::device_vector<double> ret;
  int N =(int)(5*l+zeta); //the size of the array  will depend on l and zeta, in a complex way...
  // Make sure of sufficient memory allocation
  ret.reserve(N);
  // Resize array
  ret.resize(N);
  //fill it:
  //for(int i=0;i<N;i++)
  // ...;
  return ret;
}

我的目标是在另一个设备函数中使用返回向量的内容,如:

__device__  inline double use_array(double zeta,int l)
{
  thrust::device_vector<double> array = make_array(zeta, l);

  double result = 0;

  for(int i=0; i<array.size(); i++)
    result += array[i];

  return result;
}

我该怎么做呢?我的感觉是推力矢量是为这类任务设计的,但我想做得恰到好处。这项任务的标准CUDA方法是什么?

1 个答案:

答案 0 :(得分:4)

thrust::device_vectornot usable in device code

但是你可以返回指向a dynamically allocated area的指针,如下所示:

#include <assert.h>

template <typename T>
__device__  T* make_array(T zeta, int l)
{
  int N =(int)(5*l+zeta); //the size of the array  will depend on l and zeta, in a complex way...
  T *ret = (T *)malloc(N*sizeof(T));
  assert(ret != NULL);  // error checking

  //fill it:
  //for(int i=0;i<N;i++)
  // ret[i] = ...;
  return ret;
}

inline关键字不是必需的。 compiler will aggressively inline functions wherever possible