CUDA steter Erinnerung Best Practices

Präsentiere ich hier einige code

__constant__ int array[1024];

__global__ void kernel1(int *d_dst) {
   int tId = threadIdx.x + blockIdx.x * blockDim.x;
   d_dst[tId] = array[tId];
}

__global__ void kernel2(int *d_dst, int *d_src) {
   int tId = threadIdx.x + blockIdx.x * blockDim.x;
   d_dst[tId] = d_src[tId];
}

int main(int argc, char **argv) {
   int *d_array;
   int *d_src;
   cudaMalloc((void**)&d_array, sizeof(int) * 1024);
   cudaMalloc((void**)&d_src, sizeof(int) * 1024);

   int *test = new int[1024];
   memset(test, 0, sizeof(int) * 1024);

   for (int i = 0; i < 1024; i++) {
     test[i] = 100;
   }

   cudaMemcpyToSymbol(array, test, sizeof(int) * 1024);
   kernel1<<< 1, 1024 >>>(d_array);

   cudaMemcpy(d_src, test, sizeof(int) * 1024, cudaMemcpyHostToDevice);
   kernel2<<<1, 32 >>>(d_array, d_src),

   free(test);
   cudaFree(d_array);
   cudaFree(d_src);

   return 0;
}

Das zeigt einfach nur konstant Speicher und global memory die Nutzung zu. Über die Umsetzung der "kernel2" führt zu 4-mal schneller (in Bezug auf Zeit) als "kernel1"

Verstehe ich aus dem Cuda C programming guide, dass dies, weil die Zugriffe auf constant memory sind immer serialisiert. Das bringt mich auf die Idee, dass steter Erinnerung werden am besten verwertet, wenn ein warp auf eine einzige Konstante Werte wie integer, float, double usw. aber der Zugriff auf ein array ist überhaupt nicht vorteilhaft. In anderen Worten, ich kann nur sagen ein warp muss der Zugriff auf eine einzelne Adresse, um die positiven Optimierung/Beschleunigung, die Gewinne aus der Konstanten-Speicher zugreifen. Ist das richtig?

Außerdem möchte ich wissen, wenn ich halten eine Struktur, anstatt eine einfache Art, die in meiner ständigen Erinnerung. Jeder Zugriff auf die Struktur, die durch ein Gewinde mit einem warp; wird auch als single-memory-access-oder mehr? Ich meine eine Struktur enthalten könnte mehrere einfache Typen und array-zum Beispiel, wenn der Zugriff auf diese einfachen Typen sind, sind diese Zugriffe auch serialisiert oder nicht?

Letzte Frage wäre, falls ich ein array mit Konstanten Werten, die zugegriffen werden muss über verschiedene threads in einem warp; für schnelleren Zugriff es sollte gehalten werden im globalen Speicher anstelle von Konstanten Speicher. Ist das richtig?

Jeder kann finden Sie mir einige Beispiel-code, wo eine effiziente, Konstante Speicher Auslastung angezeigt wird.

Grüße,

InformationsquelleAutor Psypher | 2013-08-02

Schreibe einen Kommentar