openmp, preprocessor, pragma frage



  • ja ich weiss, ganz dummer titel 🙂

    ich habe folgendes problem, ich benutzte in meinem projekt
    openmp, und da die ganze sache ziemlich zeitkritisch ist, habe ich nun
    folgendes problem :

    ich habe zB ein klasse

    class mmlp
    {
    public : 
    
    void calc()
     {
     #pragma omp parallel for
     for(int i=0; i < static_cast<int>(m_mlps.size()); i++)
      {
      m_mlps[i].calc();
      }
     }
    
    private :
    std::vector<mlp> m_mlps;
    }
    

    das problem ist nun, das die klasse mlp ebendfalls openmp benutzt,
    was dann unsinnig ist, weil es soviele cpus in keinem rechner gibt

    die frage ist :

    wie schalte ich openmp in der nested Klasse(funktion) ab, wenn openmp
    in der drüber schon benutzt wird.
    Das geht zwar zur Laufzeit mit openmp anweisungen, aber ich würde
    gerne schon zur compile-zeit den overhead der aufrufe an die lib sparen.

    Hat jemand eine bessere idee, als mit bool-function-templates-specilization
    ( 2 versionen, einmal mit openmp, einmal ohne)?



  • da keiner geantwortet hat, versuch ich es mal:
    soweit ich weiß, sollte openmp zwei geschachtelte parallels gar nicht per default doppelt parallelisieren. laut doku muss man das einstellen für "nested loops". aber ob das in deinem fall auch als nested gilt, weiß ich nicht. hast du geprüft, ob es doppelt parallel abläuft?



  • genau das "zur laufzeit" stört mich ja,

    das einstellen, ob nested oder nicht, ist meiner meinung nach
    ein aufruf an die openmp-lib
    (weil es eine simple function in omp.h ist, und kein pragma)

    ich habe zB matrix-multiplikation parallelisiert,
    in den mlps werden viele matrix-multiplikationen durchgeführt

    die klasse mmlp ist dann ein verbund von mlps, welche alle parallel
    ablaufen, somit sind alle aufrufe an openmp innerhalb von den einzelnen
    mlps für die katz (verschwendete rechnenzeit)

    ich sehe eben als lösung nur :
    jede methode welche potentiell openmp benutzt, wird über einen
    template-bool-parameter spezialisiert, und dann schaltet die aufrufende
    methode, openmp in den aufgerufenen methoden via template-parameter ab,
    und das abschalten kann ich dann ja durchreichen

    dann müsste ich aber alle openmp-benutzenden methoden doppelt schreiben 😞



  • es geht mir eher darum, dass laut dokumentation und dem, an was ich mich noch an eine übung an der uni erinnern kann, openmp nested loops per default nicht doppelt oder mehrfach parallelisiert. das "nachschauen", ob es überhaupt doppelt parallel ausgeführt wird, ist eher für die kontrolle gedacht, ob openmp deine beiden aufrufe als nested ansieht und deshalb nicht doppelt parallell macht. also mehr zu debugging-zwecken. sobald du herausgefunden hast, dass es nicht doppelt parallel abläuft, kannst du den aufruf wieder entfernen und das problem als gelöst ansehen. zumindest für diese beiden parallels.
    außerdem: was hast du gegen aufrufe zur openmp bibliothek? in deinem programm sind durch die pragams sicher genug aufrufe dorthin schon implizit enthalten.


Anmelden zum Antworten