2012-03-28 7 views
0

Ich habe eine Multithread-Anwendung. Wie auch immer ich bemerkt habe, verwende ich OpenGL und das sollte ohne Semaphoren nicht gut funktionieren. Und es tat es. Ich habe später Semaphore hinzugefügt, weil sie verwendet werden sollten.Qt Threading scheint nicht gleichmäßig über Kerne zu teilen

Nicht so toll ist die Tatsache, dass ich jetzt eine Multithread-Anwendung habe, die nicht wirklich scheint, mehrere Threads oder Kerne auf der CPU zu verwenden.

Mein Lastausgleich scheint immer zu einem einzelnen Kern (von 4) mit einem Unterschied von mindestens 40% zu sein.

Muss ich einen Trigger in der Projektdatei von Qt wechseln, oder übersehe ich etwas anderes? Es könnte sein, dass dieses Verhalten erwartet wird, aber die Klärung wäre schön, wenn es so wäre.

Meine Plattform ist Ubuntu 11.10.

class DrawChunkThread : public QThread 
{ 
    public: 
     DrawChunkThread(World *world, int x, int z); 
     void run(); 
     World *world; 
     int x; 
     int z; 
     static QSemaphore *sem; 
    private: 
}; 


QSemaphore *DrawChunkThread::sem = new QSemaphore(1); 

DrawChunkThread::DrawChunkThread(World *world, int x, int z) { 
    this->world = world; 
    this->x = x; 
    this->z = z; 
} 

void DrawChunkThread::run() 
{ 
    world->drawChunk(x, z); 
    if (world->isInside) { 
     world->drawInsideChunk(x, z); 
    } 
} 
+0

Es gibt viele Faktoren zu berücksichtigen ... Wird ein guter Anfang sein, um festzustellen, welcher Thread wie viel CPU verbrauchen ... versuchen Profiling – UmNyobe

+1

Sie sagen nicht, welche Plattform Sie verwenden. Unabhängig davon werden Sie wahrscheinlich feststellen, dass Ihr Code serialisiert wird, weil möglicherweise alle Threads auf eine einzelne Ressource treffen. Schlimmer noch als das, es gibt eine Reihe von Problemen, die Sie bekommen können, wenn Sie nicht cachefreundlich sind oder wenn Sie kritische Bereiche und so weiter überbeanspruchen, was zu einer schlechten Threading-Performance führen kann. – Robinson

+0

Welche Sprache benutzen Sie? Ist es C++? Fügen Sie das Sprach-Tag hinzu, da die verwendeten Tags Ihrer Frage nicht die erforderliche Sichtbarkeit geben. – Tudor

Antwort

2

Wenn die Semaphore Sie einen kritischen Abschnitt erstellen hinzugefügt, die entweder zu lang oder zu stritten (oder beides) ist, werden Sie Skalierbarkeit Probleme haben, weil nicht alle Fäden erlaubt den Code zur gleichen Zeit ausgeführt werden und Warten auf einen Semaphor löst einen Kontextwechsel aus, der weitere Gemeinkosten hinzufügt.

Im Allgemeinen kann Ihre parallele Anwendung, die einen seriellen Teil enthält, nicht mehr skalieren als der parallele Teil dividiert durch die Anzahl der Kerne, gemäß Amdahl's law.

Ohne konkreten Code kann ich an keinen anderen Ratschlag denken.

+0

Der kritische Abschnitt basiert nur auf der OpenGL-Ausgabe. Alle Berechnungen liegen außerhalb dieser Abschnitte und sollten daher einen spürbaren Unterschied machen. – RobotRock

+0

@Kaj Toet: Irgendwelche andere Synchronisation innerhalb der Funktionen, die Sie in der 'run' Methode aufrufen? Machst du eine Menge Speicheroperationen? – Tudor

+0

Nein, nicht viele Speicheroperationen.Aber ich rufe mit jedem Thread das gleiche Objekt an, also frage ich mich, ob das sein könnte? (Natürlich nicht schreiben) – RobotRock

Verwandte Themen