<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Schöne Lösung gesucht: Sowas wie cout für MPI-Programme]]></title><description><![CDATA[<p>Hallo,</p>
<p>Ich schreibe momentan ein paralleles Programm auf Basis von boost::mpi. Nun wird ab und zu was ausgegeben, wobei die Ausgabe jeweils immer nur einmal erfolgen soll und nicht auf alles PEs. Bisher habe ich sowas in der Art gemacht:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;boost/mpi.hpp&gt;
namespace mpi = boost::mpi;

int main(int narg, char* arg[])
{
	mpi::environment env(narg, arg);
	mpi::communicator world;

	unsigned rank = world.rank();

	if(rank == 0)
		std::cout &lt;&lt; &quot;running on &quot; &lt;&lt; world.size() &lt;&lt; &quot; CPUs&quot; &lt;&lt; std::endl;
}
</code></pre>
<p>Da ich aber ziemlich viele Ausgaben im Laufe des Programmes einbauen werde finde ich die Lösung mit dem if(rank == 0) nicht so schön. Besser wäre es sowas wie cout zu haben was nur für rank == 0 auf die Standardausgabe schickt und in allen anderen Fällen einfach nichts tut.</p>
<p>Weiß jemand, ob es sowas schon fertig gibt bzw. hat jemand ne Idee wie ich das möglichst ohne großen Aufwand bewerkstelligen kann. Ich steh da momentan ein wenig auf dem Schlauch was eine elegante Lösung betrifft und eigentlich ist es ein unwichtiges Detail aber die dauernden if's nerven mich <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /> .</p>
<p>Viele Grüße,<br />
Walli</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/224908/schöne-lösung-gesucht-sowas-wie-cout-für-mpi-programme</link><generator>RSS for Node</generator><lastBuildDate>Fri, 02 Oct 2026 01:58:53 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/224908.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 16 Oct 2008 15:05:55 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Schöne Lösung gesucht: Sowas wie cout für MPI-Programme on Thu, 16 Oct 2008 15:05:55 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>Ich schreibe momentan ein paralleles Programm auf Basis von boost::mpi. Nun wird ab und zu was ausgegeben, wobei die Ausgabe jeweils immer nur einmal erfolgen soll und nicht auf alles PEs. Bisher habe ich sowas in der Art gemacht:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;boost/mpi.hpp&gt;
namespace mpi = boost::mpi;

int main(int narg, char* arg[])
{
	mpi::environment env(narg, arg);
	mpi::communicator world;

	unsigned rank = world.rank();

	if(rank == 0)
		std::cout &lt;&lt; &quot;running on &quot; &lt;&lt; world.size() &lt;&lt; &quot; CPUs&quot; &lt;&lt; std::endl;
}
</code></pre>
<p>Da ich aber ziemlich viele Ausgaben im Laufe des Programmes einbauen werde finde ich die Lösung mit dem if(rank == 0) nicht so schön. Besser wäre es sowas wie cout zu haben was nur für rank == 0 auf die Standardausgabe schickt und in allen anderen Fällen einfach nichts tut.</p>
<p>Weiß jemand, ob es sowas schon fertig gibt bzw. hat jemand ne Idee wie ich das möglichst ohne großen Aufwand bewerkstelligen kann. Ich steh da momentan ein wenig auf dem Schlauch was eine elegante Lösung betrifft und eigentlich ist es ein unwichtiges Detail aber die dauernden if's nerven mich <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /> .</p>
<p>Viele Grüße,<br />
Walli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1599990</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1599990</guid><dc:creator><![CDATA[Walli]]></dc:creator><pubDate>Thu, 16 Oct 2008 15:05:55 GMT</pubDate></item><item><title><![CDATA[Reply to Schöne Lösung gesucht: Sowas wie cout für MPI-Programme on Thu, 16 Oct 2008 15:20:00 GMT]]></title><description><![CDATA[<p>Hi,<br />
würde das gelten ?</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;boost/mpi.hpp&gt;
namespace mpi = boost::mpi;

ostream&amp; operator&lt;&lt;(ostream &amp;os, const mpi::communicator&amp; w)
{
    if( w.rank() == 0 )
        std::cout &lt;&lt; &quot;running on &quot; &lt;&lt; world.size() &lt;&lt; &quot; CPUs&quot; &lt;&lt; std::endl;

    return os;
}

int main(int narg, char* arg[])
{
	mpi::environment env(narg, arg);
	mpi::communicator world;

	std::cout &lt;&lt; world &lt;&lt; std::endl;
}
</code></pre>
<p>Könnte verwirrend wirken, aber wenn world &quot;leer&quot; ist, soll ja auch nicht ausgegeben werden <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1599998</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1599998</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Thu, 16 Oct 2008 15:20:00 GMT</pubDate></item><item><title><![CDATA[Reply to Schöne Lösung gesucht: Sowas wie cout für MPI-Programme on Thu, 16 Oct 2008 19:04:56 GMT]]></title><description><![CDATA[<p>Hmm... bei den Überlegungen zu dem Problemchen hab ich mich ein wenig verrannt - das Ergebnis war die idee eines Streams mit ein-aus-Schalter:</p>
<pre><code class="language-cpp">class DoNothingStreamBuf : public std::streambuf
{
  /* ??? */
  //müsste so implementiert werden, dass jede Ausgabe ohne Wirkung ist...
};

class SwitchableOstream : public std::ostream
{
  std::streambuf* saveBuf;

public:
  explicit SwitchableOstream(std::streambuf* sb) : std::ostream(sb), saveBuf(NULL) 
  {}

  bool isOn()
  { 
    return saveBuf == NULL; 
  }

  void switchOff()
  {
    if (isOn())
    {
      saveBuf = rdbuf(new DoNothingStreamBuf); //internen Streambuf auf donothing setzen und vorher assoziierten streambuf in saveBuf speichern
    }
  }

  void switchOn()
  {
    if (not isOn()) 
    {
      delete rdbuf(saveBuf);  //in saveBuf gespeicherten Streambuf setzen und vorher assoziierten donothingstreambuf zerstören
      saveBuf = NULL;
    }
  }
};

//Benutzung:
int main(int narg, char* arg[])
{
    mpi::environment env(narg, arg);
    mpi::communicator world;

    unsigned rank = world.rank();

    SwitchableOstream scout(std::cout.rdbuf()); //schreibt auf den gleichen strambuf wie cout - wenn er schreibt...

    if(rank != 0) scout.switchOff();

    scout &lt;&lt; &quot;running on &quot; &lt;&lt; world.size() &lt;&lt; &quot; CPUs&quot; &lt;&lt; std::endl;
}
</code></pre>
<p>Ich hab mich &quot;nur&quot; noch nicht damit beschäftigt wie man streambuf's ableitet, also welche Methoden man implementieren muss (std::streambuf ist abstract)...</p>
<p>Kurze Erläuterung: wie jeden anderen ostream initialisiert man den SwitchableOstream mit einem streambuf, und zwar mit dem, an den die Ausgabe im Zustand &quot;an&quot; gehen soll. Wird der Stream ausgeschaltet, dann wird dem geerbten ostream der buffer entzogen und durch einen DoNothingStreamBuf ersetzt, damit folgende Ausgaben keinen Effekt haben. Der ursprünglich überreichte Streambuffer wird derweil zwischengespeichert in saveBuf.</p>
<p>/edith:</p>
<pre><code class="language-cpp">class DoNothingStreamBuf : public std::streambuf
{
  const static std::size_t buflen = 1024;
  char dummybuf[buflen]; 
public:
  DoNothingStreambuf() : pptr(dummybuf+buflen/2)
  {
    std::fill(dummybuf, dummybuf+buflen/2, '\0');
    setg(dummybuf, dummybuf, dummybuf+buflen/2); //erste Haelfte: Spielplatz fuer Lesezugriffe, liefern immer '\0'
    setp(dummybuf+buflen/2, dummybuf+buflen); //zweite Haelfte: Spielplatz fuer Schreibzugriffe
  }

protected:
  virtual int underflow()
  {
    gptr = dummybuf;
    return '\0';
  }

  virtual int overflow(int)
  {
    pptr = dummybuf + buflen/2;
    return (EOF == 1) ? 2 : 1; //irgendwas, nur nicht EOF
  }
};
</code></pre>
<p>Dieser streambuf macht wirklich garnichts, außer die lese/schreibepointer des streambuf auf einem dummybuffer zu plazieren wo sie lustig rumschreiben/lesen können - wird das Ende erreicht, dann wird der entsprechende Pointer wieder an den Anfang des Buffers gesetzt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1600094</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1600094</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Thu, 16 Oct 2008 19:04:56 GMT</pubDate></item><item><title><![CDATA[Reply to Schöne Lösung gesucht: Sowas wie cout für MPI-Programme on Fri, 17 Oct 2008 08:20:15 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/9960">@pumuckl</a>,<br />
Hast du dich nicht ein wenig sehr verrannt? Das folgende funktioniert bei mir unter G++ und MSVC.</p>
<pre><code class="language-cpp">std::ostream out(std::cout.rdbuf());

if(world.rank() == 0)
{ out.rdbuf(0); }

// ...
</code></pre>
<p>Man setzt einfach den Buffer auf 0, dann hat man einen leeren Stream. Aber ob das sinnvoll ist? Man führt dann unnötige Operationen auf einem leeren Stream aus.</p>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1600261</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1600261</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Fri, 17 Oct 2008 08:20:15 GMT</pubDate></item><item><title><![CDATA[Reply to Schöne Lösung gesucht: Sowas wie cout für MPI-Programme on Fri, 17 Oct 2008 08:58:04 GMT]]></title><description><![CDATA[<p>Danke schonmal für eure Überlegungen. Zum letzten Post: Es ist nicht schlimm wenn unnötige Operationen auf einen Stream ausgeführt werden. Da geht es mir eher um Eleganz als um Effizienz weil die Ausgaben unkritisch sind. Zwischen zwei Ausgaben wird zuviel gerechnet werden als dass sie irgendwie ins Gewicht fallen.</p>
<p>KasF: Ne, ich musste erst genauer hinsehen um zu erkennen was Du meinst. Das ist nicht was ich suche. Es soll für beliebige Ausgaben gehen und nicht bloß die, wo man sagt auf wieviel CPUs man arbeitet.</p>
<p>pumuckl: Hmm, ich habe es mir noch nicht komplett angesehen, aber im Prinzip das was ich suche: Nur bei der Menge an zusätzlichem Code kann ich auch direkt überall das if davorschreiben <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /> .</p>
<p>Dravere: Die Lösung gefällt mir eigentlich. Hat jemand eine Ahnung ob es kritisch wäre das direkt mit cout zu machen? Also etwa: &quot;if(rank != 0) std::cout.rdbuf(0);&quot;. Mir ist bewusst, dass das vielleicht nicht die feine englische Art ist, aber die Zwischenausgaben werden nur auf CPU 0 gemacht. Eventuell ist es schlecht, wenn man mit einem Fehler abbrechen und eine Nachricht ausgeben will, weil Fehler können durchaus lokal auf nur einer CPU passieren. Auf der anderen Seite gehört das aber auch eher nach cerr, oder?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1600269</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1600269</guid><dc:creator><![CDATA[Walli]]></dc:creator><pubDate>Fri, 17 Oct 2008 08:58:04 GMT</pubDate></item></channel></rss>