Я хочу, чтобы правильно реализовать функцию встраиваемого устройства, заполнить вектор динамического размера и вернуть заполненный вектор, как:Как правильно реализовать встроенную функцию в устройстве, которая возвращает вектор на другую функцию устройства?
__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 к этой задаче?
Можно освободить память, выделенную для массива, ret, от другой функции устройства после того, как вычисление будет готово? – user3116936
Да, если вы достаточно осторожны в использовании, вы можете использовать in-kernel 'free'. Это описано в [документации] (http://docs.nvidia.com/cuda/cuda-c-programming-guide/index.html#dynamic-global-memory-allocation-and-operations). –
Большое спасибо за ваш совет. – user3116936