2015-10-28 2 views
1

J'ai un vecteur de vecteurs:Cuda poussée :: device_vector obtenir le pointeur de la gamme spécifique

thrust::device_vector weights_; 

qui est une quantité continue de la mémoire, où chaque w articles, représentent un vecteur.

Dans l'une de mes fonctions, je passe comme paramètres le début et la fin de cette gamme, comme ceci:

__host__ ann::d_vector ann::prop_layer (
              unsigned int weights_begin, 
              unsigned int weights_end, 
              ann::d_vector & input 
             ) const 

puis, je vais copier dans un nouveau vecteur qui vont, puis obtenir un pointeur brut que je peux utiliser dans un noyau:

thrust::device_vector<float> weights (weights_.begin() + weights_begin, 
             weights_.begin() + weights_end); 

float * weight_ptr = thrust::raw_pointer_cast(weights.data()); 

some_kernel<<<numBlocks,numThreads>>>(weight_ptr, weight.size()); 
  1. puis-je obtenir un pointeur de cette plage, sans avoir d'abord la copie à un nouveau vecteur? Cela semble être un gaspillage de copy-realloc pour moi.
  2. Dans le cas où je ne peux pas obtenir un pointeur de cette plage, puis-je au moins assigner un vecteur à cette plage, sans copier les valeurs réelles?

Répondre

2

Can I get a pointer from that range, without first copying it to a new vector? That seems like a waste of copy-realloc to me.

Oui, vous pouvez obtenir un pointeur sur cette plage.

float * weight_ptr = thrust::raw_pointer_cast(weights_.data()) + weights_begin; 

In case I can't get a pointer from that range, can I at least assign a vector to that range, without copying the actual values?

Non, un vecteur de poussée ne peut pas être instancié « sur » des données existantes.

+0

C'est aussi simple que ça? Merci ! –

+0

* erreur: aucune fonction de conversion appropriée de "thrust :: device_ptr " à "float *" existe * Ai-je besoin de * thrust :: raw_pointer_cast * d'abord? –

+1

Oui, comme vous l'avez montré, désolé. –