スレッド化でマルチコアCPUの力を知る

最近のPCなら普通コア2なCPUが載っています。
スレッド分ければ分散されて高速になるんだね。
シングルコアCPUだと逆に遅くなるはず。

ネタ元

VC++2008では上記URLにあるサンプルまんまではコンパイルエラーだったので以下のようにした。

#include "stdafx.h"

#include <algorithm>
#include <utility>
#include <cstdlib>
#include <process.h>
#include <windows.h>
#include <iostream>

unsigned __stdcall process(void* pvParam) {
  std::pair<int*,int*>* range = (std::pair<int*,int*>*)pvParam;
  std::sort(range->first, range->second);
  return 0;
}
int _tmain(int argc, _TCHAR* argv[])
{
  const int N = 200000;
  const int N2 = N*2;
  int *data = new int[N2];

  // 地味に単スレッド
  {
	  srand(1);
	  for ( int i = 0; i < N2; ++i ) data[i] = std::rand();
		  // data[0..N2] をソート
		  std::cout << "single thread ..." << std::flush;
		  long t = GetTickCount();
		  std::sort(data, data+N2);
		  std::cout << GetTickCount() - t << std::endl;
	  }

  // 派手に複スレッド
  {
	  srand(1);
	  for ( int i = 0; i < N2; ++i ){
		data[i] = std::rand();
	  }
	  std::pair<int*,int*> firstHalf(data,data+N);
	  std::pair<int*,int*> secondHalf(data+N,data+N2);
	  DWORD thID;
	  HANDLE hThreads[2];
	  std::cout << "dual threads ..." << std::flush;
	  long t = GetTickCount();
	  // data[0..N]とdata[N..N2] を並行してソート
	  hThreads[0] = (HANDLE)_beginthreadex(0, 0, &process, &firstHalf,  0, (unsigned*)&thID);
	  hThreads[1] = (HANDLE)_beginthreadex(0, 0, &process, &secondHalf, 0, (unsigned*)&thID);
	  WaitForMultipleObjects(2, hThreads, TRUE, INFINITE);
	  // 前半と後半をマージ
	  std::inplace_merge(data, data+N, data+N2);
	  std::cout << GetTickCount() - t << std::endl;
	  CloseHandle( hThreads[0] );
	  CloseHandle( hThreads[1] );
  }

  delete[] data;
  
  return 0;
}