Ich habe zwei Möglichkeiten, um meine Schub Funktor Zugriff auf globalen nicht-vektorisierbaren nicht-einheitlich-Lesezugriffs-Status. Leider gibt es einen 100-fachen Unterschied in der Ausführungszeit des Kernels. Warum sollte es einen Unterschied in meinen beiden Strategien geben?CUDA Thrust Funktor GMEM Zugriff: Ctor Daten kopieren vs Ctor dev Ptr Arg
Und allgemeiner: Gibt es einen kanonischen Weg, um einen Schubfunktor mit Zugang zu diesen Arten von Globalen bereitzustellen?
Meine erste Möglichkeit besteht darin, eine Kopie meiner globalen Daten in den Funktor zu legen. Die Schubmaschinen erscheinen auf dem Gerät hochladen und Caching auszuführen:
// functor containing a copy of array dependency
template<size_t BARSIZE>
struct foo1_func
{
__align__(16) float bar[BARSIZE];
foo1_func(float _bar[BARSIZE]) { memcpy(bar,_bar,BARSIZE*sizeof(float)); }
__host__ __device__ operator()(float &t) { t = do_something(t, bar); }
}
Called Schub mit :: for_each ...
// assuming barData is a float[]
foo<N>(barData);
Mein zweiten Weg ist das Hochladen auf das Gerät auszuführen ich Schub mit :: Kopieren und übergeben Sie einfach Device-Memory-Pointer der hochgeladenen Daten an meinen Funktor. Diese Methode scheint viel langsamer zu sein:
// functor containing device pointers to array in GMEM
struct foo2_func
{
float *bar;
foo2_func(float* _bar) { bar = bar; }
__host__ __device__ operator()(float &t) { t = do_something(t, bar); }
}
Called mit Schub :: for_each ...
// assuming d_bar is a thrust::device_vector
foo(thrust::raw_pointer_cast(d_bar.data()));
Links zu Quellen, die kanonischen oder einzigartige Funktors Muster dankbar angenommen illustrieren.
Was ist Ihr typischer 'BARSIZE'? – kangshiyin