1. Dashboard
  2. Mitglieder
    1. Letzte Aktivitäten
    2. Benutzer online
    3. Team
    4. Mitgliedersuche
  3. Forenregeln
  4. Forum
    1. Unerledigte Themen
  • Anmelden
  • Registrieren
  • Suche
Alles
  • Alles
  • Artikel
  • Seiten
  • Forum
  • Erweiterte Suche
  1. AutoIt.de - Das deutschsprachige Forum.
  2. Mitglieder
  3. Andy

Beiträge von Andy

  • Kommunikation Skripte untereinander

    • Andy
    • 3. November 2014 um 21:05
    Zitat von Make-Grafik

    Desweiteren fügst du in Zeile 34 ein Chr(0) an's Stringende

    Was man sich sparen kann, wenn man die char-Struct um einen weiteren Char ergänzt. Dieser hat dann immer den Wert 0

  • Kommunikation Skripte untereinander

    • Andy
    • 3. November 2014 um 18:02

    Schöne Funktion!
    die solltest du dahingehend erweitern, JEDEN Datentyp (String, (U)INT, FLOAT usw.) in die Struct zu bringen, damit man auch mal richtig rocken kann^^

  • Kommunikation Skripte untereinander

    • Andy
    • 3. November 2014 um 17:28

    Ok, ein Array aus Strings.
    Um die Stringlänge völlig ausser Acht zu lassen, lege ich diese einfach mal auf 20 fest.
    Das Array besteht aus 4 Spalten und 3 Zeilen, also 12 Elementen

    Spoiler anzeigen
    [autoit]


    Local $avArray[][] = [['Accont', 'Ticket ID', 'VorName', 'Nachname'],['123', '456', 'Max', 'Meier'],['789', '1011', 'Meier', 'Max']]

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

    $zeilen = UBound($avArray, 1) ;zeilen
    $spalten = UBound($avArray, 2) ;spalten

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

    $struct = DllStructCreate("char[" & 20 * $zeilen * $spalten & "]") ;komplette struct
    $struct_ptr = DllStructGetPtr($struct) ;pointer

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

    For $zeile = 1 To $zeilen ;struct füllen
    For $spalte = 1 To $spalten
    $pos = $struct_ptr + (20 * ($zeile - 1) * $spalten) + ($spalte - 1) * 20 ;Position innerhalb der struct
    $s = DllStructCreate("char[20]", $pos) ;Hilfsstruct
    DllStructSetData($s, 1, $avArray[$zeile - 1][$spalte - 1]) ;Einzelne Werte schreiben, Array ist nullbasiert
    Next
    Next

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

    ;um die komplette Struct "sichtbar" zu machen, werden alle Nullbytes durch chr(46) ersetzt, ist natürlich nicht nötig und sollte auskommentiert werden
    For $i = 1 To $zeilen * $spalten * 20
    If Asc(DllStructGetData($struct, 1, $i)) = 0 Then DllStructSetData($struct, 1, Chr(46), $i);nullbytes durch . ersetzen
    Next
    $a = DllStructGetData($struct, 1) ;gesamte struct auslesen
    ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $a = ' & $a & @CRLF & '>Error code: ' & @error & @CRLF) ;### Debug Console

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

    ;arrayelement [2][1] = "1011" aus Struct auslesen, sollte man in eine Funktion packen^^
    $zeile = 2
    $spalte = 1
    $pos = $struct_ptr + (20 * ($zeile - 1) * $spalten) + ($spalte - 1) * 20
    $s = DllStructCreate("char[20]", $pos)
    $a = DllStructGetData($s, 1)
    ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $a = ' & $a & @CRLF & '>Error code: ' & @error & @CRLF) ;### Debug Console

    [/autoit]
    Zitat von Make-Grafik

    Schwieriger wird es sobald du nach Möglichkeit Platzsparend programmieren möchtest. Dann muss da was anderes her.


    Naja, da nimmt man eine verkettete Liste, bzw. eine einfache Liste die aus stringlen1,string1, stringlen2, string2, stringlen3, string3 ....besteht.
    Um dann den Pointer des 5. Strings innerhalb der Struct zu finden, hangelt man sich von Stringlen zu Stringlen, bis der 5. String erreicht ist.
    Oder man schreibt einfach alle Strings hintereinander und notiert sich in einer weiteren Struct (oder Array :) ) die Startpointer.
    Entspricht in etwa einer LUT (lookuptable)

  • Wettbewerb (für Anfänger und Fortgeschrittene) ?

    • Andy
    • 3. November 2014 um 15:17

    Nur mal interessehalber, wie löst ihr das Problem von "guten" (lösbar in 25 Zügen) und "bösen" (lösbar in >40 Zügen) Rätseln innerhalb von einem Set (ich löse 16x16 Rätsel)?

    Ich habe 3 (einfache) Algorithmen am Start, und vergleiche diese mit je 100 Rätseln. Mal gewinnt der eine, mal der andere!
    @Mars, man sollte zuerst alle Rätsel zufällig erstellen, und danach alle Algorithmen auf jeweils das gleiche Rätsel loslassen.

  • Kommunikation Skripte untereinander

    • Andy
    • 3. November 2014 um 14:25

    Ich bin mir nicht genau sicher, was du meinst.
    Deine "Tabelle" ist unzweifelhaft ein 2D-Array!
    Oder soll das die Entsprechung von _ArrayDisplay() sein?
    Bei der Struct ist es völlig unerheblich, in welcher Reihenfolge die Daten angeordnet sind, hauptsache DU weisst es^^. Da gibt es weder Reihen noch Spalten!

    Zitat von rynow

    Weil aktuell kann ich zwar beliebig viele Spalten erstellen aber nur eine Zeile? Oder muss ich tatsächlich für jede Zeile ein neues struct erstellen?

    Das verstehe ich nicht.
    Zeig doch dein Array mal. Und deine Entsprechung in einer Struct.

  • Kommunikation Skripte untereinander

    • Andy
    • 3. November 2014 um 13:23

    Weil du nur das eine Byte im Char-Array abfragst!
    Um den gesamten String zurückzugeben, darfst du den index nicht verwenden.

    [autoit]

    $struct=dllstructcreate("char[100]")
    dllstructsetdata($struct,1,"Hallo AutoIt")
    $string =dllstructgetdata($struct,1)
    ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $string = ' & $string & @crlf & '>Error code: ' & @error & @crlf) ;### Debug Console
    $buchstabe=dllstructgetdata($struct,1,1)
    ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $buchstabe = ' & $buchstabe & @crlf & '>Error code: ' & @error & @crlf) ;### Debug Console

    [/autoit]
  • GUICtrlCreateListViewItem ist zu langsam? -> Problem gelöst, aber Warum ist das so?

    • Andy
    • 3. November 2014 um 12:44
    Zitat von habenureinproblem

    Ach...für mich alles ein Rätsel.

    Willkommen in der Welt der Programmierung! :rock:

    Zitat von habenureinproblem

    Will man bei bestimmten Aktionen, wie von Andy vorgeschlagen, alles verstecken? Sieht sicher komisch aus, schon nur ein GUICtrlCreateGroup zu verstecken bei Befüllen von einem Listview wirkt eigenartig (aber um 4 Sekunden zu sparen bzw im oberen Beispiel 14 Sekunden wäre es es sicher wert).


    Wen interessiert, was "merkwürdig" aussieht, wenn man dadurch massiv Zeit spart?!

    Mich würde in diesem Zusammenhang auch interessieren, wieviel Zeit und somit auch Geld die berühmte "Sanduhr" täglich kostet. Ich schätze mal niedrig einige Milliarden Euros. Windows-Nutzer haben die Sanduhr aber inzwischen dermaßen verinnerlicht, da fällt schon auf, wenn man sie einige Minuten NICHT sieht!

  • Kommunikation Skripte untereinander

    • Andy
    • 3. November 2014 um 12:32
    Zitat von rynow

    Andy hast du evtl. ein Beispiel wie ich ein SOA erstelle?

    Ein einfaches Beispiel ist eine Bitmap.
    Jedes einzelne Pixel besteht aus den 4 Kanälen (Bytes) Alpha, Rot,Grün, Blau, also ARGB als DWORD (4 mal 8 Bit)
    Im Speicher stehen die Pixel byteweise nacheinander ARGBARGBARGBARGBARGB... bezeichnet als ein Array of Structures.
    Möchte man nun bspw. 64 rote Farbanteile (64 Bytes passen genau in eine Cacheline) aus dem Speicher lesen und verarbeiten, müssen nun 4x64 Bytes, also 4 Lines im Prozessorcache, gefüllt werden! Drei viertel der Daten im Prozessorcache wären also unnötiger Müll (Cache pollution)!

    Um jetzt die einzelnen Farbkanäle anzusprechen also beispielsweise nur die roten Farbbestandteile, könnte man alle diese Bytes nacheinander in den Speicher schreiben, also als
    AAAAAAAAAA...RRRRRRRRRRRRRRRR...GGGGGGGGGGGGGG...BBBBBBBBBBBBB....Structure of Arrays
    Würde man jetzt 64 rote Farbanteile lesen bzw. bearbeiten wollen, würde der Prozessor mit einem Lesebefehl nur EINE Cacheline füllen müssen!

    Gerade bei der Verarbeitung mit den SSE-Befehlen, also SIMD (Single Instruction Multiple Data), sollte man also tunlichst die Daten entsprechend vorbereiten, damit diese Prozessorbefehle überhaupt ihre Geschwindigkeit ausspielen können!
    Mittlerweile "optimiert" bspw. der INTEL-Compiler schon den C(++)-Code VOR dem Compilieren, um dem Prozessor die "richtige" Reihenfolge der Daten im Speicher zur Verfügung zu stellen. U.a. dadurch wird der Geschwindigkeitsunterschied der compilierten Programme zu anderen Compilern erreicht. 8o
    Btw. kann man über die Shuffle-Befehle die Daten umorganisieren, aber wenn man sich diese "teuren" Befehle sparen kann, um so besser. Eukalyptus hat dazu ein schönes Script geschrieben!

    Wie man schon erahnen kann, hilft einem das o.g. in einem AutoIt-Script geschwindigkeitsmäßig nicht sonderlich viel, dazu ist der Overhead des Interpreters viel zu groß.
    Allerdings schadet es auch nicht. Sollte man bspw. für eine schnelle Berechnung eine Dll, bspw. per C(++) oder Freebasic oder einem beliebigen anderen Compiler erstellen wollen und diese dann mit AutoIt verwenden, wird sich mit Sicherheit die "richtige" Organisation der Daten im Speicher bemerkbar machen!

  • GUICtrlCreateListViewItem ist zu langsam? -> Problem gelöst, aber Warum ist das so?

    • Andy
    • 2. November 2014 um 21:59

    Hi,
    altbekanntes "Problem", denn lt. Windowsparadigma hat sich jedes Programm selbst um seine Fenster(-inhalte) zu kümmern!
    Da wird dann bspw. "nur um ein Item einer Listview hinzuzufügen" eine unglaubliche Menge Messages abgefeuert, und so gut wie sämtliche Funktionen, welche das BS zur Verfügung stellt, abgeklappert. Und natürlich wird bei jedem deiner 4000 Items nachgeschaut, ob dieses jetzt gerade nicht zufällig doch dargestellt werden soll....

    Abhilfe schafft, die Darstellung bei bestimmten Operationen einfach abzuschalten. Damit wird verhindert, dass der gesamte Rattenschwanz an Funktionen zur Fensterdarstellung (da reicht eine Mausbewegung im Fenster! ) ausgeführt wird.
    Windows ist idR so clever, bei bspw. einem WinSetState() (in anderen Programmiersprachen heisst die Bildschirmaktualisierung anders) nur den zzt. im Fenster sichtbaren Bereich upzudaten. Das geht auch Ruckzuck!
    In VBA wird per ScreenUpdating = False bei so manchem Script der Turbo eingeschaltet. Faktor 10 und schneller sind da keine Seltenheit!
    Würde mich wundern, wenn man in AutoIt so nicht auch zum Erfolg kommen könnte....

  • alle Möglichkeiten der Zeichenreihenfolge eines Strings

    • Andy
    • 2. November 2014 um 10:54

    Interessant ist, welche Wörterbücher verwendet werden. Ich habe im jugendlichen Leichtsinn gedacht, in der deutschen Wikipedia würden so gut wie alle Wörter verwendet werden, aber das war ein Irrtum.
    Mittlerweile habe ich einen ganzen Pool von Wörterbüchern, in Englisch ist das Ganze noch viel schlimmer, da gibt es Wörterbücher nur mit Eigennamen, Ortschaften, Straßennamen uswusf. allein die Suche danach ist eine Sysiphosarbeit!
    Wer übrigens denkt, "Na dann mach doch aus den ganzen Wörterbüchern ein großes bzw. füttere damit eine Datenbank", der sollte sich mit dem Thema mal intensiv beschäftigen, VIEL Geld und vor allem Zeit und einen Haufen Mitarbeiter zur Verfügung haben und dann gegen rennomierte Institute in den Ring steigen :thumbup:

  • Taste, die durch Variable bestimmt wird, X mal ausgeben

    • Andy
    • 1. November 2014 um 19:08

    Hi,
    schau dir mal an, wie man Scripte debugged! Und dabei würde helfen, wenn du dir bei dieser Gelegenheit in der Hilfe (gibts auch auf Deutsch! ) den Abschnitt über die Datentypen zu Gemüte führst.

    In deinem Beispiel mit der $variable schreibst du nicht den WERT 50 der Variablen in den String, sondern den Text "$variable1"
    Um Strings und Werte miteinander zu verbinden, benutzt man in AutoIt das & - Zeichen

    [autoit]

    ,"{" & $variable1 & " 50}"

    [/autoit]
  • OpenCl goes AutoIt Update 31.Dezember 2016

    • Andy
    • 1. November 2014 um 18:05

    Hi,

    Zitat von Techmix

    Testläufe: "GPU" = 780Fps (richtiges Bild), "MULTI" = 580Fps (Doppelbildausschnitt)

    yepp, hängt daran, dass du 2x den Puffer von der Graka ins RAM transferierst, was, wie schon oben beschrieben, wesentlich länger dauert als die eigentliche Berechnung!
    Die oberen Halbbilder siehst du deshalb, weil du diese jeweils auch genau so darstellst. Lt. deinem Script ist das auch so gewünscht :P

    Zitat von Techmix

    Fehlt noch völlig... Man könnte den zweiten Parameter so abfragen, wenn ein Array übergeben ist wird der Kernel auf alle Devices verteilt und wenn ein $command_queue angegeben ist, soll der Kernel eben nur auf den einem Device ausgeführt werden. ...Diese globale Variable $KernelSource ist völlig überflüssig und verwirrt den Techmix nu


    Den Kernel auf alle Devices zu verteilen macht imho ja nur dann Sinn, wenn diese Devices auch verwendet werden sollen. Wir könnten das nun natürlich als "Standard" implementieren, also einfach erstmal per se den Kernel auf ALLE verfügbaren Devices verteilen (wird ja aber schon gemacht, über die einzelnen Command-Queues)

    So wie es aussieht, funktioniert ja bei dir schonmal die Darstellung so, wie ich mir das vorgestellt hatte. :thumbup:

    Zitat

    ; Ich komme einfach nicht darauf WIE ich den Kernel sagen kann, das er bei 'stop' aufhören soll.. (if (threadid = stop+1) {break}) ?!?
    ; Momentan wird dieser trotzdem durchlaufen aber alle Berechnungen und die Rückgabe werden ausgelassen

    Naja, ich denke, es gibt noch Erklärungsbedarf....
    Du musst, ausser bei speziellen Aufgaben (wenn Ergebnisse synchronisiert werden müssen), den Kernel überhaupt nicht bearbeiten!
    Durch die Kernelparameter legst du fest, welche "Teilbereiche" des Bildes berechnet werden.
    Beispiel Apfelmännchen/Mandelbrotmenge.
    Welchen "Bildausschnitt" du angezeigt bekommst, bestimmen AUSSCHLIESSLICH die Kernelparameter. Der Kernel (Rechenvorschrift) berechnet immer nur EIN EINZIGES Pixel (ThreadID)!
    OpenCL verteilt nun diese eine Rechenvorschrift auf alle verfügbaren Recheneinheiten.
    Ich schreib mal ein Beispiel

    Spoiler anzeigen
    [autoit]

    ;~ #include <opencl_easy.au3>
    #include <opencl_easy_all.au3>
    #include <GUIConstantsEx.au3>
    #include <WinAPI.au3>
    #include <GDIConstants.au3>
    #include <Misc.au3>

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

    Opt("GUIOnEventMode", 1)
    Opt("MouseCoordMode", 2)

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

    Global _
    $dll = DllOpen("user32.dll"), _
    $mouseflag = 1, _
    $fps = 0, _
    $NULL = 0, _
    $titeltext = "Apfelmännchen linke Maustaste reinzoomen / rechte Maustaste rauszoomen ", _
    $width, _ ; breite und höhe der gui/grafik, die Anzahl der "Threads" sollte ein Vielfaches von 16 sein!
    $height, _
    $hgui, _ ; GUI erstellen
    $hdc_gui, _ ; HDC holen zum blitten
    $DATA_SIZE, _ ; bildgröße=anzahl pixel (rgba)
    $hDC_bitmap, _
    $ptr_bitmap, _
    $hbmp_bitmap

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

    Global _
    $output_buffer, _ ; halleluja! bitmaps werden immer 16byte-aligned!
    $CL_buffer_out, _
    $maxiteration, _ ; maximale iterationen
    $centerx, _ ; mitte Bild in x-richtung
    $centery, _ ; mitte bild in y-richtung
    $apfelbreite, _ ; breite des Bildinhalts x-richtung
    $CL_DEBUGFLAG

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

    ;ich bin nicht der C-Freak, bitte also um Nachsicht mit meinen Kernels, Verbesserungsvorschläge werden selbstverständlich umgesetzt^^
    ;wer mag, kann den Kernel auch gerne als SIMD-Variante machen, das beschleunigt die Berechnung auf der CPU enorm!
    ;mit den farbfunktionen kann man endlos spielen^^
    Global _
    $KernelSource = _
    "__kernel void tunnelflug( __global int* output, const unsigned int width,const unsigned int height,const float centerx,const float centery,const uint maxiter,const float apfelbreite){" & @CRLF & _
    " uint iter;" & @CRLF & _ ;lokale variablen
    " float xtemp;" & @CRLF & _
    " uint threadid = get_global_id(0);" & @CRLF & _ ;thread-id, d.h. jedes pixel von 1 bis b*h
    " float py = threadid/height;" & @CRLF & _ ;pixelkoordinaten
    " float px = threadid%width;" & @CRLF & _ ;pixelkoordinaten
    " float x0 = (centerx-apfelbreite*0.5f)+px*apfelbreite/width;" & @CRLF & _ ;...Berechnungen
    " float y0 = (centery-apfelbreite*0.5f)+py*apfelbreite/height;" & @CRLF & _ ;...Berechnungen
    " float x = x0;" & @CRLF & _
    " float y = y0;" & @CRLF & _
    " for (iter=0;iter<maxiter;iter++){" & @CRLF & _ ;...Berechnungen
    " xtemp = x*x -y*y + x0;" & @CRLF & _
    " y = 2 * x * y + y0;" & @CRLF & _
    " x = xtemp;" & @CRLF & _
    " if ((x * x + y * y) > 4) break;" & @CRLF & _
    " }" & @CRLF & _
    " output[threadid] = 0x0008002* native_log2(native_log2((float) iter+1));" & @CRLF & _ ;Pixel schreiben 0xFFBBGGRR, BB=GG=RR=t native_powr(iter,2)
    "}"

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

    ; ----------------------------------------------------------------------------------------------------------------------------------
    ; StartUP
    ; ----------------------------------------------------------------------------------------------------------------------------------

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

    Dim _
    $width = 256 * 3, _ ;breite und höhe der gui/grafik, die Anzahl der "Threads" sollte ein Vielfaches von 16 sein!
    $height = 256 * 3, _
    $hgui = GUICreate($titeltext, $width, $height, 1, 1), _ ;GUI erstellen
    $hdc_gui = _WinAPI_GetDC($hgui), _ ;HDC holen zum blitten
    $DATA_SIZE = $width * $height ;bildgröße=anzahl pixel (rgba)

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

    GUISetState()
    GUISetOnEvent($GUI_EVENT_CLOSE, "_Exit")
    GUISetOnEvent($GUI_EVENT_PRIMARYDOWN, "_mousedown")
    GUISetOnEvent($GUI_EVENT_SECONDARYDOWN, "_mousedown")
    AdlibRegister("_fps", 1000) ;FramesPerSecond

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

    ;bitmap erzeugen, in $ptr_bitmap steht nach dem Funktionsaufruf der Pointer auf die Pixeldaten
    $hDC_bitmap = _CreateNewBmp32($width, $height, $ptr_bitmap, $hbmp_bitmap) ;DC, Pointer auf die Bitmapdaten und ein Handle für GDI+....eine eierlegende Wollmilchsau

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

    Dim $all = 1
    ;ab hier gehts mit OpenCl los
    ;Zunächst werden die verfügbaren Geräte(Devices) gesucht.
    ;~ _CL_GetDevice("CPU") ;.. ALL oder CPU oder GPU, ermittelt das Gerät, auf dem die Berechnungen durchgeführt werden.
    ;~ _CL_GetDevice("multi") ;.. ALL oder CPU oder GPU, ermittelt das Gerät, auf dem die Berechnungen durchgeführt werden.
    If $all = 1 Then
    _CL_GetALLDevice("multi") ;..oder CPU oder GPU, ermittelt das Gerät, auf dem die Berechnungen durchgeführt werden.
    Else
    _CL_GetDevice("gpu", 1,1) ;..oder CPU oder GPU, ermittelt das Gerät, auf dem die Berechnungen durchgeführt werden.
    EndIf
    ;zweiter Parameter gibt bei z.b. mehreren Grafikkarten die Nummer des Geräts an

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

    ;Puffer für die Bitmap
    Dim _
    $output_buffer = DllStructCreate("dword[" & $DATA_SIZE & "]", $ptr_bitmap), _
    $CL_buffer_out = _CL_CreateBuffer($output_buffer), _
    $maxiteration = 89, _ ; maximale iterationen
    $centerx = -.5, _ ; mitte Bild in x-richtung
    $centery = 0, _ ; mitte bild in y-richtung
    $apfelbreite = 3, _ ; breite des Bildinhalts x-richtung
    $CL_DEBUGFLAG = 0 ; Debug-Ausgabe ausschalten, um Geschwindigkeit zu erhöhen

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

    $output_buffer1 = DllStructCreate("dword[" & $DATA_SIZE / 2 & "]", $ptr_bitmap);halleluja! bitmaps werden immer 16byte-aligned!
    $CL_buffer_out1 = _CL_CreateBuffer($output_buffer1)

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

    $output_buffer2 = DllStructCreate("dword[" & $DATA_SIZE / 2 & "]", $ptr_bitmap + $DATA_SIZE * 2);halleluja! bitmaps werden immer 16byte-aligned!
    $CL_buffer_out2 = _CL_CreateBuffer($output_buffer2)

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

    $output_buffer = DllStructCreate("dword[" & $DATA_SIZE & "]", $ptr_bitmap);halleluja! bitmaps werden immer 16byte-aligned!
    $CL_buffer_out = _CL_CreateBuffer($output_buffer)

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

    ;Parameter an den Kernel übergeben
    _CL_SetArg(0, "ptr*", $CL_buffer_out)
    _CL_SetArg(1, "uint*", $width)
    _CL_SetArg(2, "uint*", $height)
    _CL_SetArg(3, "float*", $centerx)
    _CL_SetArg(4, "float*", $centery)
    _CL_SetArg(5, "uint*", $maxiteration)
    _CL_SetArg(6, "float*", $apfelbreite)

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

    ;Schleife zur Anzeige für den Flug
    While 1
    _steuerung()
    _CL_SetArg(3, "float*", $centerx)
    _CL_SetArg(5, "uint*", $maxiteration)
    _CL_SetArg(6, "float*", $apfelbreite)
    ;~ _CL_RunKernelAll($DATA_SIZE / 2, 0) ; Kernel ausführen
    If $all = 1 Then
    ;obere Hälfte Bild
    _CL_SetArg(4, "float*", $centery);Die Mitte des Bildes -> oberer Teil
    _CL_SetArg(0, "ptr*", $CL_buffer_out1)
    _CL_RunKernel_ALL($DATA_SIZE / 2, 0, $comm_queue[1][1]) ;Datasize /2 nur die Hälfte ALLER Pixel also nur OBERER Teil
    _CL_ReadBuffer_ALL($CL_buffer_out, $output_buffer, $comm_queue[1][1]);Puffer(alle oberen Pixel) lesen

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

    ;untere Hälfte Bild
    _CL_SetArg(4, "float*", $centery+$apfelbreite/2);unterer Teil des Bildes
    _CL_SetArg(0, "ptr*", $CL_buffer_out2)
    _CL_RunKernel_ALL($DATA_SIZE / 2, 0, $comm_queue[1][2]) ;Kernel ausführeneue[1] & @crlf & '>Error code: ' & @error & @crlf) ;### Debug Console
    _CL_ReadBuffer_ALL($CL_buffer_out, $output_buffer, $comm_queue[1][2]);Puffer(alle Pixel) lesen
    Else
    _CL_RunKernel($DATA_SIZE, 0) ; Kernel ausführen
    _CL_ReadBuffer($CL_buffer_out, $output_buffer) ; Puffer(alle Pixel) lesen
    EndIf
    _WinAPI_BitBlt($hdc_gui, 0, 0, $width, $height, $hDC_bitmap, 0, 0, $srccopy) ; Bitmap in die GUI blitten
    $fps += 1 ; Frames pro Sekunde zählen
    WEnd

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

    ;...das wars schon^^

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

    ; ----------------------------------------------------------------------------------------------------------------------------------
    ; Unterfunktionen
    ; ----------------------------------------------------------------------------------------------------------------------------------

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

    Func _CreateNewBmp32($iwidth, $iheight, ByRef $ptr, ByRef $hbmp) ;erstellt leere 32-bit-Bitmap; Rückgabe DC und ptr und handle auf die Bitmapdaten
    ;by Andy
    Local $hcdc = _WinAPI_CreateCompatibleDC(0) ;Desktop-Kompatiblen DeviceContext erstellen lassen
    Local $tBMI = DllStructCreate($tagBITMAPINFO) ;Struktur der Bitmapinfo erstellen und Daten eintragen
    DllStructSetData($tBMI, 1, DllStructGetSize($tBMI) - 4) ;Structgröße abzüglich der Daten für die Palette
    DllStructSetData($tBMI, 2, $iwidth)
    DllStructSetData($tBMI, 3, -$iheight) ;minus =standard = bottomup
    DllStructSetData($tBMI, 4, 1)
    DllStructSetData($tBMI, 5, 32) ;32 Bit = 4 Bytes => AABBGGRR
    Local $adib = DllCall('gdi32.dll', 'ptr', 'CreateDIBSection', 'hwnd', 0, 'ptr', DllStructGetPtr($tBMI), 'uint', $DIB_RGB_COLORS, 'ptr*', 0, 'ptr', 0, 'uint', 0)
    $hbmp = $adib[0] ;hbitmap handle auf die Bitmap, auch per GDI+ zu verwenden
    $ptr = $adib[4] ;pointer auf den Anfang der Bitmapdaten, vom Assembler verwendet
    _WinAPI_SelectObject($hcdc, $hbmp) ;objekt hbitmap in DC
    Return $hcdc ;DC der Bitmap zurückgeben
    EndFunc ;==>_CreateNewBmp32

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

    Func _fps()
    WinSetTitle($hgui, "", $titeltext & $fps & " FPS")
    $fps = 0
    EndFunc

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

    Func _mousedown()
    $mouseflag = 1
    EndFunc

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

    Func _steuerung()
    If WinActive("Apfelmännchen") Then
    If _IsPressed("01", $dll) Then _leftmouse()
    If _IsPressed("02", $dll) Then _rightmouse()
    EndIf
    EndFunc

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

    Func _leftmouse() ;zoom in
    If $mouseflag Then ;neues center
    $posx = MouseGetPos(0)
    $posy = MouseGetPos(1)
    $centerx = ($centerx - $apfelbreite / 2) + $posx * $apfelbreite / $width
    ;~ ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $centerx = ' & $centerx & @CRLF & '>Error code: ' & @error & @CRLF) ;### Debug Console
    $centery = ($centery - $apfelbreite / 2) + $posy * $apfelbreite / $height
    ;~ ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $centery = ' & $centery & @CRLF & '>Error code: ' & @error & @CRLF) ;### Debug Console
    $mouseflag = 0
    EndIf
    $maxiteration /= 0.99785 ;Iterationen erhöhen
    ;~ ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $maxiteration = ' & $maxiteration & @CRLF & '>Error code: ' & @error & @CRLF) ;### Debug Console
    $apfelbreite *= 0.985
    ;~ ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $apfelbreite = ' & $apfelbreite & @CRLF & '>Error code: ' & @error & @CRLF) ;### Debug Console
    EndFunc

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

    Func _rightmouse() ;zoom out
    If $mouseflag Then ;neues center
    $posx = MouseGetPos(0)
    $posy = MouseGetPos(1)
    $centerx = ($centerx - $apfelbreite / 2) + $posx * $apfelbreite / $width
    $centery = ($centery - $apfelbreite / 2) + $posy * $apfelbreite / $height
    $mouseflag = 0
    EndIf
    $maxiteration *= 0.99785 ;Iterationen erhöhen
    $apfelbreite /= 0.985
    EndFunc

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

    Func _Exit()
    Exit
    EndFunc ;==>_Exit

    [/autoit]
    Zitat von Techmix

    Kernelintern wird ja width*height berechnet, entspricht also $DATA_SIZE, die Rückgabe des Kernel soll ja nur $DATA_SIZE/2 groß sein - entsprechend müssen die Buffer also auch nur die Größe von $DATA_SIZE/2 haben. Richtig?


    Jein (eigentlich ein klares NEIN 8) )
    Kernelintern wird EIN Pixel berechnet! Anhand der get_global_id(0). Sonst NIX! Punkt!
    WELCHES Pixel berechnet wird, entscheidet ausschliesslich OpenCl. Ansonsten würde niemand ( niemand!!!! ) eine parallelle Berechnung brauchen!
    Ich habe schon OCL-Kernel von gestandenen Programmierern gesehen, die sich darüber ausgelassen haben, dass der Kernel so unglaublich langsam seien. Das lag genau an deinem Problem! Die sind einfach hingegangen und haben den Kernel so geschrieben, dass ALLE Workitems (von ca. 1000 verfügbaren) ALLE Berechnungen für den gesamten Speicherbereich durchgeführt hatten. Das wäre so, als ob jedes einzelne Workitem ALLE Pixel des Apfelmännchens berechnen würde. Und das 1000 mal...umgangssprachlich nennt sich so etwas SCHWACHSINN! Die würden niemals auf die Idee kommen, 1000 Threads anzuwerfen, um in jedem Thread die KOMPLETTE Berechnung durchzuführen. Dieses "Problem" durchzieht die Foren wie ein roter Faden!

    Aber dass jeder einzelne Puffer bei Verwendung von 2 Geräten jeweils nur halb so groß sein muss, hast du ja richtigerweise festgestellt! Wenn man 2x die Hälfte berechnet, kommt immer noch ein Ganzes raus :thumbup:

    Bzgl. deiner Frage zu den Threads, da mache ich mir keinen Kopp! Ob das nun "Parallelisierung" heisst, oder "Threading", ist mir persönlich schnurz. Wichtig ist, dass man begriffen hat, WIE muss mein Kernel aussehen, damit ich das Problem in möglichst VIELE Einzelteile zerlegen kann, welche ALLE gleichzeitig(!) berechnet werden!
    Beispiel: Einzelne Buchstaben in einem String zählen
    Schreib doch mal einen Kernel, der sämtliche "a"´s (oder ggf. nur die Vokale) in einem Text zählt....

  • Wettbewerb (für Anfänger und Fortgeschrittene) ?

    • Andy
    • 31. Oktober 2014 um 22:32

    Da die solve-Funktion sowieso in eine eigene Datei ausgelagert sein soll, ist es imho egal, ob dort noch weitere Funktionen mit drinstehen!

  • Kommunikation Skripte untereinander

    • Andy
    • 31. Oktober 2014 um 22:23

    So schön wie MakeGrafik das erklärt hat, macht das übrigens auch jeder Compiler.
    Ins Eingemachte geht es dann, wenn man sich Gedanken über Array of Structs (AoS) oder einer Struct of Arrays (SoA) macht. Mit dem, was MakeGrafik erklärt hat, wird hoffentlich klar, dass es bei Speicherzugriffen eben NICHT völlig unerheblich ist, ob die Daten direkt hintereinander im Speicher liegen (und somit über den Prozessorcache x-mal schneller gelesen werden können) oder über den "falschen" Index angesprochen, völlig verteilt im Speicher liegen (Cachemisses/Cachepollution bei jedem Zugriff)
    Bei diversen Programmen, welche intensiv mit gespeicherten Daten arbeiten (Datenbanken) wurde schon Faktor 2.5 bis 3 an Beschleunigung erreicht, NUR weil von AoS auf SOA umgestellt wurde, also aus einem Array[x][y] ein Array[y][x] gemacht wurde!

  • Kommunikation Skripte untereinander

    • Andy
    • 31. Oktober 2014 um 21:43
    Zitat von rynow

    ???? Wie kann ich eine Array in ein struct setzen?


    Du musst nur definieren, was dein Array als Inhalt hat!

    [autoit]

    Dim $a[11] ;nullbasiert
    $struct = DllStructCreate("int[10]") ;einsbasiert

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

    For $i = 1 To 10
    $wert = Random(1, 100000, 1) ;irgendeinen wert
    $a[$i] = $wert ;wert in array
    DllStructSetData($struct, 1, $wert, $i) ;wert in struct
    Next

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

    For $i = 1 To 10 ;auslesen
    ConsoleWrite("Array = " & $a[$i] & @CRLF);array
    ConsoleWrite("Struct = " & DllStructGetData($struct, 1, $i) & @CRLF)
    ConsoleWrite("Struct = " & _a($i) & @CRLF & @CRLF)
    Next

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

    Func _a($inhalt) ;dllstructgetdata in "kurz" ^^
    Return DllStructGetData($struct, 1, $inhalt)
    EndFunc ;==>_a

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

    Im AutoIt-Array hast du den unschlagbaren Vorteil, verschiedene Datentypen mischen zu können, ohne dich um die ....Datentypen kümmern zu müssen, "variant" sei Dank!
    Allerdings muss man beim Zuweisen bzw. Auslesen sowieso die "richtigen" Datentypen haben, also kann man sie auch direkt in bspw. einer Struct definieren.
    Übrigens ist die "Arrayschreibweise" nichts anderes als ein einfacheres Abbild der Datenstruktur (sic) im Speicher! Intern liegen die Daten sowieso in einem Speicherbereich, ob man den nun Struct, Liste, verkettete Liste oder was auch immer nennt, ist unerheblich.

    /EDIT
    Um das mal deutlicher zu machen, bis auf die blutigsten Anfänger würde es niemandem einfallen, beispielsweise die Pixel in einem Bild in ein Array einzulesen, dann zu bearbeiten und dieses Array dann wieder in Pixel zu übertragen.
    Eine Bitmap IST bereits ein Array, genau wie die Daten in einem WMV-Musikstück, der Text in einem *.au3-Script uswusf

  • Kommunikation Skripte untereinander

    • Andy
    • 31. Oktober 2014 um 19:45

    Es ist völlig egal, in welcher Form die Daten übergeben werden, Hauptsache ist, es werden genügend Bytes reserviert :D
    Und ob man ein 3D oder nD-Array übergibt ist auch unerheblich, bis es 3D-Speicher gibt, dauert es noch etwas. (ok, ne tesafilmrolle wird ja schon als 3d-Speicher beworben)
    Speicher ist grundsätzlich linear angeordnet, also ist das bei Arrays genauso!
    Übrigens kann man sich, wenn man denn weiss was man tut, komplett auf Arrays verzichten! Mit DllStructs sind idR. in höherer Geschwindigkeit identische Funktionen wie bei Verwendung von Arrays machbar.
    Die Umwandlung wie bei rynow kann man sich also sparen^^

  • Wettbewerb (für Anfänger und Fortgeschrittene) ?

    • Andy
    • 31. Oktober 2014 um 09:12
    Zitat von General Kaboom

    Warum nicht einfach WIRKLICH ein Sudoku-Löser..


    Weil wir das schon hatten? µIt-März 2009
    Übrigens eines meiner Lieblingsbeispiele für ASM-Programme. Ein Sudoku-Löser incl Ein- und Ausgabe in 62 (zweiundsechzig) Bytes!

  • Wettbewerb (für Anfänger und Fortgeschrittene) ?

    • Andy
    • 30. Oktober 2014 um 19:17

    Habe schon einige Runden "von Hand" gespielt, und natürlich schon angefangen zu "botten" 8o

    Genau wie beim Sudoku-Löser bei dem es "gute" und "böse" Sudokus gibt, ist das hier natürlich auch so!
    Daher würde ich, damit alle Teilnehmer wirklich gleiche Voraussetzungen haben, auch jedem Teilnehmer eine bestimmte Anzahl Rätsel vorgeben, die der Lösungsalgorithmus dann knacken muss. Ich denke, 30 bis 50 sollten reichen.

    @Mars,
    beim "von Hand" spielen habe ich festgestellt, dass ab und zu zusammenhängende Farben nicht vollständig "eingegraut" werden. Bspw. wurden in einem Fall ein "Winkel" von 3 waagrechten und drei senkrechten, also 5 zusammenhängenden Flächen nicht vollständig grau. Die 3 Waagrechten wurden grau, die beiden Senkrechten blieben farbig. Seltsamerweise wurde beim nächsten Zug mit dieser Farbe wieder nicht beide, sondern auch nur ein Feld eingegraut.
    Das ist mir öfter mit verschiedenen zusammenhängenden Feldern aufgefallen. Absicht ist das nicht, oder?

    //EDIT
    Bin zzt. bei einem 16x16 Feld bei einem Schnitt von 33 Zügen, fast so gut wie "von Hand" (nur minimal besser)
    Aber die "Streuung" ist viel zu hoch, Züge von 28/29 wechseln sich mit >40 ab. Übrigens ist das bei "von Hand" ebenso!

  • Kommunikation Skripte untereinander

    • Andy
    • 30. Oktober 2014 um 18:23

    Anhand der Pointer kannst du natürlich auch verschiedene Structs an EINER Speicherposition erstellen und somit bestimmte (Teil-) Daten schreiben oder lesen.

    HIER ein Beispiel, wie man so etwas gebrauchen kann, der gesamte Thread ist übrigens lesenswert.

  • Kommunikation Skripte untereinander

    • Andy
    • 30. Oktober 2014 um 14:21

    Hi,

    eine Struct ist doch nichts weiter als ein Array?!
    Darin kannst du natürlich jedes Element einzeln ansprechen.

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

    $struct = DllStructCreate("BYTE[8]")

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

    for $i=1 to 8
    dllstructsetdata($struct,1,$i*10,$i)
    next

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

    $ANTWORT_BYTE1 = DllStructGetData($struct, 1,1)
    ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $ANTWORT_BYTE1 = ' & $ANTWORT_BYTE1 & @crlf & '>Error code: ' & @error & @crlf) ;### Debug Console
    $ANTWORT_BYTE2 = DllStructGetData($struct, 1,2)
    ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $ANTWORT_BYTE2 = ' & $ANTWORT_BYTE2 & @crlf & '>Error code: ' & @error & @crlf) ;### Debug Console
    $ANTWORT_BYTE3 = DllStructGetData($struct, 1,3)
    ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $ANTWORT_BYTE3 = ' & $ANTWORT_BYTE3 & @crlf & '>Error code: ' & @error & @crlf) ;### Debug Console
    $ANTWORT_BYTE4 = DllStructGetData($struct, 1,4)
    ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $ANTWORT_BYTE4 = ' & $ANTWORT_BYTE4 & @crlf & '>Error code: ' & @error & @crlf) ;### Debug Console

    [/autoit]

    Das was du suchst, ist der "Index" (s. Hilfe zu DllStructGetData() )

Spenden

Jeder Euro hilft uns, Euch zu helfen.

Download

AutoIt Tutorial
AutoIt Buch
Onlinehilfe
AutoIt Entwickler
  1. Datenschutzerklärung
  2. Impressum
  3. Shoutbox-Archiv
Community-Software: WoltLab Suite™