Prüfen, ob GPU CUDA, OpenCL und C++AMP unterstützt



  • Ich möchte ein Programm schreiben, welches je nach Featureset der Grafikkarte auf die entsprechenden Schnittstellen (CUDA, OpenCL, C++ AMP / DX11) zurückgreift.
    Hierzu möchte ich im wesentlichen wie folgt vorgehen (ungetestet):

    enum _GPGPU_FLAG {CUDA, OCL, AMP, NONE };
    _GPGPU_FLAG GPGPU_FLAG;
    
    void SET_GPGPU_FLAG()
    {
        int vektor(10) = {0,1,2,3,4,5,6,7,8,9};
        thrust::device_vector<int> CUDAVektor(10);
        array_view<const int, 1> AMPVektor(10, vektor);
    
        if (CUDAVektor != NULL) //Cuda funktioniert
            GPGPU_FLAG = CUDA;
        else if (Prüfkriterium_für_OpenCL) //OpenCL funktioniert
            GPGPU_FLAG = OCL;
        else if (AMPVektor != NULL) //C++ AMP funktioniert
            GPGPU_FLAG = AMP;
        else //System unterstützt keines der überprüften Features
            GPGPU_FLAG = NONE;
    }
    
    void main()
    {
        SET_GPGPU_FLAG();
        //...
    }
    

    Wäre mein Vorhaben auf diese Weise realisierbar oder gibt es dafür elegantere Lösungen?

    Ziel meines Programmes ist vor allem, dass ich mich mit allen GPGPU-Programmiersprachen mal beschäftigen möchte und außerdem will ich die Performance untereinander vergleichen. 🙂



  • Hallo

    Wäre es da nicht einfacher, wenn du die verschiedenen Implementierungen hinter Klassen versteckst, die alle eine gemeinsame Basisklasse besitzen und dann entsprechend eine Instanz der aktuell unterstützten Klasse erzeugst und über diese dann die eigentliche Logik arbeiten lässt? Bzw als Template Argument an der eigentlichen Verarbeitungsklasse.

    Theoretisch würde dein Ansatz schon gehen, aber dann müsstest du an jeder Stelle eine of-Kaskaden einbauen um den richtigen Code auszuführen.

    MfG Marco


Anmelden zum Antworten