2016-05-07 11 views
-2

Ich habe den folgenden Code für Matrix-Vektor-Multiplikation:CreateThread() zu langsam?

std::chrono::steady_clock::time_point start, end2; 
void fillMatrixConditions(LPVOID lpv) { 
    end2 = std::chrono::steady_clock::now(); 
    std::cout << "Time difference = " << std::chrono::duration_cast<std::chrono::microseconds>(end2 - start).count() << std::endl; 
    std::cout << "Time difference = " << std::chrono::duration_cast<std::chrono::nanoseconds> (end2 - start).count() << std::endl; 
    int i, j = horizontControl; 
    for (i = 0; i < horizontControl; i++, j++) { 
     b[i] = akcni - uMin; 
     b[j] = uMax - akcni; 
    } 
    j = 2 * horizontControl + N - N1 + 1; 
    int k = 0; 
    for (i = 2 * i; i < (2 * horizontControl + N - N1 + 1); i++, j++, k++) { 
     b[i] = MpDup[k] - yMin; 
     b[j] = yMax - MpDup[k]; 
    }; 
    RtPrintf("Thread"); 
} 

int _tmain(int argc, _TCHAR * argv[]) 
{ 
    HANDLE hThread; 
    DWORD id; 
    int k = 0; 
    double temp; 
    double g[50];  
    for (int j = 0; j < N - N1 + 1; j++) 
    { 
     temp = 0; 
     for (int m = 0; m < horizontPrediction - 1; m++, k++) 
     { 
      temp = temp + Mp[k] * dup[m]; 
     } 
     MpDup[j] = temp; 
     tempMatrix[j] = setPoint - y - temp; 
    } 
    start = std::chrono::steady_clock::now(); 
    hThread = CreateThread(NULL, NULL, (LPTHREAD_START_ROUTINE)fillMatrixConditions, NULL, NULL, &id);  
    k = 0; 
    for (int j = 0; j < horizontControl; j++) 
    { 
     temp = 0; 
     for (int m = 0; m < N - N1 + 1; m++, k++) 
     { 
      temp = temp + Mtranspose[k] * tempMatrix[m]; 
     } 
     g[j] = -2 * temp; 
    } 
    RtPrintf("Point\n");  
    WaitForSingleObject(hThread, INFINITE); 
    CloseHandle(hThread); 
    return 0; 
} 

Aber CreateThread() ist zu langsam, denn dies ist die Ausgabe des Programms ist:

Point 
Time difference = 247 
Time difference = 247261 

ich das erste, was gedacht, geschrieben werden würde der Time difference in Thread und dann "Point" sein. Oder ist diese Ausgabe normal? Ich muss CreateThread() verwenden. Ich kann nicht pthread usw. Matrix Mtranspose hat 2025 Zellen.

+0

Bemühen Sie sich, ein minimales, vollständiges und überprüfbares Beispiel zu erstellen. Es wäre nicht schwer in diesem Fall: http://StackOverflow.com/Help/Mcve – zeromus

+0

Ja, Erstellen von Threads im Allgemeinen ist ziemlich teuer. – Stefan

+0

Ihr Timing stimmt nicht. Du tötest zwei Dinge. 1) wie lange es dauert, um den Thread zu erstellen und 2) wie lange der Haupt-Thread benötigt, um eine doppelt verschachtelte Schleife auszuführen. Nur weil Sie einen Thread erstellen, heißt das nicht, dass er sofort ausgeführt wird. Es muss warten, bis ein Core zur Ausführung verfügbar ist. Im obigen Code wartet er darauf, dass der Haupt-Thread den Kern abgibt, bevor er überhaupt ausgeführt wird. –

Antwort

4

Dies ist nur eine wirklich komplizierte Art und Weise zu fragen:

Ist es für normale 247 Mikrosekunden Create nutzen, um meinen Code zu starten Ausführung?

Und die Antwort ist ja, wahrscheinlich ist es normal. Hier ist eine Frage und Antwort zu diesem Thema, die besagt, dass es 0,015625 Millisekunden dauerte, um einen Thread zu erstellen, der 15 Mikrosekunden ist: How long does thread creation and termination take under Windows? Schneller als Ihre Zeit, aber nicht sofort.

Wenn Sie Threads benötigen, um schneller zu starten, sollten Sie einen Thread-Pool verwenden und die Threads vorzeitig starten.

+0

Okay danke für die Antwort. Ich habe keine Erfahrung mit Multithreading und ich dachte, das kann mir helfen, meinen Code zu beschleunigen. –