Howdy ho! My name is Simon Wybranski, I am a developer on the C++ AMP team!
In this blog post I am going to present a high-resolution timer for measuring the performance of C++ AMP algorithms. There is nothing specific in it to C++ AMP, so it can be used to measure elapsed time of your PPL algorithms or any other C++ code.
Listing of timer.h:
1: #pragma once
2: #include <windows.h>
3:
4: struct Timer
5: {
6: void Start()
7: {
8: QueryPerformanceCounter(&m_start);
9: }
10:
11: void Stop()
12: {
13: QueryPerformanceCounter(&m_stop);
14: }
15:
16: // Returns elapsed time in milliseconds (ms)
17: double Elapsed()
18: {
19: return (m_stop.QuadPart - m_start.QuadPart - m_overhead) \
20: * 1000.0 / m_freq.QuadPart;
21: }
22:
23: private:
24:
25: // Returns the overhead of the timer in ticks
26: static LONGLONG GetOverhead()
27: {
28: Timer t;
29: t.Start();
30: t.Stop();
31: return t.m_stop.QuadPart - t.m_start.QuadPart;
32: }
33:
34: LARGE_INTEGER m_start;
35: LARGE_INTEGER m_stop;
36: static LARGE_INTEGER m_freq;
37: static LONGLONG m_overhead;
38: };
Listing of timer.cpp:
1: #include "timer.h"
2:
3: // Initialize the resolution of the timer
4: LARGE_INTEGER Timer::m_freq = \
5: (QueryPerformanceFrequency(&Timer::m_freq), Timer::m_freq);
6:
7: // Calculate the overhead of the timer
8: LONGLONG Timer::m_overhead = Timer::GetOverhead();
Snippet showing the usage:
1: Timer t;
2: t.Start();
3: // Your algorithm goes here
4: t.Stop();
5:
6: std::cout << t.Elapsed() << " ms" << std::endl;
Enjoy!!