2015-12-17 4 views
0

Я хочу, чтобы правильно реализовать функцию встраиваемого устройства, заполнить вектор динамического размера и вернуть заполненный вектор, как:Как правильно реализовать встроенную функцию в устройстве, которая возвращает вектор на другую функцию устройства?

__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 к этой задаче?

ответ

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.

+0

Можно освободить память, выделенную для массива, ret, от другой функции устройства после того, как вычисление будет готово? – user3116936

+0

Да, если вы достаточно осторожны в использовании, вы можете использовать in-kernel 'free'. Это описано в [документации] (http://docs.nvidia.com/cuda/cuda-c-programming-guide/index.html#dynamic-global-memory-allocation-and-operations). –

+0

Большое спасибо за ваш совет. – user3116936

 Смежные вопросы

  • Нет связанных вопросов^_^