Zuteilen 2D-Array auf Gerätespeicher in CUDA
-
20-08-2019 - |
Frage
Wie kann ich zuteilen und Transfer (vom und zum Host) 2D-Arrays in Gerätespeicher in Cuda?
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.