Frage

Wie kann ich zuteilen und Transfer (vom und zum Host) 2D-Arrays in Gerätespeicher in Cuda?

War es hilfreich?

Lösung

fand ich eine Lösung für dieses Problem. Ich habe nicht das Array zu glätten.

Die eingebaute cudaMallocPitch() Funktion hat seinen Zweck erfüllt. Und ich konnte das Array und von Gerät cudaMemcpy2D() Funktion übertragen.

Zum Beispiel

cudaMallocPitch((void**) &array, &pitch, a*sizeof(float), b);

Dies erzeugt einen 2D-Array der Größe a * b mit der Tonhöhe wie als Parameter übergeben.

Der folgende Code erstellt ein 2D-Array und Schleifen über die Elemente. Es kompiliert leicht, können Sie es verwenden.

#include<stdio.h>
#include<cuda.h>
#define height 50
#define width 50

// Device code
__global__ void kernel(float* devPtr, int pitch)
{
    for (int r = 0; r < height; ++r) {
        float* row = (float*)((char*)devPtr + r * pitch);
        for (int c = 0; c < width; ++c) {
             float element = row[c];
        }
    }
}

//Host Code
int main()
{

float* devPtr;
size_t pitch;
cudaMallocPitch((void**)&devPtr, &pitch, width * sizeof(float), height);
kernel<<<100, 512>>>(devPtr, pitch);
return 0;
}

Andere Tipps

Flatten es: es eindimensional. Sehen Sie, wie es gemacht wird hier

Ihr Gerät Code könnte schneller sein. Versuchen Sie nutzen die Fäden mehr.

__global__ void kernel(float* devPtr, int pitch)
{
    int r = threadIdx.x;

    float* row = (float*)((char*)devPtr + r * pitch);
    for (int c = 0; c < width; ++c) {
         float element = row[c];
    }
}

Dann berechnen Sie die Blöcke und Threads Zuteilung angemessen, so dass jeder Thread befasst sich mit einem einzigen Element.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top