Один из конструкторов device_vector
принимает диапазон элементов, заданный двумя итераторами.Он достаточно умен, чтобы понять необработанный указатель в вашем примере, поэтому вы можете напрямую создать device_vector
и избежать временного host_vector
:
void my_function_taking_host_ptr(int *raw_ptr, size_t n)
{
// device_vector assumes raw_ptrs point to system memory
thrust::device_vector<int> vec(raw_ptr, raw_ptr + n);
...
}
Если ваш необработанный указатель указывает на память CUDA, введите device_ptr
:
void my_function_taking_cuda_ptr(int *raw_ptr, size_t n)
{
// wrap raw_ptr before passing to device_vector
thrust::device_ptr<int> d_ptr(raw_ptr);
thrust::device_vector<int> vec(d_ptr, d_ptr + n);
...
}
Использование device_ptr
не выделяет никакого хранилища;он просто кодирует местоположение указателя в системе типов.