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 gibtdie 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ührtdie 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 durchreichendann 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.