Mehrere Cuda DLLs Context-Übergabe
Hallo,
ich versuche gerade mehrere DLLs, die Cuda Code ausführen sollen, zusammenzubringen. Meine Idee war, dass ich in der ersten DLL den Speicher auf der Grafikkarte allkokiere, dann in der Zweiten meine Berechnungen durchführe und schließlich in der Dritten den speicher wieder frei gebe.
Mir ist klar, dass alle drei DLLs auf dem gleichen Thread laufen müssen damit das geht, es aber suboptimal ist in ihnen den "UI Thread" als diesen Thread einzustellen. Glücklicherweise gibt es ja diesen Cuda Context und so war meine Idee, dass ich mir einen solchen in der ersten DLL erzeuge dann vom Thread löse (via. cuCtxPopCurrent() ), in der Zweiten wieder an den aktuellen Thread binde ( cuCtxPuchCurrent() ) und am Ende wieder von ihm löse. In der Dritten soll er dann schließlich gelöscht werden.
Bedauewrlicherweise scheint das nicht zu funktionieren, wenn ich mir Fehler ausgeben lasse so bekomme ich in der zweiten DLL oft die Meldung, dass das aktuelle Device nicht verfügbar ist oder bekomme nichts ausgegeben -was aber am Ergebnis nichts ändert.
Ich vermute, dass ich die Übergabe dieses cuContext nicht richtig mache, mir fällt dazu aber auch gerade nichts anderes ein. Ich hoffe, dass mir hier jemand ein paar Hinweise geben kann. Achja die LabVIEW eigene bibliothek möchte ich nicht nutzen da ich ein 64Bit System habe und ich diese Lösung etwas verworren finde, obgleich ja hinter dem Context den sie dort erzeugen, dass Gleiche stehen müsste.
Hier nun ein schemtaische Darstellung wie es bei mir gerade aussieht, wie zu erkennen wandle ich den context zur Übergabe in einen uint32_t um:
<div class='codetop'>CODE</div><div class='codemain' style='height:200px;white-space:pre;overflow:auto'>float *dR, ... ;
cudaMalloc((void**)&dR,size);
...
*d_R=(uint32_t)dR;
...
cuCtxPopCurrent(&hCtx);checkCUDAError("pop ctx");
}
// Second DLL: will be executed in a while loop
void KernelCaller(float *R, ..., uint32_t hctx, float *d_R, ...) //uint32_t d_R already castet to *float i wrapper function
{
CUcontext h_Ctx;
h_Ctx=(CUcontext)hctx;
cuCtxPushCurrent(h_Ctx);
dim3 grid, block;
block.x=BLOCK_SIZE;
grid.x=(n/BLOCK_SIZE);
cudaMemcpy(d_R,R,size,cudaMemcpyHostToDevice);
Kernel_gpu<<<grid,block>>>(d_R, ... );
cuCtxPopCurrent(&h_Ctx);
}
// Third DLL: free allocated memory, executes one time after while loop
void KernelCaller(uint32_t hctx,float *d_R, ...) //uint32_t d_R already castet to *float i wrapper function
{
CUcontext h_Ctx;
h_Ctx=(CUcontext)hctx;
cudaFree(&d_R);
cuCtxDestroy(h_Ctx);
}</div>
|