Ich habe ein Problem openmp mitOpenMP mit ofstream und Systembefehl
In anderer Aktion parallelisieren, brauche ich eine Datei lesen, bearbeiten Sie den Inhalt und in einer anderen Datei speichert dem Eingang eine ausführbare Datei zu geben, die ich m gehend gestartet
Aus Leistungsgründen ist die Schleife eigentlich eine Rekursion ist parallelisiert.
Das Problem ist, dass manchmal die Eingabedatei, die ich geschrieben und geschlossen durch meine externe ausführbare Datei nicht lesbar ist
Haben Sie eine Idee? Danke
Um das Problem im einfachsten zu reproduzieren Ich habe ein kleines Programm erstellt:
#include <iostream>
#include <ctime>
#include <fstream>
#include <omp.h>
#include <vector>
#include <algorithm>
#include <string>
#include <stdlib.h>
#include <cstdio>
#include <sstream>
using namespace std;
int main()
{
const int max = 1000;
int N;
int nthreads = 0;
int threadid = 0;
time_t t=time(NULL);
stringstream s;
#pragma omp parallel private(threadid)
{
#pragma omp master
{
nthreads = omp_get_num_threads();
cout << endl << nthreads << " thread(s) disponible" << endl;
}
#pragma omp barrier
threadid = omp_get_thread_num();
#pragma omp critical
{
cout << "Thread " << threadid << " OK" << endl;
}
}
ifstream f("R:\\SIM.net", ios::in);
if (f)
{
s << f.rdbuf();
}
else
{
cout << "Impossible d'ouvrir le fichier d'entrée" << endl;
}
f.close();
#pragma omp parallel for schedule(dynamic)
for (N = 1; N <= max; N++)
{
ofstream o;
string l = "R:\\SIM\\"+to_string(N) + ".net";
o.open(l, ios::out | ios::trunc);
if (o)
{
o << s.str();
}
else
{
cout << "Impossible d'ouvrir le fichier de sortie" << endl;
}
o.close();
string commande = "\"R:\\LTspiceIV\\scad3.exe\" -b "+l+" &";
int retour= system(commande.c_str());
}
#pragma omp barrier
cout << "FIN" << endl << endl;
cout << "Temps : " << difftime(time(NULL), t) << " s" << endl;
return 0;
}
R ist eine perfekte weiche Ram Disk –
Ich habe dieses Problem nicht mit einem einzigen Thread: omp_set_num_threads (1) –
IO ist in der Regel nicht parallel zu tun, ohne Sperren und kritische Bereiche wie Sie in der ersten parallelen Schleife . Und selbst wenn es möglich ist, etwas zu erstellen, ist es wahrscheinlich nicht vorteilhaft, wenn Sie dies parallel ausführen, da alle Ihre Threads den gleichen Pfad von Ihrem Speicher zu Ihrer Festplatte verwenden müssen, um Konflikte zu erzeugen. – NoseKnowsAll