Problem mit CUDA



  • Hi,
    ich habe momentan ein CUDA Programm mit einer BlockDimension von 16x16 Threads.
    Die Größe des Grids wird entsprechend der Größe des Problems angepasst.
    Nun kopiere ich alle Daten zum Bearbeiten im Kernel, in den Grafikspeicher.
    Das sind im moment so ca. 20 mio. doubles (ja, ich verwende CUDA 1.3 und höher).
    Um auf die Daten im Kernel zuzugreifen, habe ich bisher immer folgende Methode zum Berechnen des Index benutzt:

    int index = (blockIdx.y * gridDim.x + blockIdx.x) * blockDim.y * blockDim.x + threadIdx.y * blockDim.x + threadIdx.x;
    

    Allerdings hat der Kernel ab einer Größe des Arrays von ca. 1,4 mio. aufgehört überhaupt auf die Daten zuzugreifen. cudaMalloc oder die Kernelfunktion haben dabei aber keinen Error zurückgegeben.
    Nun habe ich die Methode zum berechnen des Index geändert:

    int ix = threadIdx.x + blockIdx.x *  blockDim.x;
    int iy = threadIdx.y + blockIdx.y *  blockDim.y;
    int index = ix + iy * gridDim.x;
    

    Dies klappt nun bis zur einer größe des Arrays von ca. 6 mio. Ab 6 mio. werden zwar auch Werte in das Array geschrieben, diese sehen aber so aus, als ob Cuda keine doubles unterstützen würde (also der maximale Wert von float). Ab ca. 12 mio. Einträgen im Array hört der Kernel dann komplett auf, irgendwie auf das Array zuzugreifen.
    Nun habe ich keine Ahnung woran das liegen könnte. Vielleich habt ihr ja ein paar Tipps 🙂
    Was ich auchnoch probiert habe, ist den Block 3 dimensional zu machen. Dann macht der Kernel auch bis zur einer Größe von ca. 12 mio mit, danach ist aber auch Sense. Allerdings bin ich mir nicht ganz sicher, ob meine Indexberechnung dabei stimmt:

    int ix = threadIdx.x + blockIdx.x *  blockDim.x;
    int iy = threadIdx.y + blockIdx.y *  blockDim.y;
    int index = (ix + iy * gridDim.x) * threadIdx.z;
    

    Und hier noch der Code wie ich das Array beschreibe:

    // size = Größe des Problems
    if (index < size) {
        params[index] = index;
    }
    


  • Dieser Thread wurde von Moderator/in SeppJ aus dem Forum C++ (auch C++0x) in das Forum Rund um die Programmierung verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.


Anmelden zum Antworten