OpenCl goes AutoIt Update 31.Dezember 2016

  • UEZ
    Was hast du denn für ein GraKa und CPU?
    Intel Grafikkarten werden noch nicht unterstützt.
    Und bei Intel's CPUs werden mit deren Runtime nur Prozessoren unterstützt die mindestens SSE 4.1 unterstützen.
    Durchaus möglich das du leider keine unterstützte Hardware zur Verfügung hast.

    Im übrigen brauchst du keine kompletten SDKs installieren. Bei AMD und NVidia-Hardware reicht der neueste Grafiktreiber und bei Intel CPUs reichen die OpenCL SDK runtime-only.

  • Meine CPU: Intel Core i5 M540@2.53 GHz
    Die GFX-Karte: Video Adapter Intel(R) HD Graphics, Video Processor Intel(R) HD Graphics (Core i5)

    Lade gerade mir die Intel® OpenCL SDK version 1.5 runtime-only herunter...


    Mal sehen, ob's danach geht!

    Danke,
    UEZ

    Auch am Arsch geht ein Weg vorbei...

    ¯\_(ツ)_/¯

  • Gut, jetzt gibt es keine FM mehr, aber was sollte denn passieren, wenn ich z.B. openCl_vereinfacht_tunnel.au3 starte?

    Ich bekomme ein "Build started, Kernel <tunnelflug> was successfully vectorized. Done."

    Gruß,
    UEZ

    Auch am Arsch geht ein Weg vorbei...

    ¯\_(ツ)_/¯

  • Den Tunnelflug kenne ich ja :whistling: , aber nach der Meldung passiert nichts. :(

    Spoiler anzeigen
    [autoit]


    ;Idea taken from http://js1k.com/demo/165
    ;Ported to AutoIt by UEZ Build 2010-08-22
    #AutoIt3Wrapper_UseUpx=n
    #AutoIt3Wrapper_Run_Obfuscator=y
    #Obfuscator_Parameters=/sf /sv /om /cs=0 /cn=0
    #AutoIt3Wrapper_Run_After=del /f /q "Tunnel Flight_Obfuscated.au3"
    #AutoIt3Wrapper_Run_After=upx.exe --ultra-brute "%out%"
    ;~ #AutoIt3Wrapper_Run_After=upx.exe --best "%out%"
    #include <GDIPlus.au3>
    #include <GUIConstantsEx.au3>
    Opt("MustDeclareVars", 1)
    Opt("GUIOnEventMode", 1)

    [/autoit] [autoit][/autoit] [autoit]

    Local $hGUI, $hGraphics, $hBackbuffer, $hBitmap
    Local $W = 150, $H = 150
    ; Initialize GDI+
    _GDIPlus_Startup()

    [/autoit] [autoit][/autoit] [autoit]

    $hGUI = GUICreate("GDI+ Tunnel Flight by UEZ", $W, $H)
    GUISetState()

    [/autoit] [autoit][/autoit] [autoit]

    $hGraphics = _GDIPlus_GraphicsCreateFromHWND($hGUI)
    $hBitmap = _GDIPlus_BitmapCreateFromGraphics($W, $H, $hGraphics)
    $hBackbuffer = _GDIPlus_ImageGetGraphicsContext($hBitmap)

    [/autoit] [autoit][/autoit] [autoit]

    ; Using antialiasing
    ;~ _GDIPlus_GraphicsSetSmoothingMode($hBackbuffer, 2)

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    ; Create a Brush object
    Local $hBrush = _GDIPlus_BrushCreateSolid()

    [/autoit] [autoit][/autoit] [autoit]

    GUISetOnEvent($GUI_EVENT_CLOSE, "_Exit")

    [/autoit] [autoit][/autoit] [autoit]

    Local $pi = ACos(-1), $pi2 = 2 * $pi, $pi05 = ACos(-1) * 0.5, $05pi = 5 / $pi2
    Local $HW = $H * 0.5, $HH = $W * 0.5
    Local $A0 = 0, $A1 = 0, $A2 = 0, $A3 = 0
    Local $ox = 0, $oy = 0, $0z = 0
    Local $tu = 0, $tv = 0
    Local $speed = 3
    Local $i, $j, $x, $y, $o
    Local $cc, $ss, $z, $col
    Local $dx, $dy, $dz, $rd, $A, $B, $C, $R, $t1, $tu, $tv, $q, $g, $l
    Local $d[$W + 1]

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    While Sleep(10)
    ;~ _GDIPlus_GraphicsClear($hBackbuffer, 0xFF000000)

    [/autoit] [autoit][/autoit] [autoit]

    For $i = 0 To $H Step $speed
    For $j = 0 To $W Step $speed
    $dx = ($j - $HW) / $W
    $dy = ($i - $HH) / $H
    $dz = -0x1
    $l = Sqrt($dx * $dx + $dy * $dy + $dz * $dz)
    $dx /= $l
    $dy /= $l
    $dz /= $l
    $x = $dx
    $y = $dy
    Rotate($A0 - $A2)
    $dy = $y
    $dx = $x
    $x = $dy
    $Y = $dz
    Rotate($A3)
    $dy = $x
    $dz = $y
    $R = 0x64
    $A = $dx * $dx + $dy * $dy
    $B = ($dx * $ox + $dy * $oy) + ($dx * $ox + $dy * $oy)
    $C = $ox * $ox + $oy * $oy - $R * $R
    $rd = Sqrt($B * $B - 4 * $A * $C)
    $q = -0.5 * ($B - $rd)
    $t1 = $C / $q
    $tu = $05pi * ATan($dy / $dx)
    $tv = $dz * $t1 / 0x100
    $tv += $A1
    $g = Hex(BitAND(BitXOR(($tu * 0xFF), ($tv * 0xFF)), 0xFF), 2)
    $col = "0xFF" & $g & $g & $g
    _GDIPlus_BrushSetSolidColor($hBrush, $col)
    ;~ _GDIPlus_BitmapSetPixel($hBitmap, $j, $i, $col)
    _GDIPlus_GraphicsFillRect($hBackbuffer, $j, $i, $speed, $speed, $hBrush)
    Next
    $A0 += 0.0006
    $A1 += 0.0009
    $A2 += 0.0002
    $A3 += 0.0001
    Next

    [/autoit] [autoit][/autoit] [autoit]

    _GDIPlus_GraphicsDrawImageRect($hGraphics, $hBitmap, 0, 0, $W, $H)
    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    Func Rotate($t)
    $cc = Cos($t)
    $ss = Sin($t)
    $z = $x * $cc - $y * $ss
    $y = $x * $ss + $y * $cc
    $x = $z
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func ATan2($y, $x)
    ;~ Return (2 * ATan($y / ($x + Sqrt($x * $x + $y * $y))))

    [/autoit] [autoit][/autoit] [autoit]

    If ($x > 0) Then Return ATan($y / $x)
    If ($x < 0 And $y >= 0) Then Return ATan($y / $x + $pi)
    If ($x < 0 And $y < 0) Then Return ATan($y / $x - $pi)
    If ($x = 0 And $y > 0) Then Return $pi05
    If ($x = 0 And $y < 0) Then Return -$pi05
    If ($x = 0 And $y = 0) Then Return 0

    [/autoit] [autoit][/autoit] [autoit]

    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _GDIPlus_BitmapSetPixel($hBitmap, $iX, $iY, $iARGB = 0xFFFFFFFF)
    Local $aRet
    $aRet = DllCall($ghGDIPDll, "int", "GdipBitmapSetPixel", "hwnd", $hBitmap, "int", $iX, "int", $iY, "dword", $iARGB)
    Return
    EndFunc ;==>_GDIPlus_BitmapSetPixel

    [/autoit] [autoit][/autoit] [autoit]

    Func _Exit()
    ; Clean up
    _GDIPlus_BrushDispose($hBrush)
    _GDIPlus_BitmapDispose($hBitmap)
    _GDIPlus_GraphicsDispose($hBackbuffer)
    _GDIPlus_GraphicsDispose($hGraphics)

    [/autoit] [autoit][/autoit] [autoit]

    ; Uninitialize GDI+
    _GDIPlus_Shutdown()
    Exit
    EndFunc

    [/autoit]

    Gruß,
    UEZ

    Auch am Arsch geht ein Weg vorbei...

    ¯\_(ツ)_/¯

  • UEZ: Hast du auch einen Neustart nach der Installation gemacht? Das AMD-SDK hats bei mir jedenfalls gebraucht.

  • Zitat von UEZ

    Ich bekomme ein "Build started, Kernel <tunnelflug> was successfully vectorized. Done."

    cool, habe ich noch nie gesehen, öfter mal was neues^^
    Bekommst du diese Info in einer Msgbox?
    Wird sonst etwas in der Console ausgegeben?

  • Die Info kommt in einer Messagebox
    autoit.de/wcf/attachment/14539/

    und dies hier in der Console:

    Spoiler anzeigen

    Gruß,
    UEZ

  • oha...
    das ist also auf jeder Platform anders....ich fixe das...
    UEZ, als schnellste Lösung die msgbox und das anschliessende exit in der Datei OpenCl_easy in Zeile 112 auskommentieren

  • Kleiner Bugfix, neue OpenCl.zip

    Danke an UEZ fürs Testen!
    Todo: Zuordnung Structs und deren Pointer in den Wrapperfiunktionen konform mit der API machen, Nullpointer wie in C++ einführen, damit aus

    Code
    context = clCreateContextFromType(cps,
                                          CL_DEVICE_TYPE_ALL,
                                          NULL,
                                          NULL,
                                          &status);
    oder 
    cl::Context context(CL_DEVICE_TYPE_CPU, cps, NULL, NULL, &err);

    auch

    [autoit]

    clCreateContextFromType($context_prop, $device_type, $NULL, $NULL, $errcode_ret)

    [/autoit]

    werden kann
    oder alternativ übergibt man dllstructgetptr($nullpointer) ?!

  • Ich finds auch echt super ;)
    Und ich bin dafür dass wir es (wenn es möglich wäre) in den zukünftigen AutoIt Versionen aufnehmen könnten :D

    Gruß
    fabi

  • Komisch, seit dem es diesen Beitrag hier gibt, stolpere ich dauernd über OpenCl ... ob nun für die Engine eines Videoschnitt-Programms oder für Berechnungen *g*

    Schön mit AutoIt am "Plus der Zeit" zu sein :D

  • Zitat

    Da gibt es noch andere Dinge, z.B. vernünftiger inline-Assembler und einfachere struct's.

    Für das, wozu AutoIt gedacht ist, reicht es imho völlig aus und ist auch schnell genug!
    Wer wirklich um jede Millisekunde kämpfen muss, der investiert z.B. in den Intel-C++-Compiler, jagt seinen Code durch den Profiler und schreibt die "inner loops" dann in Assembler (oder Instrincs, was dasselbe ist, nur "aufgehübscht"). Damit ist auf der CPU das Ende der Fahnenstange erreicht!

    Die Kombination OpenCl/OpenGL ist auf Grafikkarten von KEINER der zur Zeit angebotenen CPU´s zu schlagen, passende Algorithmen vorrausgesetzt.
    Wobei man allerdings durch die "Hintertür" auch ohne Grafikkarte alle Cores der CPU ohne Threadmanagement benutzen kann!
    GPGPU bzw. OpenCl läuft sowieso über die API-Funktionen, da ist der "Unterbau", also AutoIt oder Basic oder C/C++ völlig irrelevant!
    Natürlich kann man sich beim Nasebohren den Finger brechen, die Frage ist, ob man das wirklich machen MUSS!
    Inline-Assembler ist zwar gut und schön, aber genausogut schreibt man eine DLL in Assembler/C/C++ und ruft die Funktionen einfachst in AutoIt über DLL-Calls auf. Die DLL in den AutoIt-Code z.B. mit UEZ´s Base64 eingebunden und gut ists....

  • Natürlich kann man sich beim Nasebohren den Finger brechen, die Frage ist, ob man das wirklich machen MUSS!


    :rofl: das darf man sich nicht bildlich vorstellen...^^

  • Hi,
    habe mal auf die Schnelle ein Anzeigescript zusammengehackt, dass ich benutze, um auf anderen Rechnern die Verfügbarkeit und die Geschwindigkeit von OpenCL-fähigen Geräten zu ermitteln. Bitte mal testen und ggf Fehlermeldungen posten. Zur Geschwindigkeitsermittlung habe ich einen Ausschnitt der Mandelbrotmenge in entsprechende Auflösung gewählt, um Speichertransfer und Geschwindigkeit bei den Berechnungen wenigstens ansatzweise bewerten zu können.
    autoit.de/wcf/attachment/16168/
    Laptop AMD mit Quadcore und integriertem Grafikprozessor, externer Grafikprozessor.
    //EDIT man sollte die 4 Cores nicht mit 400Mhz laufen lassen....

    Die folgenden Files sind teilweise angepasst/modifiziert/weiterentwickelt.
    Programm:
    autoit.de/wcf/attachment/16168/
    Include-files:
    autoit.de/wcf/attachment/16169/
    autoit.de/wcf/attachment/16170/