我想正确实现一个内联设备函数,它填充动态大小的向量并返回填充的向量,如:
__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方法是什么?
答案 0 :(得分:4)
thrust::device_vector
是not 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。