OpenCL



  • blurry333 schrieb:

    Trotzdem will ich wissen warum das Schlüsselwort __kernel nicht erkannt wird. Die cl.h ist eingebunden !

    Artikuliere dich doch ordentlich. Er? Wer ist ER? Von wem wird __kernel nicht erkannt? Versuchst du OpenCL Source in gcc zu kompilieren? Oder ist "ER" die OpenCL API und eine Funktion versteht dein Source nicht?

    Und schau dir endlich die Grundlagen an, ein Tutorial zu laden und durchzuarbeiten reicht, damit sich hier niemand mehr fremdschämen muss.



  • int arr1[10];
    int arr2[10];
    int arrErgebnis[10];
    
    for(int i = 0;i<10;i++)
    {
    
    arrErgebnis[i]=arr1[i]+arr2[i];
    
    }
    

    Warum ist dieser einfache serielle Code, als paralleler Code in OpenCL mehr als 3 Seiten lang und hat mehrere Dateien ?



  • int arr1[10];
    int arr2[10];
    int arrErgebnis[10];
    
    int i = get_local_id(0);
    arrErgebnis[i]=arr1[i]+arr2[i];
    

    Du hast anscheinend aus Versehen den C code reingestellt, ich habe mir erlaubt es in OpenCL zu schreiben.

    Warum ist dieser einfache serielle Code, als paralleler Code in OpenCL mehr als 3 Seiten lang und hat mehrere Dateien ?

    Hyperaktiver- oder dokugeiler-Programmierer.



  • Die main function ist mehr als 300 Zeilen lang und dann noch die cl Datei mit dem Kernel



  • Und?



  • Ist OpenCl also schlecht designed ? Wenn ich seriell 8 Zeilen brauche aber für OpenCL 300 Zeilen, frag ich mich schon ob da nicht was überflüssig ist.



  • blurry333 schrieb:

    Ist OpenCl also schlecht designed ? Wenn ich seriell 8 Zeilen brauche aber für OpenCL 300 Zeilen, frag ich mich schon ob da nicht was überflüssig ist.

    Definitiv. Ich würde, wenn ich du wäre, die Finger von Computern lassen. Da ist doch eh alles der selbe schwachfug...



  • OpenCL ist eine API mit der man mit der Grafikkarte kommuniziert. Schonmal mit einem externen Geraet kommuniziert? Mal 'nen Mikrkontroller programmiert? Schon mal selbst Dateien gelinkt? Und jetzt misst du OpenCL anhand des Codeumfangs von deinem Spielzeugbeispiel?

    Warum gleich zu OPenCL greifen? Mache doch dein Spielzeugbeispiel mal Multithreaded!



  • blurry333 schrieb:

    Ist OpenCl also schlecht designed ? Wenn ich seriell 8 Zeilen brauche aber für OpenCL 300 Zeilen, frag ich mich schon ob da nicht was überflüssig ist.

    Dir ist klar dass du dich da grad drüber beschwerst, dass Verkehrsflugzeuge komplizierter sind als Rolltreppen!?



  • blurry333 schrieb:

    Ist OpenCl also schlecht designed ? Wenn ich seriell 8 Zeilen brauche aber für OpenCL 300 Zeilen, frag ich mich schon ob da nicht was überflüssig ist.

    wenn man deiner logik folgt, müstest dann nicht auch du schlecht designed sein, wenn du ein ganzes projekt aufsetzt, hundert zeichen tippst, statt den taschenrechner aufzurufen, um 10 zahlen xu addieren?



  • Es gibt doch auch CSharp für OpenCL. Ist das nur ein Wrapper oder wurde der Code völlig neu in CSharp geschrieben ?



  • OpenCL ist wie auch OpenGL eine Schnittstellenspezifikation und keine Library. Dein Grafiktreiber implementiert diese Schnittstelle. Das was du meinst ist wohl eine .NET Library, die OpenCL für .NET Programme verfügbar macht...



  • ABer es gibt doch auf Wrapper. Soviel ich weiß gibt es einen CSharp Wrapper der wiederum die C++ Funktionen aufruft.



  • Ja, Wrapper gibt es!



  • Weiß jemand ob man in OpenCl mit 2-dimensionalen Arrays arbeiten kann ? ClCreateBuffer nimmt nämlich nur einen void* buffer als Parameter. Ich muss ja die Parameter in cl_mem Objekte schauffeln.



  • Du kannst ein Array jeder beliebigen Dimension auf ein eindimensionales Array abbilden. Abgesehen davon bietet OpenGL die Möglichkeit, auf die Texturhardware zuzugreifen, was unter bestimmten Voraussetzungen effizienter sein kann als direkt mit Buffern zu arbeiten...



  • Das mit dem Abbilden auf ein eindimensionales Array dacht ich mir auch schon. Aber da muss ich jetzt meinen ganzen Algorithmus umschreiben. Ich verwende halt ein 2-dimensionales Array. Kann man das in OpenCl irgendwie verwenden ?



  • Kannst du das in C bzw. C++ "irgendwie verwenden" wenn du deine Buffer mit malloc bzw. new allokierst? Und was musst du da groß umschreiben, alles was du brauchst is eine Funktion die dir den Index ausrechnet bzw. direkt das entsprechende Element returned!?



  • blurry333 schrieb:

    Das mit dem Abbilden auf ein eindimensionales Array dacht ich mir auch schon. Aber da muss ich jetzt meinen ganzen Algorithmus umschreiben. Ich verwende halt ein 2-dimensionales Array. Kann man das in OpenCl irgendwie verwenden ?

    ist dir klar dass

    int foo[y][x];
    

    dasselbe ist wie

    int foo[x*y];
    

    und ob du jetzt

    foo[j][i]=...
    

    schreibst, oder stattdessen

    foo[i+j*x]=...
    

    dabei genau dasselbe gemacht wird, sogar der Assembler dazu ist 1:1 gleich.

    Entsprechend, wenn du einen void* brauchst

    void* bar = foo[0][0];
    

    Das sind jedoch wirklich Grundlagen, du wirst nicht weit kommen ohne sowas zu wissen.



  • float arr[2][3]={{1,2,3},{4,5,6}};
    
    float (* pointer) [3] = arr;
    void * pointer = arr;
    

    Beides geht, aber ich versteh keines davon 🙂


Anmelden zum Antworten