Ich benutze C++ (geschrieben für Windows und Linux) für OpenMPI kompiliert. Ich bekomme eine seltsame Reihe von Zuordnungsfehlern, wenn ich ein Klassenobjekt zu einem Vektor innerhalb der OpenMPI for-Schleife hinzufüge. Das Debuggen zeigt ein sich änderndes Muster von Zuweisungsfehlern, alle zentriert um meine "AddEntry()" - Methode, aber die Fehler fallen niemals an einer konsistenten Stelle in der Schleife oder auf einem konsistenten Element innerhalb des Objekts, das ich hinzufüge (daher glaube ich das Objekt ist nicht das Problem, diese Details sind nicht im Fragecode enthalten). Ich habe versucht, Platz für den Vektor zu reservieren, und ich habe versucht, Lösungen sowohl mit Deque und Liste. Ich habe versucht, das Objekt an das Add-Mitglied als ein Objekt, Verweis und Zeiger übergeben (instanziiert mit 'neu()') und keine dieser Lösungen das Problem gelöst. Dies ist mein Code:C++ Alloc Fehler Hinzufügen von Objekten zu Vector (oder Deque oder List) in einem OpenMPI For-Schleife
#include "MyEntryClass.h"
#include "MyVectorClass.h"
#include <omp.h>
CMyVectorClass::CMyVectorClass()
{
try
{
m_vEntries.clear();
m_vEntries.reserve(750000);
}
catch (exception ex)
{
cout << "ERROR [CMyVectorClass] Exception Code: " << ex.what() << "\n";
}
}
// Interface (public)
bool CMyVectorClass::AddEntry(CMyVectorClass_Entry& eAdd)
{
try
{
m_vEntries.push_back(eAdd);
return true;
}
catch (exception ex)
{
cout << "ERROR [AddEntry] Exception Code: " << ex.what() << "\n";
}
return false;
}
bool CMyVectorClass::DoOMPLoop()
{
// Max processors for omp
int nMaxProcs
// Continue, if true
volatile bool vbContinue = true;
// Loop counter
long lMaxCount = 100000;
try
{
// Iterate through files
// Declare team size
#pragma omp parallel for shared(vbContinue) num_threads(nMaxProcs)
for (long lCount = 0; lCount < lMaxCount; lCount++)
{
// The entry object to add
CMyEntryClass cAdd;
// Do some stuff to the entry
cAdd.SetStuff();
// Catalog the data
vbContinue = AddEntry(cAdd);
}
}
catch (exception ex)
{
cout << "ERROR [DoOMPLoop] Exception Code: " << ex.what() << "\n";
}
return false;
}
// Implementation (private)
Dieses Problem hat mich viele Stunden der Frustration kosten versuchen zu lösen und keine der Hilfe, die ich auf Stackoverflow finden (oder dem ‚Netz im Allgemeinen) hat mir ermöglicht, das Problem zu beheben (obwohl es mir geholfen hat, anderen Code zu optimieren). Bitte helfen.
Statt explizit für den Index außerhalb der Grenzen wie die Überprüfung, die alle benötigten Sie war Gebrauch 'vector :: at()' und fangen die 'std :: out_of_range' zu tun Ausnahme, wenn ein Begrenzungsproblem vorliegt. 'try {m_vEntries.at (lIndex) = eSet; return true;} catch (std :: out_of_range & e) {Fehler} ' – PaulMcKenzie
Dies ist nur eine weitere Lösung für das Problem. Der Punkt ist, eine Standard-Push-Back-Operation wird nicht innerhalb einer parallelen Schleife funktionieren. Die Lösung, die ich anbiete, erfüllt zwei Dinge: 1) sie vermeidet Kollisionen und 2) sie weist den für den Vektor benötigten Platz vor. Da ich bereits eine Vorstellung von der Größe der Sammlung habe (Code nicht gezeigt, gebe ich eine Liste von Elementen, um sie zu füllen), vermeidet die Verwendung der "resize (#)" - Syntax kostspielige Neuzuweisungen des Arrays (was nach meinem Verständnis vollständige Kopien des Datensatzes erfordert). Eine Ausnahme zu finden scheint eine minderwertige Lösung zu sein, da sie unnötig ist. – Epsilon3