2016-11-15 1 views
1

Je suis en train d'utiliser poussée :: copy_if pour compacter un tableau avec un prédicat vérification des nombres positifs:poussée copy_if: type incomplet n'est pas autorisé

fichier en-tête

: fichier.h:

struct is_positive 
{ 
    __host__ __device__ 
    bool operator()(const int x) 
    { 
    return (x >= 0); 
    } 
}; 

et file.cu

#include "../headers/file.h" 
#include <thrust/device_ptr.h> 
#include <thrust/device_vector.h> 
#include <thrust/copy.h> 


void compact(int* d_inputArray, int* d_outputArray, const int size) 
{ 
    thrust::device_ptr<int> t_inputArray(d_inputArray); 
    thrust::device_ptr<int> t_outputArray(d_outputArray); 
    thrust::copy_if(t_inputArray, t_inputArray + size, d_outputArray, is_positive()); 
} 

Je reçois des messages d'erreur commençant par:

/usr/local/cuda/include/thrust/system/detail/generic/memory.inl(40): error: incomplete type is not allowed

full errormsg here

Si je viens d'utiliser copie au lieu de copy_if, le code compile bien, donc je décidé tout sauf le prédicat is_positive() out.

Merci d'avance pour toute aide ou conseils généraux sur la façon de déboguer de telles erreurs de poussée.

e: J'utilise Cuda 7.5

Répondre

3

Pour moi, il semble que vous avez juste une faute de frappe. Ce:

thrust::copy_if(t_inputArray, t_inputArray + size, d_outputArray, is_positive()); 
               ^

devrait être le suivant:

thrust::copy_if(t_inputArray, t_inputArray + size, t_outputArray, is_positive()); 

Vous avez mélangé un pointeur brut avec des pointeurs de dispositif de poussée adéquate, ce qui est à l'origine du mal.

+0

Eh bien, c'est embarrassant. Merci, vous avez raison, fonctionne comme un charme! – mimre