2016-11-08 3 views
0

J'essaie de créer des foncteurs de périphériques à l'aide de Thrust qui stockera une référence à une structure de données de périphérique en tant qu'état. Le foncteur serait alors passé en thrust::transform() et amis. Le problème est que je reçois des erreurs à appeler une fonction hôte à partir du code de l'appareil à la déclaration return du foncteur:Création et utilisation de foncteurs de périphériques avec Thrust

// Compile with: 
// nvcc --std=c++11 device_functor.cu -o device_functor 

#include <thrust/host_vector.h> 
#include <thrust/device_vector.h> 
#include <thrust/complex.h> 

#include <iostream> 
#include <iomanip> 

struct my_functor { 
    my_functor(thrust::device_vector<unsigned char> &octets_) : 
     octets(octets_) {}; 

    __device__ 
    unsigned char operator()(int idx) const { 
     return octets[idx]; 
    } 
private: 
    thrust::device_vector<unsigned char> &octets; 
}; 


int main() { 
    thrust::device_vector<unsigned char> d_octets (4); 

    my_functor foo(d_octets); 

    d_octets[0] = 0x00; 
    d_octets[1] = 0x01; 
    d_octets[2] = 0x02; 
    d_octets[3] = 0x03; 

    std::cout << "0x" << std::hex << std::setfill('0') << std::setw(2) << static_cast <int> (foo(2)) << std::endl; 

    return 0; 
} 

L'un des objectifs finaux de le faire est d'accéder aux bits octets de diverses manières dans la transformation , comme saisir le cinquième ensemble de trois bits, le dixième ensemble de quatre bits, etc. Tout cela est facile une fois que je peux faire fonctionner le foncteur.

+3

Cela n'a aucune chance de travailler toujours à cause de la device_vector dans le foncteur. C'est la source de l'erreur et il n'y a pas moyen de la réparer. – talonmies

+3

pourquoi ne pas simplement poster une réponse plutôt que de modifier votre question avec "Edit 1:" qui contient la réponse? Ou si vous préférez, je peux marquer cela comme une copie d'autres questions de poussée demandant d'utiliser des vecteurs de poussée directement dans le code de l'appareil. –

+0

Va faire cette correction et marquer la réponse à la question. Je ne l'ai pas vu comme un doublon, comme une question posée sur la création de vecteurs de poussée dans le code de l'appareil par rapport à l'autre sur l'utilisation dans le code de l'appareil. –

Répondre

1

Réécrire foncteur thusly pour résoudre le commentaire par @talonmies semble faire l'affaire:

struct my_functor { 
    my_functor(thrust::device_vector<unsigned char> &octets) : 
     octet_ptr(thrust::raw_pointer_cast(&octets[0])) {}; 

    __device__ 
    unsigned char operator()(int idx) const { 
     return *(octet_ptr + idx); 
    } 

private: 
    unsigned char *octet_ptr; 
};