Mit PureBasic GPU nutzen

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
Kiffi
Beiträge: 10711
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: Mit PureBasic GPU nutzen

Beitrag von Kiffi »

pyromane hat geschrieben:Denen Leuten, denen das nicht aufgefallen ist schenke ich eine Brille ;-)
wenn Du so viel Geld übrig hast, dann kannst Du Dir auch gleich eine gültige PB-Lizenz kaufen.
a²+b²=mc²
Benutzeravatar
Stevie63
Beiträge: 86
Registriert: 06.05.2009 23:02
Computerausstattung: Win 10, i7, fsc celsius

Re: Mit PureBasic GPU nutzen

Beitrag von Stevie63 »

Eine weitere Möglichkeit, sich mit CUDA zu beschäftigen, besteht in der Nutzung von Mathematica 8. Da viele Hochschulen eine Mathematica-Lizenz-Campus-Lizenz besitzen, besteht für die CUDA-Interessierten Studierenden unter euch evtl. die Möglichkeit, günstig an Mathematica zu kommen. Ich selber benutze Mathematica 8 mit der CUDA-Schnittstelle um Merkmalsbilder aus dem Kinect-Tiefenbild zu erzeugen. Zugreifen auf Mathematica tue ich aus PureBasic heraus über einen MathLink-Wrapper.


Viele Grüße

Stevie63
pyromane
Beiträge: 276
Registriert: 09.09.2010 14:10

Re: Mit PureBasic GPU nutzen

Beitrag von pyromane »

@Kiffi: Das Thema muss ich noch einmal auskramen oder?

@Stevie63: Mir scheint es als ob kaum ein Weg an CUDA vorbeiführt... Schade eigentlich.
PureBasic 5.21 LTS auf Windows 7 x64 (Intel i5 2500K, 8GB Ram, Nvidia GTX 780)
Benutzeravatar
Blackskyliner
Beiträge: 532
Registriert: 28.07.2005 00:54
Wohnort: /home/Blackskyliner/

Re: Mit PureBasic GPU nutzen

Beitrag von Blackskyliner »

Meine Meinung dazu ist, dass der Nvidia CUDA "Standard" schneller raus war als die OpenCL spezifikation die ja nur die ganzen Grafikkarten spezifischen Dinge wrapped. Daher wird es auch dümmlicher Art und weise überall favorisiert eingesetzt und alle mit einer ATI Karte schauen dumm aus der wäsche.

Wäre es anders würd ich nicht unbedingt überall eine Nvidia verbaut haben, denn mir kam es bei der Kaufentscheidung auf ebend diese Funktionalität an, die auch entsprechend von Programmen genutzt wird. Was nützt mir die Ati Stream - oder wie sie sich schimpft - Methode, wenn keiner außer 1-2 kleinen Programmen die nutzt?

Würde ich jemals was mit GPU Computing machen, dann auf OpenCL Basis, weil ich dann die anderen Nutzer, neben Nvida, nicht von meinem Programm ausschließen muss.
Dass CUDA direkt programmiert wahrscheinlich sogar eine höhere Performance aufweisen kann, als wenn man die katen mit OpenCL programmiert, das könnte man sich dabei schon fast denken, hierbei sollte man jedoch erstmal auf Benchmarks verweisen, welche ich bisher weder gesehen noch davon gehört habe. Weil es scheinbar keinen Furz interessiert.

Das sind auch nur alles meine Beobachtungen der gesamten Thematik, wenn ich mich Irre freue ich mich darauf eines besseren belehrt zu werden :)

So far...
Blackskyliner
Keine meiner Antworten ist endgültig, es kann passieren, dass ich den so eben geposteten Beitrag noch mehrmals ändere, um Doppelposts zu umgehen.
_________________
Purebasic Windows 7 x64 & Linux (Ubuntu 10.04LTS) 4.50[x64|x86] Nutzer
_________________
Projekte: YAED - Yet another Event Dispatcher
Benutzeravatar
Kiffi
Beiträge: 10711
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: Mit PureBasic GPU nutzen

Beitrag von Kiffi »

pyromane hat geschrieben:@Kiffi: Das Thema muss ich noch einmal auskramen oder?
ja, mach mal.
a²+b²=mc²
Benutzeravatar
dige
Beiträge: 1235
Registriert: 08.09.2004 08:53

Re: Mit PureBasic GPU nutzen

Beitrag von dige »

@Stevie63: Du hast hier so nebenbei erwähnt das Du mit dem XBox Kinect Sensor arbeitest.
Hast Du es schon geschafft direkt mit PB auf den Sensor zuzugreifen? Leider gibt es das
Microsoft Kinect SDK noch nicht und auch keinen VB/PB Wrapper für das OpenNI Framework.

Und was genau machst Du mit dem Teil? Ich will es für Gestensteuerung nutzen...
"Papa, ich laufe schneller - dann ist es nicht so weit."
Benutzeravatar
Stevie63
Beiträge: 86
Registriert: 06.05.2009 23:02
Computerausstattung: Win 10, i7, fsc celsius

Re: Mit PureBasic GPU nutzen

Beitrag von Stevie63 »

dige hat geschrieben:@Stevie63: Du hast hier so nebenbei erwähnt das Du mit dem XBox Kinect Sensor arbeitest.
Hast Du es schon geschafft direkt mit PB auf den Sensor zuzugreifen? Leider gibt es das
Microsoft Kinect SDK noch nicht und auch keinen VB/PB Wrapper für das OpenNI Framework.

Und was genau machst Du mit dem Teil? Ich will es für Gestensteuerung nutzen...

Hi,

um auf die Kinect zugreifen zu können, gibt es verschiedene Schnittstellen. Zwei der bekanntesten sind die API von OpenNI (wie du oben schon genannt hast) und einmal die API von codelaboratories. Die OpenNI ist eine sehr umfangreiche C/C++ - Bibliothek, die auch schon das Tracking enthält. Die lib von codelaboratories ist dagegen schon minimalistisch. Über einen wrap lässt sich sehr bequem auf die Kinect zugreifen, dh. man kann a) das normale Kamerabild und b) die Tiefenbilder "abgreifen".

Ich benutze die Kinect zuallererst für "Laborzwecke", d.h. ich bereite Aufgaben und Übungen für unser neues Medienlabor vor, welches sich zur Zeit im Aufbau befindet. Mein erstes "konkretes" Übungsbeispiel ist die Gestensteuerung für Armagetron, welche auch schon ganz gut funktioniert. Zur Zeit arbeit ich daran, Kinect-Bilder übers web zu übertragen. Funktioniert auch schon, aber noch ohne Kompression (Kompression muß aber sein, denn bei 25 frames pro Sekunde mit ca 300k für ein 8bit-Graustufenbild braucht man entweder eine gute Bandbreite oder eine gute Kompression). Weitere Übungen (hauptsächlich in Form von einfachen Spielen mit Gestensteuerung befindet sich in Planung).
Als Code lege ich den wrapper der codelaboratories bei. Achtung: die dll von codelaboratories ist in 32bit, also mit pb32 arbeiten.

Vielleicht schaffe ich es, im Laufe des Jahres eine Kinect-Lib (inkl. Tracking und ImageProcessing) in PB fertigzustellen. Wer Interesse hat, kann sich ja bei mir melden (aber zur Zeit noch alles ohne Gewähr).

Ach, ich vergaß: ohne die Autowin-Lib und das lib2pb-Tool von ts-soft hätte ich das Ganze nicht geschafft! Vielen Dank an ts-soft :allright: !!

cu, stevie63

Code: Alles auswählen


; Import-File created by Lib2PBImport
; Libname: CLNUIDevice.lib

; include <stdint.h>
; 
; typedef uint8_t BYTE;
; typedef uint16_t WORD;
; typedef uint32_t DWORD;
; typedef uint64_t QWORD;

; //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
; //
; // This library is part of CL NUI SDK
; // It allows the use of Microsoft Kinect cameras in your own applications
; //
; // For updates And file downloads go To: http://codelaboratories.com/get/kinect
; //
; // Copyright 2010 (c) Code Laboratories, Inc.  All rights reserved.
; //
; //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
; #pragma once
; #include <windows.h>
; 
; #define Import(type) extern "C" __declspec(dllimport)## type __cdecl
; 
; //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
; // NUIDevice  API
; //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
; Import(int) GetNUIDeviceCount();
; Import(PCHAR) GetNUIDeviceSerial(int index);
; 
; //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
; // CLNUIMotor  API
; //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
; // Motor instance type
; typedef void *CLNUIMotor;
; 
; // Library initialization
; Import(CLNUIMotor) CreateNUIMotor(PCHAR serial);
; Import(bool) DestroyNUIMotor(CLNUIMotor mot);
; 
; // Motor control
; Import(bool) SetNUIMotorPosition(CLNUIMotor mot, SHORT position);
; 
; // Get accelerometer Data
; Import(bool) GetNUIMotorAccelerometer(CLNUIMotor mot, SHORT &x, SHORT &y, SHORT &z);
; 
; Import(bool) SetNUIMotorLED(CLNUIMotor mot, BYTE value);
; //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
; 
; //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
; // CLNUICamera API
; //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
; // Camera instance type
; typedef void *CLNUICamera;
; 
; // Library initialization
; Import(CLNUICamera) CreateNUICamera(PCHAR serial);
; Import(bool) DestroyNUICamera(CLNUICamera cam);
; 
; // Camera capture control
; Import(bool) StartNUICamera(CLNUICamera cam);
; Import(bool) StopNUICamera(CLNUICamera cam);
; 
; // Camera video frame image Data retrieval
; Import(bool) GetNUICameraColorFrameRAW(CLNUICamera cam, PBYTE pData, int waitTimeout = 2000);
; Import(bool) GetNUICameraColorFrameRGB24(CLNUICamera cam, PBYTE pData, int waitTimeout = 2000);
; Import(bool) GetNUICameraColorFrameRGB32(CLNUICamera cam, PDWORD pData, int waitTimeout = 2000);
; 
; // Camera depth frame image Data retrieval
; Import(bool) GetNUICameraDepthFrameRAW(CLNUICamera cam, PUSHORT pData, int waitTimeout = 2000);
; Import(bool) GetNUICameraDepthFrameCorrected12(CLNUICamera cam, PUSHORT pData, int waitTimeout = 2000);
; Import(bool) GetNUICameraDepthFrameCorrected8(CLNUICamera cam, PBYTE pData, int waitTimeout = 2000);
; Import(bool) GetNUICameraDepthFrameRGB32(CLNUICamera cam, PDWORD pData, int waitTimeout = 2000);
; /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////


EnableExplicit



ImportC "CLNUIDevice.lib"
	; ================================================================
	; *Data: .a (1 Byte, 0-255),  *camera: void *
	; Import(bool) GetNUICameraDepthFrameCorrected8(CLNUICamera cam, PBYTE pData, int waitTimeout = 2000);
	GetNUICameraDepthFrameCorrected8.l(*camera, *pData, waitTimeout.l) As "_GetNUICameraDepthFrameCorrected8"
	; ================================================================	
	; *pData: .u (2 Byte, 0-65535)
	; Import(bool) GetNUICameraDepthFrameCorrected12(CLNUICamera cam, PUSHORT pData, int waitTimeout = 2000);
	GetNUICameraDepthFrameCorrected12.l(*camera, *pData, waitTimeout.l) As "_GetNUICameraDepthFrameCorrected12"
	; ================================================================		
	; *pData: .l (32 Bit unsigned)
	; Import(bool) GetNUICameraDepthFrameRGB32(CLNUICamera cam, PDWORD pData, int waitTimeout = 2000);
	GetNUICameraDepthFrameRGB32.l(*camera, *pData, waitTimeout.l) As "_GetNUICameraDepthFrameRGB32"
	; ================================================================			
	; *pData: .u (2 Byte, 0-65535)
	; Import(bool) GetNUICameraDepthFrameRAW(CLNUICamera cam, PUSHORT pData, int waitTimeout = 2000);
	GetNUICameraDepthFrameRAW.l(*camera, *pData, waitTimeout.l) As "_GetNUICameraDepthFrameRAW"
	; ================================================================			
	; *pData: .l (32 Bit unsigned)
	; Import(bool) GetNUICameraColorFrameRGB32(CLNUICamera cam, PDWORD pData, int waitTimeout = 2000);
	GetNUICameraColorFrameRGB32.l(*camera, *pData, waitTimeout.l) As "_GetNUICameraColorFrameRGB32"
	; ================================================================				
	; *Data: .a (1 Byte, 0-255),  *camera: void *
	; Import(bool) GetNUICameraColorFrameRGB24(CLNUICamera cam, PBYTE pData, int waitTimeout = 2000);
	GetNUICameraColorFrameRGB24.l(*camera, *pData, waitTimeout.l) As "_GetNUICameraColorFrameRGB24"
	; ================================================================				
	; Import(bool) GetNUICameraColorFrameRAW(CLNUICamera cam, PBYTE pData, int waitTimeout = 2000);
	GetNUICameraColorFrameRAW.l(*camera, *pData, waitTimeout.l) As "_GetNUICameraColorFrameRAW"
	; ================================================================			
	; Import(bool) StopNUICamera(CLNUICamera cam);
	StopNUICamera.l(*camera) As "_StopNUICamera"
	; ================================================================			
	; Import(bool) StartNUICamera(CLNUICamera cam);
	StartNUICamera.l(*camera) As "_StartNUICamera"
	; ================================================================				
	; Import(bool) DestroyNUICamera(CLNUICamera cam);
	DestroyNUICamera.l(*camera) As "_DestroyNUICamera"
	; ================================================================			
	; Import(CLNUICamera) CreateNUICamera(PCHAR serial);
	CreateNUICamera.l(*serial) As "_CreateNUICamera"
	; ================================================================			
	; Import(bool) SetNUIMotorLED(CLNUIMotor mot, BYTE value);
	SetNUIMotorLED.l(*motor,value.a ) As "_SetNUIMotorLED"
	; ================================================================			
	; Import(bool) SetNUIMotorPosition(CLNUIMotor mot, SHORT position);
	SetNUIMotorPosition.l(*motor,position.w) As "_SetNUIMotorPosition"
	; ================================================================			
	; Import(bool) GetNUIMotorAccelerometer(CLNUIMotor mot, SHORT &x, SHORT &y, SHORT &z);
	GetNUIMotorAccelerometer.l(*motor,*x,*y,*z) As "_GetNUIMotorAccelerometer"
	; ================================================================			
	; Import(bool) DestroyNUIMotor(CLNUIMotor mot);
	DestroyNUIMotor.l(*motor) As "_DestroyNUIMotor"
	; ================================================================			
	; Import(CLNUIMotor) CreateNUIMotor(PCHAR serial);
	CreateNUIMotor.i(*serial) As "_CreateNUIMotor"
	; ================================================================			
	; Import(PCHAR) GetNUIDeviceSerial(int index);
	GetNUIDeviceSerial.i(index.l) As "_GetNUIDeviceSerial"
	; ================================================================			
	; Import(int) GetNUIDeviceCount();
	GetNUIDeviceCount.l() As "_GetNUIDeviceCount"
	; ================================================================			
EndImport


Kann sein, daß beim Wrapper noch der eine oder andere Bug ist (ich habe noch nicht alle Funktionen getestet, da ich hauptsächlich das Kamerabild, das 24bit-Tiefenbild und 8bit-Tiefenbild benutze.).
Benutzeravatar
dige
Beiträge: 1235
Registriert: 08.09.2004 08:53

Re: Mit PureBasic GPU nutzen

Beitrag von dige »

@Stevie63: Danke. Leider funktioniert bei den aktuellen CL-Treibern (12/10/2010)
unter WinXP nur die Motor- und LED-Steuerung, die Kamera jedoch nicht.

Mit einer älteren Version vom November funktionieren die SDK Tools und mit geänderten
Imports auch das aktivieren der Kamera via PB. Allerdings konnte ich keinen Snapshot
der RGB bzw. Tiefendaten ziehen. Ich bekomme nur #NULL Bytes...

Code: Alles auswählen

Define *serial, *camera, *motor, *rawData

; Code für CL Version 11/21/2010
; http://codelaboratories.com/nui/
*camera = CreateNUICamera(0)
If *camera
  If StartNUICamera(*camera)
    *rawData = AllocateMemory(640*480*4)
    ;GetNUICameraDepthFrameRAW (*camera, *rawData, 2000)
    GetNUICameraColorFrameRAW (*camera, *rawData, 2000)
    CreateFile(#Null, "C:\Temp\RawScan.bin")
    WriteData(#Null, *rawData, 640*480*4)
    CloseFile(#Null)
    FreeMemory(*rawData)
    StopNUICamera(*camera)
    DestroyNUICamera(*camera)
  EndIf
EndIf
Mit welcher Treiber-Version und welchem Windows arbeitest Du? Die CL Treiber sind zwar
schön schlank und wohl auch schneller, leider funktionieren damit die Tools wie Brekel, KinEmote
usw. nicht. Auch die Gestenerkennung müsste man damit selbst machen, oder?

Ich melde hiermit schon mal mein _großes_ Interesse an Deinem Kinect-PB-Framework an! :D
"Papa, ich laufe schneller - dann ist es nicht so weit."
Benutzeravatar
Stevie63
Beiträge: 86
Registriert: 06.05.2009 23:02
Computerausstattung: Win 10, i7, fsc celsius

Re: Mit PureBasic GPU nutzen

Beitrag von Stevie63 »

dige hat geschrieben:@Stevie63: Danke. Leider funktioniert bei den aktuellen CL-Treibern (12/10/2010)
unter WinXP nur die Motor- und LED-Steuerung, die Kamera jedoch nicht.

Mit einer älteren Version vom November funktionieren die SDK Tools und mit geänderten
Imports auch das aktivieren der Kamera via PB. Allerdings konnte ich keinen Snapshot
der RGB bzw. Tiefendaten ziehen. Ich bekomme nur #NULL Bytes...


Mit welcher Treiber-Version und welchem Windows arbeitest Du? Die CL Treiber sind zwar
schön schlank und wohl auch schneller, leider funktionieren damit die Tools wie Brekel, KinEmote
usw. nicht. Auch die Gestenerkennung müsste man damit selbst machen, oder?

Ich melde hiermit schon mal mein _großes_ Interesse an Deinem Kinect-PB-Framework an! :D

Hi dige,

ich stelle die Tage ein funktionierendes code-Beispiel rein.

Das Kinemote-Paket funktioniert nicht zusammen mit dem cl-Paket und umgekehrt, Auch OpenNI darf nicht installiert sein, allein cl.

Ich habe win 7 prof. 64bit und dasselbe cl-Paket wie du.

cu

Stevie
Benutzeravatar
dige
Beiträge: 1235
Registriert: 08.09.2004 08:53

Re: Mit PureBasic GPU nutzen

Beitrag von dige »

Insgesamt habe ich 3 verschiedene Treiber für den Kinect Seonsor gefunden:

- OpenKinect
- PrimeSense
- Codelaboratories

Mit jeden geht was und ne Menge nicht ... es ist eine krux :-\
Hoffentlich kommt wirklich bald das offizielle SDK.
Bin schon auf Dein Bsp. gespannt!
"Papa, ich laufe schneller - dann ist es nicht so weit."
Antworten