INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.


Antwort schreiben 

Mehrere Cuda DLLs Context-Übergabe



Wenn dein Problem oder deine Frage geklärt worden ist, markiere den Beitrag als "Lösung",
indem du auf den "Lösung" Button rechts unter dem entsprechenden Beitrag klickst. Vielen Dank!

08.06.2010, 14:42
Beitrag #1

grey Offline
LVF-Grünschnabel
*


Beiträge: 37
Registriert seit: Feb 2007

2010
2006
kA

56
Deutschland
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>
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
Anzeige
10.06.2010, 18:42 (Dieser Beitrag wurde zuletzt bearbeitet: 10.06.2010 18:43 von Y-P.)
Beitrag #2

Y-P Offline
☻ᴥᴥᴥ☻ᴥᴥᴥ☻
LVF-Team

Beiträge: 12.612
Registriert seit: Feb 2006

Developer Suite Core -> LabVIEW 2015 Prof.
2006
EN

71083
Deutschland
Mehrere Cuda DLLs Context-Übergabe
BahnWacko
Das ist bestimmt wieder was für RolfK oder IchSelbst. Big Grin

Gruß Markus

--------------------------------------------------------------------------
Bitte stellt mir keine Fragen über PM, dafür ist das Forum da - andere haben vielleicht auch Interesse an der Antwort !!
--------------------------------------------------------------------------
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
17.06.2010, 19:50
Beitrag #3

rolfk Offline
LVF-Guru
*****


Beiträge: 2.305
Registriert seit: Jun 2007

alle seit 6.0
1992
EN

2901GG
Niederlande
Mehrere Cuda DLLs Context-Übergabe
' 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! ;-)

Rolf Kalbermatter
Technische Universität Delft, Dienst Elektronik und Mechanik
https://blog.kalbermatter.nl
Webseite des Benutzers besuchen Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren to top
Antwort schreiben 


Möglicherweise verwandte Themen...
Themen Verfasser Antworten Views Letzter Beitrag
  DLL mit String Nullpointer Übergabe Hubert R. 5 5.994 25.08.2023 11:43
Letzter Beitrag: rolfk
  DLLs kopieren/Bibliothek nicht gefunden ares2013 4 5.517 26.11.2020 17:06
Letzter Beitrag: rolfk
  verschiedene DLLs über ein Libary Fct Node M@rRy 16 14.372 19.08.2011 12:37
Letzter Beitrag: GerdW
  Übergabe eines struct arrays an eine DDL und wieder Auslesen SK-AC 4 7.227 12.08.2010 17:01
Letzter Beitrag: rolfk
  LV 7.1, VC++-DLL (VC++2008), string-Übergabe ptillmann 1 5.170 12.03.2010 20:34
Letzter Beitrag: rolfk
  NVIDIA CUDA DLL einbinden joedoe1979 5 9.051 12.08.2009 13:08
Letzter Beitrag: joedoe1979

Gehe zu: