<?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[MPI Programm wirft Seg Fault bei MPI_Comm_create]]></title><description><![CDATA[<p>Hallo,</p>
<p>Ich muss ein bestehendes MPI-Programm, das in C geschrieben ist, erweitern.<br />
Ich möchte, dass zwei Anwendungen sich durch einen Interkommunikator austauschen können, um ihren Fortschritt bei der Berechnung auszutauschen und ggf. die Last neu zu verteilen (es geht um numerische Simulation).</p>
<p>Dazu habe ich zwei C++-Klassen geschrieben:<br />
Die Klasse MPICommunicatorGenerator erzeugt aus einem gegebenen Kommunikator Subkommunikatoren mit angegebenen Anzahlen und Größen und zwischen jeweils zweien dieser Subkommunikatoren einen Interkommunikator.<br />
Die Klasse MPILoadReDistributor soll den Austausch von Daten zwischen zwei Applikationen durch einen Interkommunikator regeln.</p>
<p>Der Code ist der Folgende:</p>
<pre><code class="language-cpp">static void Solve (void){
Real   residuum;
    int    iteration=0;
    MPILoadReDistributor* lrd;
    Elem* tri;
    int nTris = 0;
    MPI_Comm remote_comm, local_comm;
    MPI_Group local_group, remote_group;
    MPI_Comm intercomm;

    intercomm = gen-&gt;get_intercommunicator(0,1); //Kommunikator aus Objekt der  Klasse MPICommunicatorGenerator holen

    //Gruppen erzeugen
    MPI_Comm_group(intercomm, &amp;local_group);
    MPI_Comm_remote_group(intercomm, &amp;remote_group);

    // Aus Gruppen Kommunikatoren erzeugen
    MPI_Comm_create(MPI_COMM_WORLD, local_group, &amp;local_comm);
    MPI_Comm_create(MPI_COMM_WORLD, remote_group, &amp;remote_comm); // Hier tritt der Seg Fault auf

[...]
}
</code></pre>
<p>Das Programm läuft mit 2 Prozessoren korrekt ab, schon bei drei Prozessoren gibt es einen Segmentation Fault, der Backtrace sieht so aus:</p>
<pre><code class="language-cpp">Program received signal SIGSEGV, Segmentation fault.
0x4017cf9c in _int_malloc () from /lib/i686/libc.so.6
(gdb) bt
#0  0x4017cf9c in _int_malloc () from /lib/i686/libc.so.6
#1  0x4017c201 in malloc () from /lib/i686/libc.so.6
#2  0x08084cb3 in MPID_CH_Eagerb_save_short ()
#3  0x0808373c in MPID_CH_Check_incoming ()
#4  0x080702f1 in MPID_RecvComplete ()
#5  0x0805202d in PMPI_Waitall ()
#6  0x08077823 in PMPI_Sendrecv ()
#7  0x08064534 in intra_Allreduce ()
#8  0x0805982b in PMPI_Allreduce ()
#9  0x08058403 in MPIR_Context_alloc ()
#10 0x080578fa in PMPI_Comm_create ()
#11 0x0804bf22 in Solve () at fe.ct:324
#12 0x0804c0f9 in first_app::Computation() () at fe.ct:435
#13 0x08050fbe in main (argc=1, argv=0xbfffdb34) at ../src/main.c:377
#14 0x4011ea67 in __libc_start_main () from /lib/i686/libc.so.6
</code></pre>
<p>Der Aufruf ist hierbei Folgender:</p>
<pre><code class="language-cpp">(gdb) frame 11
#11 0x0804bf22 in Solve () at fe.ct:324
324             MPI_Comm_create(MPI_COMM_WORLD, remote_group, &amp;remote_comm);
Current language:  auto; currently c++
</code></pre>
<p>Jetzt meine Frage: Warum bekomme ich bei &gt;2 Prozessoren einen Seg Fault? Bei genau 2 Prozessoren läuft das Programm einwandfrei.<br />
Wichtig ist vielleicht noch, dass der obige Code in zwei verschiedenen Namespaces vorhanden ist, d.h. die Hälfte aller Prozessoren (bis auf 1 bei ungerader Anzahl) führt den Code in namespace1 aus, die andere Hälfte in namespace2.</p>
<p>Meine Idee war, dass evtl. die Anzahl der verfügbaren Kommunikatoren in MPI begernzt ist, da ich während der Berechnung öfter Kommunikatoren anlege, diese aber wieder freigebe, wenn sie nicht mehr benötigt werden.<br />
Weiß hierzu jemand etwas?</p>
<p>Vielen Dank,</p>
<p>Gruß</p>
<p>Fabian</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/218788/mpi-programm-wirft-seg-fault-bei-mpi_comm_create</link><generator>RSS for Node</generator><lastBuildDate>Thu, 08 Oct 2026 18:24:53 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/218788.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 25 Jul 2008 10:14:14 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to MPI Programm wirft Seg Fault bei MPI_Comm_create on Fri, 25 Jul 2008 10:14:14 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>Ich muss ein bestehendes MPI-Programm, das in C geschrieben ist, erweitern.<br />
Ich möchte, dass zwei Anwendungen sich durch einen Interkommunikator austauschen können, um ihren Fortschritt bei der Berechnung auszutauschen und ggf. die Last neu zu verteilen (es geht um numerische Simulation).</p>
<p>Dazu habe ich zwei C++-Klassen geschrieben:<br />
Die Klasse MPICommunicatorGenerator erzeugt aus einem gegebenen Kommunikator Subkommunikatoren mit angegebenen Anzahlen und Größen und zwischen jeweils zweien dieser Subkommunikatoren einen Interkommunikator.<br />
Die Klasse MPILoadReDistributor soll den Austausch von Daten zwischen zwei Applikationen durch einen Interkommunikator regeln.</p>
<p>Der Code ist der Folgende:</p>
<pre><code class="language-cpp">static void Solve (void){
Real   residuum;
    int    iteration=0;
    MPILoadReDistributor* lrd;
    Elem* tri;
    int nTris = 0;
    MPI_Comm remote_comm, local_comm;
    MPI_Group local_group, remote_group;
    MPI_Comm intercomm;

    intercomm = gen-&gt;get_intercommunicator(0,1); //Kommunikator aus Objekt der  Klasse MPICommunicatorGenerator holen

    //Gruppen erzeugen
    MPI_Comm_group(intercomm, &amp;local_group);
    MPI_Comm_remote_group(intercomm, &amp;remote_group);

    // Aus Gruppen Kommunikatoren erzeugen
    MPI_Comm_create(MPI_COMM_WORLD, local_group, &amp;local_comm);
    MPI_Comm_create(MPI_COMM_WORLD, remote_group, &amp;remote_comm); // Hier tritt der Seg Fault auf

[...]
}
</code></pre>
<p>Das Programm läuft mit 2 Prozessoren korrekt ab, schon bei drei Prozessoren gibt es einen Segmentation Fault, der Backtrace sieht so aus:</p>
<pre><code class="language-cpp">Program received signal SIGSEGV, Segmentation fault.
0x4017cf9c in _int_malloc () from /lib/i686/libc.so.6
(gdb) bt
#0  0x4017cf9c in _int_malloc () from /lib/i686/libc.so.6
#1  0x4017c201 in malloc () from /lib/i686/libc.so.6
#2  0x08084cb3 in MPID_CH_Eagerb_save_short ()
#3  0x0808373c in MPID_CH_Check_incoming ()
#4  0x080702f1 in MPID_RecvComplete ()
#5  0x0805202d in PMPI_Waitall ()
#6  0x08077823 in PMPI_Sendrecv ()
#7  0x08064534 in intra_Allreduce ()
#8  0x0805982b in PMPI_Allreduce ()
#9  0x08058403 in MPIR_Context_alloc ()
#10 0x080578fa in PMPI_Comm_create ()
#11 0x0804bf22 in Solve () at fe.ct:324
#12 0x0804c0f9 in first_app::Computation() () at fe.ct:435
#13 0x08050fbe in main (argc=1, argv=0xbfffdb34) at ../src/main.c:377
#14 0x4011ea67 in __libc_start_main () from /lib/i686/libc.so.6
</code></pre>
<p>Der Aufruf ist hierbei Folgender:</p>
<pre><code class="language-cpp">(gdb) frame 11
#11 0x0804bf22 in Solve () at fe.ct:324
324             MPI_Comm_create(MPI_COMM_WORLD, remote_group, &amp;remote_comm);
Current language:  auto; currently c++
</code></pre>
<p>Jetzt meine Frage: Warum bekomme ich bei &gt;2 Prozessoren einen Seg Fault? Bei genau 2 Prozessoren läuft das Programm einwandfrei.<br />
Wichtig ist vielleicht noch, dass der obige Code in zwei verschiedenen Namespaces vorhanden ist, d.h. die Hälfte aller Prozessoren (bis auf 1 bei ungerader Anzahl) führt den Code in namespace1 aus, die andere Hälfte in namespace2.</p>
<p>Meine Idee war, dass evtl. die Anzahl der verfügbaren Kommunikatoren in MPI begernzt ist, da ich während der Berechnung öfter Kommunikatoren anlege, diese aber wieder freigebe, wenn sie nicht mehr benötigt werden.<br />
Weiß hierzu jemand etwas?</p>
<p>Vielen Dank,</p>
<p>Gruß</p>
<p>Fabian</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1553464</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1553464</guid><dc:creator><![CDATA[fep2k]]></dc:creator><pubDate>Fri, 25 Jul 2008 10:14:14 GMT</pubDate></item><item><title><![CDATA[Reply to MPI Programm wirft Seg Fault bei MPI_Comm_create on Sat, 26 Jul 2008 09:32:13 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>Weiß denn nun jemand, ob die Anzahl der Kommunikatoren in MPI begrenzt ist?<br />
Ich verwende MPICH 1.2.5.2. Habe in der mpi.h nichts passendes gefunden.</p>
<p>Wie kann es dazu kommen, dass in _int_malloc() ein Seg Fault auftritt?</p>
<p>Danke,</p>
<p>Fabian</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1553910</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1553910</guid><dc:creator><![CDATA[fep2k]]></dc:creator><pubDate>Sat, 26 Jul 2008 09:32:13 GMT</pubDate></item></channel></rss>