2016-05-08 1 views
0

Я написал ядра, используя обычный код CUDA, который не использует векторы тяговых устройств. Ядра выводят некоторые результаты, хранящиеся в массиве на устройстве, скажем, в массиве X. Я бы хотел сделать сокращение на X. Есть ли способ использовать функцию thrust :: reduction без первого копирования X в упор: переменная device_vector?Cuda тяга без использования device_vectors?

ответ

3

Традиционный способ сделать это - обернуть указатель устройства в thrust::device_ptr и передать его алгоритмам тяги. Модель шаблона, основанная на тегах в Thrust, гарантирует, что выполнение устройства будет вызвано типом входной последовательности, входящей в вызов.

#include <thrust/device_ptr.h> 
#include <thrust/reduce.h> 

int* X; 
cudaMalloc((void **)&X, sizeof(int) * size_t(N)); 

// Do stuff with X 

thrust::device_ptr X_ptr(X); 
int result = thrust::reduce(X_ptr, X_ptr+N); 

От Thrust 1.7 начиная с концепции внедрения политики. Это устраняет необходимость явной упаковки адреса устройства с помощью device_ptr. Таким образом, вместо этого вы можете использовать для thrust::device политики, чтобы указать, что входные итераторы на устройстве и сделать что-то вроде

#include <thrust/reduce.h> 
#include <thrust/execution_policy.h> 

int* X; 
cudaMalloc((void **)&X, sizeof(int) * size_t(N)); 

// Do stuff with X 
int result = thrust::reduce(thrust::device, X, X+N); 

Какой путь вы выбираете, чтобы сделать это следует руководствоваться тем, что версия Thrust у вас есть и какой код стиль Вы предпочитаете.

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