(28.06.2012 15:54 )pimbolie1979 schrieb: Hallo Jungs,
ich benutzte eine NVIDIA Grafikkarte als Co-Prozessor. Ich habe mit Visual Studio ein C Klasse geschrieben und dann eine DLL erzeugt. Diese habe ich jetzt in Labview eingebunden. Dies funktioniert auch alles super.
Jetzt zu meinem Problem:
Ich habe in Labview ein Array bereitsgestellt. Dieses Array enthält meine Daten. Wenn ich jetzt den DLL Knoten aufrufe, dann werden meine Daten aus dem PC-Speicher in den Grafikkarten Speicher kopiert. Dies dauert viel zu lange.
Daher gibt es von NVDIA eine eigene Malloc Funktion. Die normale Malloc Funktion benutzt "pageable memory". Die von NVIDA bereitgestellte Funktion benutzt "pinned memory" diese ist 2 bis 3 mal schneller als die pageable memory malloc funktion. Wie kann ich in Labview die schnelle "pinned memory" benutzen?
Ich könnte in Labview die NVIDA DLL aufrufen und dann die pinned memory malloc funktion benutzen, jedoch macht dies in Labview große Probleme. Gibt es in Labview nicht die Möglichkeit die Speicherbereitstellung auf pinned umzustellen?
Nein!! Du kannst den Memory Manager von LabVIEW nicht einfach umbiegen, und das willst Du auch nicht. Deine Grafikkarte hat nicht genügend Speicher um ein ganzes LabVIEW Programm zu enthalten. Und wenn die Daten dann im Host nötig sind, etwa zum Darstellen als Grafik oder was auch immer muss es wieder in den Hauptspeicher kopiert werden was einen Grossteil des Performancegewinns wieder kaputt macht. Du kannst CUDA Memory benützen aber musst das kategorisch vom LabVIEW Memory trennen. Grundsätzlich solltest Du entsprechende Memorybereiche mit CUDA Funktionen anlegen und manipulieren und innerhalb von LabVIEW nur als opaque Handles (refnums) behandeln. Wenn die Daten in LabVIEW schliesslich nötig sind, musst Du einen Heapblock allozieren und mit CUDA Funktionen diese aus dem Handle in diesen Block kopieren.
Aber bevor Du Dir hier einen Bruch holst solltest Du auf NI nach einer CUDA Library suchen. Ein entsprechendes Forum ist
hier. Die haben sowas schon implementiert und als Download verfügbar, aber CUDA Memory ist immer ein spezielles Speicherobjekt in LabVIEW. Etwas anders ist nur machbar mit direkten Änderungen im LabVIEW Source Code selber und das ist nur etwas das NI tun kann. Aber grundsätzlich lässt sich damit keine Eierlegende Wollmilchsau konstruieren. Die möglichen Anwendungsgebiete sind sehr spezifisch und bedingt durch die physikalische Trennung der verschiedenen Speicherbereiche nur mit extra Aufwand zu implementieren.
Wenn Du eine komplexe mathematische Operation hast die Du ganz auf dem GPU ausführen kannst dann macht das eventuel Sinn, aber die typische LabVIEW Applikation benötigt die Daten immer auch auf dem Host fürs Display und zum Beispiel während dem Debuggen, und das dabei ständig nötige Kopieren der Daten zwischen GPU und Hostspeicher würde jeglichen Performancegewinn mehr als zunichte machen.