2016-05-23 11 views
1

Das hier funktioniert tatsächlich, so frage ich mich, ist Cuda dynamisch Speicher auf dem Gerät im Thread zuweisen? Wenn ja, was ist die Verwendung von , da dies im Vergleich viel viel viel schneller ist? Ich frage, was wirklich hinter der Szene passiert, wenn Sie den cudaMalloc im Kernel verwenden, da es so viel schneller scheint als nur Gerät malloc auf Heap.Was passiert eigentlich, wenn Sie cudaMalloc im Gerät anrufen?

#include <iostream> 
#include <numeric> 
#include <stdlib.h> 

__global__ void testMem(int* time){ 
    int* a; 
    cudaMalloc(&a,sizeof(int)); 
    a[0] = 4; 
    time = a[0]; 
} 

__global__ void testMem2(int* time){ 

} 
int main(){ 
    int* h_time = (int*)malloc(sizeof(int)); 
    h_time[0] =0; 
    int* d_time; 
    cudaMalloc(&d_time,sizeof(int)); 
    clock_t start1 = clock(); 
    cudaMemcpy(d_time,h_time,sizeof(int),cudaMemcpyHostToDevice); 

    testMem<<<1,1>>>(d_time); 
    cudaMemcpy(h_time,d_time,sizeof(int),cudaMemcpyDeviceToHost); 
    cudaDeviceSynchronize(); 
    clock_t end1 = clock(); 

    int result = end1- start1; 
    //float result = (float)*h_time; 
    //result =result/ CLOCKS_PER_SEC; 
    std::cout<<result<<std::endl; 
    std::cout<<*h_time<<std::endl; 
    //std::cout<<(1<<10); 
    cudaFree(d_time); 
    free(h_time); 

} 

Antwort

1

Starten von compute function 3.5, können Sie einen Teil der Cuda Runtime API in Kernen verwenden. Diese Verfahren sind als __host__ __device__ in der Dokumentation erklärt, wie here:

__host__ ​ __device__ ​cudaError_t cudaMalloc (void** devPtr, size_t size)

Weisen-Speicher auf dem Gerät.

Dabei erinnern an das Gerät-Laufzeitbibliothek zu verknüpfen: cudadevrt.lib.

Es gibt eine andere Möglichkeit, dynamisch Speicher auf dem Gerät zuzuweisen: die Verwendung von malloc, die anders implementiert ist (dokumentiert here). Es verwendet einen kleinen Speicher-Heap und benötigt nicht die gleiche Rechenleistung.

+0

Gibt es irgendwo, ich kann lesen, wie cudaMalloc implementiert ist, wenn innerhalb eines Kernels aufgerufen? Ich würde es wirklich gerne wissen, bevor ich anfangen würde, alle meine malloc-Funktionen auszuschalten. –

+1

@RockyZhang, Nun, ich glaube, das ist Teil einer internen Implementierung von cudadevrt. Wenn Sie weitere Informationen zu diesem Thema benötigen, sollten Sie sich als Entwickler registrieren und Ihre Frage direkt an NVIDIA stellen. Aber meiner Meinung nach ist das Off-Topic SO. –

Verwandte Themen