LabVIEWForum.de
Mehrere Cuda DLLs Context-Übergabe - Druckversion

+- LabVIEWForum.de (https://www.labviewforum.de)
+-- Forum: LabVIEW (/Forum-LabVIEW)
+--- Forum: LabVIEW Allgemein (/Forum-LabVIEW-Allgemein)
+---- Forum: DLL & externer Code (/Forum-DLL-externer-Code)
+---- Thema: Mehrere Cuda DLLs Context-Übergabe (/Thread-Mehrere-Cuda-DLLs-Context-Uebergabe)



Mehrere Cuda DLLs Context-Übergabe - grey - 08.06.2010 14:42

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>


Mehrere Cuda DLLs Context-Übergabe - Y-P - 10.06.2010 18:42

BahnWacko
Das ist bestimmt wieder was für RolfK oder IchSelbst. Big Grin

Gruß Markus


Mehrere Cuda DLLs Context-Übergabe - rolfk - 17.06.2010 19:50

' schrieb:BahnWacko
Das ist bestimmt wieder was für RolfK oder IchSelbst. Big Grin

Gruß Markus

Nein sorry, damit habe ich mich noch nicht abgegeben. Mein externer Code ist so geschrieben dass er entweder reentrant ist und keine solchen Mätze benötigt oder intern selber durch Mutexes alle nötigen Schutzmechanismen trifft, dort wo das notwendig ist.

Aber da ist mir letzte Woche ein interessanter Artikel auf der NI site untergekommen der genau das Problem löst! ;-)