ArrayFire: benchmarks/pi.cpp (original) (raw)

#include <math.h>

#include <stdio.h>

#include

using namespace af;

static int samples = 20e6;

static double pi_device() {

array x = randu(samples, f32), y = randu(samples, f32);

return 4.0 * sum(sqrt(x * x + y * y) < 1) / samples;

}

static double pi_host() {

int count = 0;

for (int i = 0; i < samples; ++i) {

float x = float(rand()) / float(RAND_MAX);

float y = float(rand()) / float(RAND_MAX);

if (sqrt(x * x + y * y) < 1) count++;

}

return 4.0 * count / samples;

}

static void device_wrapper() { pi_device(); }

static void host_wrapper() { pi_host(); }

int main(int argc, char** argv) {

try {

int device = argc > 1 ? atoi(argv[1]) : 0;

printf("device: %.5f seconds to estimate pi = %.5f\n",

timeit(device_wrapper), pi_device());

printf(" host: %.5f seconds to estimate pi = %.5f\n",

timeit(host_wrapper), pi_host());

fprintf(stderr, "%s\n", e.what());

throw;

}

return 0;

}

A multi dimensional data container.

An ArrayFire exception class.

virtual const char * what() const

Returns an error message for the exception in a string format.

@ f32

32-bit floating point values

AFAPI void setDevice(const int device)

Sets the current device.

AFAPI array count(const array &in, const int dim=-1)

C++ Interface to count non-zero values in an array along a given dimension.

AFAPI double timeit(void(*fn)())