private Objektvariablen für omp Thread möglich?



  • Ein Thread berechnet eine Funktion zwischen mehren Identitäten eines Objektes.

    z.B. zwischen 1 und 2, 1 und 6, 1 und 17, 1 und 42, ....
    ein anderer
    z.B. zwischen 2 und 17, 2 und 11, 2 und 43, 2 und 42, ....

    insgesammt werden M mal N (N<M) Berechnungen gemacht.

    Die Funktione könnte z.B so sein:

    float fun(int a, int b){
        return std::sin(a)+std::sin(b);
    }
    

    Nun weiß ich z.B. dass 42 in der Liste fast immer drin ist. Dann könnte ich einmal std::sin(42) berechnen und diesen Wert dann immer gleich verwenden, statt ihn erneut zu berechnen. Falls M nicht groß ist, könnte ich das für jede Zahl so machen. Das Probem ist jedoch, dass M sehr groß werden kann. Es geht also nicht für jede Zahl. Als zweites könnte ich aber für jeden Thread temporär den Wert ausrechnen und dann in jeder Rechnung verwenden, da der erste immer der selbe ist. Wie Stelle ich nun sicher, dass kein anderer Thread in während dessen verwendet? Ich könnte vor der Rechung kopieren, voraus berechnen, alle Kombinationen berechnen und wieder löschen. Die Objekte können aber recht groß werden, das könnte eine Weile dauern (die Art der Objekte steht dem Nutzer frei). Ich bräuchte sowas ähnliches wie das Btrfs-Dateisystem mit dem Thread in einer Sandbox.
    Also dass nur für den Thread bekannt ist, dass er das Vorausberechnete verwenden kann.

    Abgeändert in etwa so:

    float fun(Obj o1, Obj o2){
        float val1, val2;
    
        if(o1.vorberechnet == true)
            val1 = o1.vor;
        else
            val1 = std::sin(o1.a);
    
        if(o2.vorberechnet == true)
            val2 = o2.vor;
        else
            val2 = std::sin(o2.a);
    
        return val1+val2;
    }
    

    Einen zustäzlichen Parameter übergeben ist auch doof. Am Ende wurde es dann gar nicht voraus berechnet.

    In der konkreten Anwendung ist es nicht nur ein Wert sondern hunderte.


Anmelden zum Antworten