1

Windowsのスレッド間のコンテキストスイッチの時間とCPUサイクルを測定できるメソッドを実装する必要があります。

これが私のコードです

#include <stdio.h>
#include <windows.h>
#include <time.h>

LARGE_INTEGER initialTimeStamp, finalTimeStamp, freq;

DWORD ThreadProc(LPVOID lpdwThreadParam)
{
 SwitchToThread();
 return 0;
}

int main()
{
  int result;
  HANDLE hThread;
  QueryPerformanceFrequency(&freq);
  hThread = CreateThread(NULL,0, (LPTHREAD_START_ROUTINE)ThreadProc,NULL, 0, 0);

  QueryPerformanceCounter(&initialTimeStamp);
  SwitchToThread();
  QueryPerformanceCounter(&finalTimeStamp);

  result = (1000000 * ((finalTimeStamp.QuadPart - initialTimeStamp.QuadPart) / 2 ) / freq.QuadPart);
  printf("Windows Thread - context switch time is %u ns\n", result);  

  WaitForSingleObject(hThread, INFINITE);
  return 0;
}

注:2で割るのは、initialTimeStampとfinalTimeStampの間に2つのコンテキストスイッチがあるためです。

これが最善の方法なのか正しい方法なのかわかりません...実行ごとに異なる時間が発生しますが、これは私が期待していたことではありません。CPUサイクル数を取得する方法がわかりません。

4

2 に答える 2

3

SwitchToThread()で実際にコンテキストスイッチを作成するには、CPUサイクルを消費しているスレッドが実際に必要になります。CPUに複数のコアがある場合は複数。それでも、得られる結果はほとんど意味がありません。オーバーヘッドの量は、クォンタムを取得するスレッドを所有するプロセスとTLBキャッシュの状態によって大きく異なります。TLBレジスタをリロードしてキャッシュミスを取得すると、多くの時間が追加されます。スローされる通常の数は、2,000〜10,000サイクルです。

于 2010-09-27T14:27:53.627 に答える
1

コンピュータのパフォーマンスは非常に変動するため、時間は異なります。

于 2010-09-27T14:26:04.390 に答える