My Project
Timing Your Code

timer() : A platform-independent timer with microsecond accuracy:

Example: single timer

// start timer
timer::start();
// run your code
printf("elapsed seconds: %g\n", timer::stop());

Example: multiple timers

// start timers
timer start1 = timer::start();
timer start2 = timer::start();
// run some code
printf("elapsed seconds: %g\n", timer::stop(start1));
// run more code
printf("elapsed seconds: %g\n", timer::stop(start2));

Accurate and reliable measurement of performance involves several factors:

  • Executing enough iterations to achieve peak performance.
  • Executing enough repetitions to amortize any overhead from system timers.

To take care of much of this boilerplate, timeit provides accurate and reliable estimates of both CPU or GPU code.

Here`s a stripped down example of Monte-Carlo estimation of PI making use of timeit. Notice how it expects a void function pointer.

#include <stdio.h>
#include <arrayfire.h>
using namespace af;
void pi_function() {
int n = 20e6; // 20 million random samples
array x = randu(n,f32), y = randu(n,f32);
// how many fell inside unit circle?
float pi = 4.0 * sum<float>(sqrt(x*x + y*y)) < 1) / n;
}
int main() {
printf("pi_function took %g seconds\n", timeit(pi_function));
return 0;
}

This produces:

pi_function took 0.007252 seconds
(test machine: Core i7 920 @ 2.67GHz with a Tesla C2070)
af::array
A multi dimensional data container.
Definition: array.h:32
af
Definition: algorithm.h:13
af::timeit
AFAPI double timeit(void(*fn)())
af::randu
AFAPI array randu(const dim4 &dims, const dtype ty=f32)
af::sqrt
AFAPI array sqrt(const array &in)
C++ Interface for square root of input.
arrayfire.h
af::timer
struct af::timer timer
Internal timer object.
f32
32-bit floating point values
Definition: defines.h:195