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,
$
Welche Gerätefunktion? Etwas aus der CUDA Mathebibliothek oder etwas, das du selbst geschrieben hast? – talonmies
ist die Funktion, die ich schreibe, um auf dem Gerät zu laufen. Es ist mit __device__ –