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.
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
Ja, Erstellen von Threads im Allgemeinen ist ziemlich teuer. – Stefan
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. –