2017-01-05 4 views
0

Hier ist der Hauptteil meines Codes, um es zu beschleunigen Ich benutze Multithread, die unten zeigt, so ist meine Grundidee, sie einfach in 12 Teile zu klumpen und lassen Sie uns ihre Arbeit machen separatWie verbessert man Multithread-Performance in C++

int Thread_num=12; 
    int firstone=0; 
    int lastone=vector.size(); 
    int chunk = (lastone-firstone+(Thread_num-1))/Thread_num; 
    std::thread t[Thread_num];  
    for(int i=0;i<Thread_num;i++) 
{ 
    int s =firstone+i*chunk; 
    int e = ((s+chunk)<vector.size())? (s+chunk) : vector.size(); 

    t[i]=std::thread(calculateAll,data,arr,s,e);   
} 
for (int i = 0; i < Thread_num; ++i) 
{ 
    t[i].join(); 
} 

und hier ist die calculateAll Funktion (nicht genauer Code), und ich verwende Schloss push_back Teil verriegeln sie in diesen list Vektor zur gleichen Zeit schreiben zu vermeiden (die Reihenfolge spielt keine Rolle).

void calculateAll(int ***data,LineIndex* arr,int s,int e) 
{ 
    for(int a=s;a<e;a++) 
    { 
    function_1(arr) /*do something with array(arr)*/ 
    result=function_2(data) /*do something with data*/ 
    mylock.lock(); 
    list.push_back(result);  
    mylock.unlock(); 
    } 
} 

Also theoretisch, wird das 12 Mal beschleunigt werden? Wenn ich diese Idee in meinem Code verwende, wird sie 5 bis 6 Mal schneller. Macht das Sinn? und kann ich etwas modifizieren, um die Leistung zu verbessern, vielleicht eine andere Methode verwenden? Appreciated

+0

Haben Sie wirklich 12 Kerne auf Ihrer Maschine? – SergeyA

+0

Ich führe es auf Server, der 14 Kern insgesamt hat, und 12 Threads ist die beste Leistung, die ich bekommen kann – MMzztx

+0

Lesen Sie auch auf [Amdahl's Gesetz] (https://en.wikipedia.org/wiki/Amdahl's_law), gegeben dass es wahrscheinlich ist, dass der [peinlich parallele] (https://en.wikipedia.org/wiki/Embarrassingly_parallel) Teil Ihres Codes nicht die gesamte Arbeitslast ist. – NPE

Antwort

1

Das lock() und unlock() Leistung zu töten, machen Sie Ihren parallelen Algorithmus in eine mehr oder weniger serielle. Wie einer der Kommentare andeutet, geben Sie jedem Thread eine eigene Liste zum Speichern der Ergebnisse, und konsolidieren Sie die Ergebnisse, wenn alle Threads beendet sind.

Auf eine andere Weise, wenn Sie sagen, dass Ihr Server 14 Kerne hat, ist das tatsächliche, physikalische Kerne, oder sind es 7 Kerne, jeder mit zwei Hyper-Threads? Wenn es das letztere ist, interferieren die Hyper-Threads miteinander und Sie erhalten nicht die volle Beschleunigung, die Sie von separaten Kernen erhalten würden.

+0

Jemand sagte mir, ich sollte wie 'auto fut = std :: async (std :: launch :: async, calculateAll, data, arr, s, e)' verwenden, um das Ergebnis zu erfassen, anstatt 't [i] = std :: thread (calculateAll, Daten, arr, s, e); ' in meinem code, aber es scheint perfom so langsam, es scheint wie keine threads ... keine idee – MMzztx

+0

@MMzztx - fragen Sie das als eine neue Frage. –

Verwandte Themen