2016-05-24 14 views
3

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; 
} 
+0

R ist eine perfekte weiche Ram Disk –

+0

Ich habe dieses Problem nicht mit einem einzigen Thread: omp_set_num_threads (1) –

+0

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

Antwort

0

dank Ihrer Antwort NoseKnowsAll

In der Tat ich schon versucht, einen kritischen Bereich Zugabe aber es ist schlimmer

4/1000 Datei nicht lesbar, ohne kritisch, 56/1000 Datei nicht lesbar mit kritischen

for (N = 1; N <= max; N++) 
{ 
    string l = "R:\\SIM\\"+to_string(N) + ".net"; 
    #pragma omp critical 
    { 
     ofstream o; 
     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()); 
}