2017-12-20 5 views
0

Ich möchte eine Gerätefunktion innerhalb eines Schubfaktors aufrufen, würde aber nicht einmal wissen, wie ich anfangen soll. Dies ist ein offensichtliches Bedürfnis, da es Fälle gibt, in denen die Funktorgröße groß ist und daher in Funktionen aufgeteilt werden muss.ist es möglich, eine Gerätefunktion in einem Thrust-Funktor aufzurufen?

Ein Minimalbeispiel ist erwünscht.

Danke

+0

Welche Gerätefunktion? Etwas aus der CUDA Mathebibliothek oder etwas, das du selbst geschrieben hast? – talonmies

+0

ist die Funktion, die ich schreibe, um auf dem Gerät zu laufen. Es ist mit __device__ –

Antwort

1

Sie würden dies sehr ähnlich in einer Art und Weise tun, wie es in normalen CUDA C++ Code getan werden würde. Definieren Sie Ihre __device__ Funktion (vielleicht markieren Sie sie __host____device__) genau wie Sie in normalen CUDA Gerätecode, und verwenden Sie das in einem Schub Funktor-Operator, so wie Sie es überall sonst in CUDA Gerätecode verwenden würden.

Hier ist ein einfaches Beispiel, das ebenso wie das Aufrufen eines CUDA integrierte mathematische Bibliothek Funktion aus dem Funktors Operator Aufruf eine __host__ __device__ Funktion von einem Funktors Operator zeigt:

$ cat t9.cu 
#include <iostream> 
#include <thrust/transform.h> 
#include <thrust/device_vector.h> 
#include <thrust/copy.h> 
#include <vector> 
#include <math.h> 

template <typename T> 
__host__ __device__ T square(T &s){ 
    return s*s; 
} 

struct my_math 
{ 
    __host__ __device__ 
    float operator()(float &r){ 
    return log2f(square(r)); 
    } 
}; 

int main(){ 

    std::vector<float> h_data = {1,2,4,8,16}; 
    thrust::device_vector<float> d_data = h_data; 
    thrust::transform(d_data.begin(), d_data.end(), d_data.begin(), my_math()); 
    thrust::copy(d_data.begin(), d_data.end(), std::ostream_iterator<float>(std::cout, ",")); 
    std::cout << std::endl; 
} 


$ nvcc -arch=sm_35 -std=c++11 -o t9 t9.cu 
$ ./t9 
0,2,4,6,8, 
$ 
+0

bezeichnet Vielen Dank, Herr Crovella. Ich habe deinen Code ausprobiert und es hat gut funktioniert. Es bedeutet, dass ich irgendwo in meinem Code einen Fehler habe. Ich konnte vor diesem Post keine Probe im Schubgithub finden –

Verwandte Themen