OpenCL



  • 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 🙂



  • Was genau hat das mit dem Thema zu tun?

    Abgesehen davon: Ein Array kann implizit in einen Zeiger auf das erste Element konvertiert werden. Und ein Zeiger auf ein Objekt kann implizit in einen void* konvertiert werden. Im zweiten Fall wird implizit Array in Zeiger und Zeiger in void* gewandelt, im ersten Fall wird Array implizit in Zeiger auf erstes Element konvertiert, was im Falle eines zweidimensionalen Arrays wieder ein Array ist (ein mehrdimensionales Array ist ein Array aus Arrays). Und T (*bla)[3] deklariert genau so einen Zeiger auf ein Array (ohne Klammern würde der * zum T zählen und stattdessen ein Array aus Zeigern deklariert)...



  • Ein Array kann implizit in einen Zeiger auf das erste Element konvertiert werden

    Jedes array egal welcher Größe/Dimension kann auf einen Zeiger auf das erste Element konvertiert werden ?



  • blurry333 schrieb:

    Ein Array kann implizit in einen Zeiger auf das erste Element konvertiert werden

    Jedes array egal welcher Größe kann auf einen Zeiger auf das erste Element konvertiert werden ?

    Ja, das sind nun aber wirklich Grundlagen die du beherrschen solltest, wenn du dich mit Dingen wie OpenCL beschäftigen möchtest...



  • aber

    float* ptr = arr;
    

    geht nicht. nur

    void* ptr;
    


  • Ja, denn eine Standard Conversion Sequence kann nur eine Array to Pointer Conversion beinhalten...



  • Es macht keinen Sinn openCL zu nutzen, wenn man nichtmal c versteht, es baut sehr darauf auf. Blinder Pilot...



  • Noch mal zur Klarstellung.

    Es gibt momentan die OpenCL Spezifikation 1.2. Dort werden die Schnittstellen beschrieben.

    Implementiert jeder Hersteller diese Schnittstellen anders oder verwenden Sie alle denselben Source Code und kompilieren ihn nur für ihren jeweiligen Chip ?



  • OpenCL spezifiziert eine Schnittstelle und jeder Hersteller der OpenCL implementieren will, implementiert eben diese Schnittstelle.



  • Warum dann nicht eine supertolle Implementierung veröffentlichen und jeder Hersteller übernimmt diese und spart sich monatelangen Aufwand für eine eigene Implementierung 🙂



  • Und in dieser tollen Implementierung, wie genau funktioniert da die Kommunikation mit der Grafikhardware


Anmelden zum Antworten