2012-04-11 8 views
1

Ich versuche, so etwas wie dies in CUDA zu implementieren:Schub Funktors: „zu viele Ressourcen für den Start angefordert“

p = { p if p >= floor 
     z if p < floor 

für jedes Element Wo floor und z sind Konstanten am Anfang konfigurieren des Tests.

Ich habe versucht, es wie so zu implementieren, aber ich habe den Fehler "zu viele für den Start angeforderten Ressourcen"

A Funktors:

struct floor_functor : thrust::unary_function <float, float> 
{ 
     const float floorLevel, floorVal; 

     floor_functor(float _floorLevel, float _floorVal) : floorLevel(_floorLevel), floorVal(_floorVal){} 

     __host__ 
     __device__ 
     float operator()(float& x) const 
     { 
      if (x >= floorLevel) 
       return x; 
      else 
       return floorVal; 
     } 
}; 

durch eine transformieren:

thrust::transform(input->begin(), input->end(), output.begin(), floor_functor(floorLevel, floorVal)); 

Wenn ich eines der Mitglieder meines Funktors, sagen floorVal, entfernen und einen Funktor mit nur einer Mitgliedsvariablen verwenden, funktioniert es gut.

Weiß jemand, warum dies sein könnte, und wie ich es beheben könnte?

Zusätzliche Informationen:

Meine Array 786.432 Elemente lang.

Meine GPU ist eine GeForce GTX590

ich mit dem Befehl bin Gebäude:

`nvcc -c -g -arch sm_11 -Xcompiler -fPIC -Xcompiler -Wall -DTHRUST_DEBUG -I <my_include_dir> -o <my_output> <my_source>` 

Meine CUDA-Version 4.0:

$ nvcc --version 
nvcc: NVIDIA (R) Cuda compiler driver 
Copyright (c) 2005-2011 NVIDIA Corporation 
Built on Thu_May_12_11:09:45_PDT_2011 
Cuda compilation tools, release 4.0, V0.2.1221 

Und meine maximale Anzahl von Threads pro Block 1024 (gemeldet von deviceQuery):

Total amount of constant memory:    65536 bytes 
    Total amount of shared memory per block:  49152 bytes 
    Total number of registers available per block: 32768 
    Warp size:          32 
    Maximum number of threads per block:   1024 
    Maximum sizes of each dimension of a block: 1024 x 1024 x 64 
    Maximum sizes of each dimension of a grid:  65535 x 65535 x 65535 

UPDATE ::

ich auf eine Lösung für mein Problem gestolpert, aber es nicht verstehen. Wenn ich meinen Funktor von "floor_functor" in etwas anderes umbenenne, funktioniert es! Ich habe keine Idee, warum das der Fall ist, und wäre daran interessiert, jemandes Ideen dazu zu hören.

+2

Auf welcher GPU laufen Sie und welche CUDA-Version verwenden Sie? Es bedeutet wahrscheinlich, dass der Start des Schubkerns zu viele Threads pro Block für die Anzahl der von Ihrem Funktor verwendeten Register anfordert, aber das ist nur eine Vermutung. – talonmies

+0

Wie viele Elemente sind eingegeben? – Anycorn

+0

Zusätzlich zu den Informationen, die Talonmies angefordert hat, mit welcher Befehlszeile hast du deinen Code kompiliert? –

Antwort

1

Für eine einfachere Implementierung CUDA, können Sie dies in einer Zeile Code mit ArrayFire tun:

p(p < floor) = z; 

erklären Sie Ihre Variablen wie af :: Arrays.

Viel Glück!

Haftungsausschluss: Ich arbeite an allen möglichen CUDA-Projekten, einschließlich ArrayFire.