如何在 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_vector
是 not 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.
我想正确实现一个内联设备函数,该函数填充动态大小的向量和 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_vector
是 not 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.