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);
}
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. –
@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. –