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

How to implement properly an inline function in the device that returns a vector to another device function?

我想正确实现一个内联设备函数,该函数填充动态大小的向量和 return 填充向量,例如:

__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;
}

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

__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 方法是什么?

thrust::device_vectornot usable in device code

但是你可以 return 一个指向 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.