2016-05-07 12 views
-2

私は行列 - ベクトル乗算のために次のコードを持っている:これはプログラムの出力であるため、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()を使用する必要があります。私はpthreadMatrix Mtranspose2025細胞がありません。

+0

最小、完全、および検証可能な例を作成するために少しでも努力してください。このケースでは難しくありません:http://stackoverflow.com/help/mcve – zeromus

+0

はい、スレッドを作成するのは一般的に非常に高価です。 – Stefan

+0

タイミングが正確ではありません。あなたは2つのことをタイムアウトしています。 1)スレッドの作成に要する時間と2)メインスレッドが2重にネストされたループを実行する時間。スレッドを作成しただけですぐに実行が開始されるわけではありません。実行可能なコアがあるまで待機する必要があります。上記のコードでは、メインスレッドが実行を開始する前にコアを放棄するのを待っています。 –

答えて

4

これは尋ねるの本当に複雑な方法である:のCreateThreadは私のコードの実行を開始するために247マイクロ秒を取るため

それは正常ですか?

答えは「はい」です。恐らく正常です。スレッドを作成するのに0.015625ミリ秒かかっています。これは15マイクロ秒です:How long does thread creation and termination take under Windows?あなたの時間よりは速いが、瞬間的ではありません。

スレッドを早く開始する必要がある場合は、スレッドプールを使用してスレッドを先に開始する必要があります。

+0

お返事ありがとうございます。私はマルチスレッドの経験がないと思っています。これは私のコードを高速化するのに役立ちます。 –