私は行列 - ベクトル乗算のために次のコードを持っている:これはプログラムの出力であるため、CreateThread()が遅すぎますか?
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;
}
しかしCreateThread()
は、遅すぎる:
Point
Time difference = 247
Time difference = 247261
私は書くことが最初にすることを考えましたスレッド内でTime difference
になり、次に「ポイント」になる予定でした。または、この出力は正常ですか? CreateThread()
を使用する必要があります。私はpthread
等Matrix Mtranspose
は2025
細胞がありません。
最小、完全、および検証可能な例を作成するために少しでも努力してください。このケースでは難しくありません:http://stackoverflow.com/help/mcve – zeromus
はい、スレッドを作成するのは一般的に非常に高価です。 – Stefan
タイミングが正確ではありません。あなたは2つのことをタイムアウトしています。 1)スレッドの作成に要する時間と2)メインスレッドが2重にネストされたループを実行する時間。スレッドを作成しただけですぐに実行が開始されるわけではありません。実行可能なコアがあるまで待機する必要があります。上記のコードでは、メインスレッドが実行を開始する前にコアを放棄するのを待っています。 –