#include <stdio.h>
#include <arrayfire.h>
using namespace af;
static array image;
static float h_dx[] = {1/12, -8/12, 0, 8/12, -1/12};
static float h_spread[] = {1/5, 1/5, 1/5, 1/5, 1/5};
static array dx, spread, kernel;
static array full_out, dsep_out, hsep_out;
static void full() { full_out = convolve(image, kernel, afConvSame); }
static void dsep() { dsep_out = convolve(dx, spread, image, afConvSame); }
static void hsep() { hsep_out = convolve(5,h_dx, 5,h_spread, image, afConvSame); }
int main(int argc, char **argv)
{
try {
image = randu(640,480);
dx = array(5,1,h_dx);
spread = array(1,5,h_spread);
kernel = dx * spread;
printf("full 2D convolution: %g seconds\n", timeit(full));
printf("separable, device pointers: %g seconds\n", timeit(dsep));
printf("separable, host pointers: %g seconds\n", timeit(hsep));
if (!alltrue<bool>(full_out == dsep_out)) throw af::exception("full != dsep");
if (!alltrue<bool>(full_out == hsep_out)) throw af::exception("full != hsep");
if (!alltrue<bool>(dsep_out == hsep_out)) throw af::exception("dsep != hsep");
} catch (af::exception &e) {
fprintf(stderr, "%s\n", e.what());
}
#ifdef WIN32 // pause in Windows
if (!(argc == 2 && argv[1][0] == '-')) {
printf("hit [enter]...");
getchar();
}
#endif
return 0;
}