Existe-t-il un moyen d'envelopper automatiquement une fonction mathématique CUDA dans un foncteur afin que l'on puisse appliquer thrust::transform
sans avoir à écrire manuellement un foncteur? Quelque chose comme la fonctionnalité que (je comprends) std::function
fournit?CUDA Fonctions mathématiques de raccourci de poussée
thrust::placeholders
ne semble pas aimer les fonctions mathématiques. std::function
ne semble pas être disponible.
code Exemple:
#include <thrust/transform.h>
#include <thrust/device_vector.h>
#include <iostream>
#include <functional>
#include <math.h>
struct myfunc{
__device__
double operator()(double x,double y){
return hypot(x,y);
}
};
int main(){
double x0[10] = {3.,0.,1.,2.,3.,4.,5.,6.,7.,8.};
double y0[10] = {4.,0.,1.,2.,3.,4.,5.,6.,7.,8.};
thrust::device_vector<double> x(x0,x0+10);
thrust::device_vector<double> y(y0,y0+10);
thrust::device_vector<double> r(10);
for (int i=0;i<10;i++) std::cout << x0[i] <<" "; std::cout<<std::endl;
for (int i=0;i<10;i++) std::cout << y0[i] <<" "; std::cout<<std::endl;
// this works:
thrust::transform(x.begin(),x.end(),y.begin(),r.begin(), myfunc());
// this doesn't compile:
using namespace thrust::placeholders;
thrust::transform(x.begin(),x.end(),y.begin(),r.begin(), hypot(_1,_2));
// nor does this:
thrust::transform(x.begin(),x.end(),y.begin(),r.begin(), std::function<double(double,double)>(hypot));
for (int i=0;i<10;i++) std::cout << r[i] <<" "; std::cout<<std::endl;
}
Il n'y a aucun moyen automatique de le faire. Une façon de réaliser quelque chose comme ça pourrait être de faire quelque chose comme ['std :: bind' qui interopérait avec CUDA] (https://github.com/jaredhoberock/thrust_bind). Ensuite, vous devrez définir des surcharges de tous les maths les fonctions d'intérêt (par exemple 'hypot') en termes de' bind'. –
dans CUDA 7.5 vous pouvez utiliser la fonction [experimental '--expt-extended-lambda'] (http://stackoverflow.com/a/30441692/678093) et écrire' auto h = [] __device __ (double x, double y) {return hypot (x, y);}; Poussée :: Transformer (x.begin(), x.end(), y.begin(), r.begin(), h); ' –
@ m.s. Si vous voulez fournir une réponse, je voudrais upvote. Je ne pense pas que Jared va objecter. –