Hey Leute,
Da auf Win8 Developer endlich mein OpenCL klappt, hab Ich was feines gebastelt.
Dieses Script rechnet die Grund-Rechenarten (Plus, Minus, Geteilt, Mal) auf der GPU.
Das Script ist extrem einfach gehalten, Ich konnte es besser auch nicht
Kernel
AutoIt Quellcode
#include ".\Includes\OpenCL.au3"
$RechenArt = "+" ;Rechenart: + - / *
[/autoit] [autoit][/autoit] [autoit]$KernelSource = FileRead(@ScriptDir & "\Kernel.cl") ;Kernel Code lesen
$KernelSource = StringReplace($KernelSource, "[RECHEN_MODUS]", $RechenArt) ;Rechenart ersetzen, erspart für jeden Modus eine Datei
_CL_GetDevice("GPU") ;GPU auswählen für CL
[/autoit] [autoit][/autoit] [autoit]$iRuns = 100 ;Durchläufe
[/autoit] [autoit][/autoit] [autoit]$iInputBuffer1 = _DllStructCreate16("float[" & $iRuns & "]") ;Eingabe-Buffer
$iInputBuffer2 = _DllStructCreate16("float[" & $iRuns & "]") ;Eingabe-Buffer
For $iX = 1 To $iRuns ;Beispiel-Werte setzen (1 bis $iRuns) Kann ja geändert werden
DllStructSetData($iInputBuffer1, 1, $iX, $iX)
DllStructSetData($iInputBuffer2, 1, $iX, $iX)
Next
$hCL_Buffer_In1 = _CL_CreateBuffer($iInputBuffer1) ;CL Buffer erstellen
$hCL_Buffer_In2 = _CL_CreateBuffer($iInputBuffer2) ;CL Buffer erstellen
_CL_WriteBuffer($hCL_Buffer_In1, $iInputBuffer1) ;Daten von DllStruct in CL Buffer schreiben
_CL_WriteBuffer($hCL_Buffer_In2, $iInputBuffer2) ;Daten von DllStruct in CL Buffer schreiben
$iOutputBuffer = _DllStructCreate16("float[" & $iRuns & "]") ;DllStruct (Ausgabe) erstellen
$hCL_Buffer_Out = _CL_CreateBuffer($iOutputBuffer) ;CL Buffer erstellen mit Daten von Struct ^
_CL_SetArg(0, "ptr*", $hCL_Buffer_In1) ;Buffer 1 an Kernel übergeben
_CL_SetArg(1, "ptr*", $hCL_Buffer_In2) ;Buffer 2 an Kernel übergeben
_CL_SetArg(2, "ptr*", $hCL_Buffer_Out) ;Buffer Ausgabe an Kernel übergeben
_CL_RunKernel($iRuns, 0) ;Kernel starten
_CL_ReadBuffer($hCL_Buffer_Out, $iOutputBuffer) ;Ausgabe-Buffer lesen
For $iX = 1 To $iRuns
$iIn1 = DllStructGetData($iInputBuffer1, 1, $iX) ;Zahl 1
$iIn2 = DllStructGetData($iInputBuffer2, 1, $iX) ;Zahl 2
$iOut = DllStructGetData($iOutputBuffer, 1, $iX) ;Ergebnis
ConsoleWrite(StringFormat("Ergebnis: %i " & $RechenArt & " %i = %i", $iIn1, $iIn2, $iOut) & @LF) ;Ergebnis schreiben
Next
Und das Paket als Download: autoit.de/wcf/attachment/14545/
Ich hoffe euch gefällt es
mfg,
Dominik