From 892f622484b7f7adc3f8cc162c4dc3a664054ce3 Mon Sep 17 00:00:00 2001 From: Shehzan Mohammed Date: Fri, 4 Nov 2016 16:05:27 -0400 Subject: [PATCH] TESTS: Split scan into scan and scan by key files --- test/scan.cpp | 180 ------------------------------------- test/scan_by_key.cpp | 207 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 207 insertions(+), 180 deletions(-) create mode 100644 test/scan_by_key.cpp diff --git a/test/scan.cpp b/test/scan.cpp index 3d0c885f2a..e69b6464c1 100644 --- a/test/scan.cpp +++ b/test/scan.cpp @@ -17,7 +17,6 @@ #include #include #include -#include "binary_ops.hpp" #include using std::vector; @@ -84,185 +83,6 @@ void scanTest(string pTestFile, int off = 0, bool isSubRef=false, const vector -std::vector createScanKey(af::dim4 dims, int scanDim, - const std::vector &nodeLengths, - T keyStart, T keyEnd) -{ - std::srand(0); - int elemCount = dims.elements(); - std::vector key(elemCount); - - int stride = 1; - for (int i = 0; i < scanDim; ++i) { stride *= dims[i]; } - - for (int start = 0; start < stride; ++start) { - T keyval = (T)(0); - for (int index = start, i = 0; - index < elemCount; - index += stride, i = (i+1)%dims[scanDim]) { - bool isNode = false; - for (unsigned n = 0; n < nodeLengths.size(); ++n) { - if (i % nodeLengths[n] == 0) { - isNode = true; - } - } - if (isNode && (std::rand()%2)) { - keyval = randomInterval(keyStart, keyEnd); - } - key[index] = keyval; - } - } - return key; -} - -template -std::vector createScanData(af::dim4 dims, T dataStart, T dataEnd) -{ - int elemCount = dims.elements(); - std::vector in(elemCount); - for (int i = 0; i < elemCount; ++i) { - in[i] = randomInterval(dataStart, dataEnd); - } - return in; -} - -template -void verify(af::dim4 dims, - const std::vector &in, - const std::vector &key, - const std::vector &out, - int scanDim, double eps) -{ - std::srand(1); - Binary binOp; - int elemCount = dims.elements(); - - int stride = 1; - for (int i = 0; i < scanDim; ++i) { stride *= dims[i]; } - - for (int start = 0; start < stride; ++start) { - Tk keyval = key[start]; - To gold = binOp.init(); - for (int index = start + (!inclusive_scan)*stride, i = (!inclusive_scan); - index < elemCount; - index += stride, i = (i+1)%dims[scanDim]) { - if ((key[index] != keyval) || (i == 0)) { - keyval = key[index]; - if (inclusive_scan) { - gold = (To)in[index]; - ASSERT_NEAR(gold, out[index], eps); - } else { - gold = binOp.init(); - } - } else { - To dataval = (To)in[index - (!inclusive_scan)*stride]; - gold = binOp(gold, dataval); - ASSERT_NEAR(gold, out[index], eps); - } - } - } -} - -template -void scanByKeyTest(af::dim4 dims, int scanDim, std::vector nodeLengths, - int keyStart, int keyEnd, Ti dataStart, Ti dataEnd, double eps) -{ - std::vector key = createScanKey(dims, scanDim, nodeLengths, keyStart, keyEnd); - std::vector in = createScanData(dims, dataStart, dataEnd); - - af::array afkey(dims, key.data()); - af::array afin(dims, in.data()); - af::array afout = af::scanByKey(afkey, afin, scanDim, op, inclusive_scan); - std::vector out(afout.elements()); - afout.host(out.data()); - - verify(dims, in, key, out, scanDim, eps); -} - -#define SCAN_BY_KEY_TEST(FN, X, Y, Z, W, Ti, To, INC, DIM, DSTART, DEND, EPS) \ -TEST(ScanByKey,Test_Scan_By_Key_##FN##_##Ti##_##INC##_##DIM) \ -{ \ - af::dim4 dims(X, Y, Z, W); \ - int scanDim = DIM; \ - int nodel[] = {37, 256}; \ - std::vector nodeLengths(nodel, nodel+sizeof(nodel)/sizeof(int)); \ - int keyStart = 0; \ - int keyEnd = 15; \ - int dataStart = DSTART; \ - int dataEnd = DEND; \ - scanByKeyTest(dims, scanDim, nodeLengths, \ - keyStart, keyEnd, dataStart, dataEnd, EPS); \ -} - -SCAN_BY_KEY_TEST(AF_BINARY_ADD, 16*1024, 1024, 1, 1, int, int, true, 0, -15, 15, 1e-3); -SCAN_BY_KEY_TEST(AF_BINARY_ADD, 16*1024, 1024, 1, 1, int, int, false, 0, -15, 15, 1e-3); -SCAN_BY_KEY_TEST(AF_BINARY_ADD, 16*1024, 1024, 1, 1, float, float, true, 0, -5.0, 5.0, 1e-3); -SCAN_BY_KEY_TEST(AF_BINARY_ADD, 16*1024, 1024, 1, 1, float, float, false, 0, -5.0, 5.0, 1e-3); - -SCAN_BY_KEY_TEST(AF_BINARY_MIN, 16*1024, 1024, 1, 1, int, int, true, 0, -15, 15, 1e-3); -SCAN_BY_KEY_TEST(AF_BINARY_MIN, 16*1024, 1024, 1, 1, int, int, false, 0, -15, 15, 1e-3); -SCAN_BY_KEY_TEST(AF_BINARY_MIN, 16*1024, 1024, 1, 1, float, float, true, 0, -5.0, 5.0, 1e-3); -SCAN_BY_KEY_TEST(AF_BINARY_MIN, 16*1024, 1024, 1, 1, float, float, false, 0, -5.0, 5.0, 1e-3); - -SCAN_BY_KEY_TEST(AF_BINARY_MAX, 16*1024, 1024, 1, 1, int, int, true, 0, -15, 15, 1e-3); -SCAN_BY_KEY_TEST(AF_BINARY_MAX, 16*1024, 1024, 1, 1, int, int, false, 0, -15, 15, 1e-3); -SCAN_BY_KEY_TEST(AF_BINARY_MAX, 16*1024, 1024, 1, 1, float, float, true, 0, -5.0, 5.0, 1e-3); -SCAN_BY_KEY_TEST(AF_BINARY_MAX, 16*1024, 1024, 1, 1, float, float, false, 0, -5.0, 5.0, 1e-3); - -SCAN_BY_KEY_TEST(AF_BINARY_ADD, 4*1024, 512, 1, 1, int, int, true, 1, -15, 15, 1e-3); -SCAN_BY_KEY_TEST(AF_BINARY_ADD, 4*1024, 512, 1, 1, int, int, false, 1, -15, 15, 1e-3); -SCAN_BY_KEY_TEST(AF_BINARY_ADD, 4*1024, 512, 1, 1, float, float, true, 1, -5, 5, 1e-3); -SCAN_BY_KEY_TEST(AF_BINARY_ADD, 4*1024, 512, 1, 1, float, float, false, 1, -5, 5, 1e-3); - -SCAN_BY_KEY_TEST(AF_BINARY_MIN, 4*1024, 512, 1, 1, int, int, true, 1, -15, 15, 1e-3); -SCAN_BY_KEY_TEST(AF_BINARY_MIN, 4*1024, 512, 1, 1, int, int, false, 1, -15, 15, 1e-3); -SCAN_BY_KEY_TEST(AF_BINARY_MIN, 4*1024, 512, 1, 1, float, float, true, 1, -5, 5, 1e-3); -SCAN_BY_KEY_TEST(AF_BINARY_MIN, 4*1024, 512, 1, 1, float, float, false, 1, -5, 5, 1e-3); - -SCAN_BY_KEY_TEST(AF_BINARY_MAX, 4*1024, 512, 1, 1, int, int, true, 1, -15, 15, 1e-3); -SCAN_BY_KEY_TEST(AF_BINARY_MAX, 4*1024, 512, 1, 1, int, int, false, 1, -15, 15, 1e-3); -SCAN_BY_KEY_TEST(AF_BINARY_MAX, 4*1024, 512, 1, 1, float, float, true, 1, -5, 5, 1e-3); -SCAN_BY_KEY_TEST(AF_BINARY_MAX, 4*1024, 512, 1, 1, float, float, false, 1, -5, 5, 1e-3); - -TEST(ScanByKey,Test_Scan_By_key_Simple_0) -{ - af::dim4 dims(16, 8, 2, 1); - int scanDim = 0; - int nodel[] = {4, 8}; - std::vector nodeLengths(nodel, nodel+sizeof(nodel)/sizeof(int)); - int keyStart = 0; - int keyEnd = 15; - int dataStart = 2; - int dataEnd = 4; - scanByKeyTest(dims, scanDim, nodeLengths, - keyStart, keyEnd, dataStart, dataEnd, 1e-5); -} - -TEST(ScanByKey,Test_Scan_By_key_Simple_1) -{ - af::dim4 dims(8, 256+128, 1, 1); - int scanDim = 1; - int nodel[] = {4, 8}; - std::vector nodeLengths(nodel, nodel+sizeof(nodel)/sizeof(int)); - int keyStart = 0; - int keyEnd = 15; - int dataStart = 2; - int dataEnd = 4; - scanByKeyTest(dims, scanDim, nodeLengths, - keyStart, keyEnd, dataStart, dataEnd, 1e-5); -} - #define SCAN_TESTS(FN, TAG, Ti, To) \ TEST(Scan,Test_##FN##_##TAG) \ { \ diff --git a/test/scan_by_key.cpp b/test/scan_by_key.cpp new file mode 100644 index 0000000000..91149bdd99 --- /dev/null +++ b/test/scan_by_key.cpp @@ -0,0 +1,207 @@ +/******************************************************* + * Copyright (c) 2014, ArrayFire + * All rights reserved. + * + * This file is distributed under 3-clause BSD license. + * The complete license agreement can be obtained at: + * http://arrayfire.com/licenses/BSD-3-Clause + ********************************************************/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "binary_ops.hpp" +#include + +using std::vector; +using std::string; +using std::cout; +using std::endl; +using af::cfloat; +using af::cdouble; + +float randomInterval(float start, float end) +{ + return start + (end - start)*(std::rand()/float(RAND_MAX)); +} + +int randomInterval(int start, int end) +{ + return start + std::rand()%(end - start); +} + +template +std::vector createScanKey(af::dim4 dims, int scanDim, + const std::vector &nodeLengths, + T keyStart, T keyEnd) +{ + std::srand(0); + int elemCount = dims.elements(); + std::vector key(elemCount); + + int stride = 1; + for (int i = 0; i < scanDim; ++i) { stride *= dims[i]; } + + for (int start = 0; start < stride; ++start) { + T keyval = (T)(0); + for (int index = start, i = 0; + index < elemCount; + index += stride, i = (i+1)%dims[scanDim]) { + bool isNode = false; + for (unsigned n = 0; n < nodeLengths.size(); ++n) { + if (i % nodeLengths[n] == 0) { + isNode = true; + } + } + if (isNode && (std::rand()%2)) { + keyval = randomInterval(keyStart, keyEnd); + } + key[index] = keyval; + } + } + return key; +} + +template +std::vector createScanData(af::dim4 dims, T dataStart, T dataEnd) +{ + int elemCount = dims.elements(); + std::vector in(elemCount); + for (int i = 0; i < elemCount; ++i) { + in[i] = randomInterval(dataStart, dataEnd); + } + return in; +} + +template +void verify(af::dim4 dims, + const std::vector &in, + const std::vector &key, + const std::vector &out, + int scanDim, double eps) +{ + std::srand(1); + Binary binOp; + int elemCount = dims.elements(); + + int stride = 1; + for (int i = 0; i < scanDim; ++i) { stride *= dims[i]; } + + for (int start = 0; start < stride; ++start) { + Tk keyval = key[start]; + To gold = binOp.init(); + for (int index = start + (!inclusive_scan)*stride, i = (!inclusive_scan); + index < elemCount; + index += stride, i = (i+1)%dims[scanDim]) { + if ((key[index] != keyval) || (i == 0)) { + keyval = key[index]; + if (inclusive_scan) { + gold = (To)in[index]; + ASSERT_NEAR(gold, out[index], eps); + } else { + gold = binOp.init(); + } + } else { + To dataval = (To)in[index - (!inclusive_scan)*stride]; + gold = binOp(gold, dataval); + ASSERT_NEAR(gold, out[index], eps); + } + } + } +} + +template +void scanByKeyTest(af::dim4 dims, int scanDim, std::vector nodeLengths, + int keyStart, int keyEnd, Ti dataStart, Ti dataEnd, double eps) +{ + std::vector key = createScanKey(dims, scanDim, nodeLengths, keyStart, keyEnd); + std::vector in = createScanData(dims, dataStart, dataEnd); + + af::array afkey(dims, key.data()); + af::array afin(dims, in.data()); + af::array afout = af::scanByKey(afkey, afin, scanDim, op, inclusive_scan); + std::vector out(afout.elements()); + afout.host(out.data()); + + verify(dims, in, key, out, scanDim, eps); +} + +#define SCAN_BY_KEY_TEST(FN, X, Y, Z, W, Ti, To, INC, DIM, DSTART, DEND, EPS) \ +TEST(ScanByKey,Test_Scan_By_Key_##FN##_##Ti##_##INC##_##DIM) \ +{ \ + af::dim4 dims(X, Y, Z, W); \ + int scanDim = DIM; \ + int nodel[] = {37, 256}; \ + std::vector nodeLengths(nodel, nodel+sizeof(nodel)/sizeof(int)); \ + int keyStart = 0; \ + int keyEnd = 15; \ + int dataStart = DSTART; \ + int dataEnd = DEND; \ + scanByKeyTest(dims, scanDim, nodeLengths, \ + keyStart, keyEnd, dataStart, dataEnd, EPS); \ +} + +SCAN_BY_KEY_TEST(AF_BINARY_ADD, 16*1024, 1024, 1, 1, int, int, true, 0, -15, 15, 1e-3); +SCAN_BY_KEY_TEST(AF_BINARY_ADD, 16*1024, 1024, 1, 1, int, int, false, 0, -15, 15, 1e-3); +SCAN_BY_KEY_TEST(AF_BINARY_ADD, 16*1024, 1024, 1, 1, float, float, true, 0, -5.0, 5.0, 1e-3); +SCAN_BY_KEY_TEST(AF_BINARY_ADD, 16*1024, 1024, 1, 1, float, float, false, 0, -5.0, 5.0, 1e-3); + +SCAN_BY_KEY_TEST(AF_BINARY_MIN, 16*1024, 1024, 1, 1, int, int, true, 0, -15, 15, 1e-3); +SCAN_BY_KEY_TEST(AF_BINARY_MIN, 16*1024, 1024, 1, 1, int, int, false, 0, -15, 15, 1e-3); +SCAN_BY_KEY_TEST(AF_BINARY_MIN, 16*1024, 1024, 1, 1, float, float, true, 0, -5.0, 5.0, 1e-3); +SCAN_BY_KEY_TEST(AF_BINARY_MIN, 16*1024, 1024, 1, 1, float, float, false, 0, -5.0, 5.0, 1e-3); + +SCAN_BY_KEY_TEST(AF_BINARY_MAX, 16*1024, 1024, 1, 1, int, int, true, 0, -15, 15, 1e-3); +SCAN_BY_KEY_TEST(AF_BINARY_MAX, 16*1024, 1024, 1, 1, int, int, false, 0, -15, 15, 1e-3); +SCAN_BY_KEY_TEST(AF_BINARY_MAX, 16*1024, 1024, 1, 1, float, float, true, 0, -5.0, 5.0, 1e-3); +SCAN_BY_KEY_TEST(AF_BINARY_MAX, 16*1024, 1024, 1, 1, float, float, false, 0, -5.0, 5.0, 1e-3); + +SCAN_BY_KEY_TEST(AF_BINARY_ADD, 4*1024, 512, 1, 1, int, int, true, 1, -15, 15, 1e-3); +SCAN_BY_KEY_TEST(AF_BINARY_ADD, 4*1024, 512, 1, 1, int, int, false, 1, -15, 15, 1e-3); +SCAN_BY_KEY_TEST(AF_BINARY_ADD, 4*1024, 512, 1, 1, float, float, true, 1, -5, 5, 1e-3); +SCAN_BY_KEY_TEST(AF_BINARY_ADD, 4*1024, 512, 1, 1, float, float, false, 1, -5, 5, 1e-3); + +SCAN_BY_KEY_TEST(AF_BINARY_MIN, 4*1024, 512, 1, 1, int, int, true, 1, -15, 15, 1e-3); +SCAN_BY_KEY_TEST(AF_BINARY_MIN, 4*1024, 512, 1, 1, int, int, false, 1, -15, 15, 1e-3); +SCAN_BY_KEY_TEST(AF_BINARY_MIN, 4*1024, 512, 1, 1, float, float, true, 1, -5, 5, 1e-3); +SCAN_BY_KEY_TEST(AF_BINARY_MIN, 4*1024, 512, 1, 1, float, float, false, 1, -5, 5, 1e-3); + +SCAN_BY_KEY_TEST(AF_BINARY_MAX, 4*1024, 512, 1, 1, int, int, true, 1, -15, 15, 1e-3); +SCAN_BY_KEY_TEST(AF_BINARY_MAX, 4*1024, 512, 1, 1, int, int, false, 1, -15, 15, 1e-3); +SCAN_BY_KEY_TEST(AF_BINARY_MAX, 4*1024, 512, 1, 1, float, float, true, 1, -5, 5, 1e-3); +SCAN_BY_KEY_TEST(AF_BINARY_MAX, 4*1024, 512, 1, 1, float, float, false, 1, -5, 5, 1e-3); + +TEST(ScanByKey,Test_Scan_By_key_Simple_0) +{ + af::dim4 dims(16, 8, 2, 1); + int scanDim = 0; + int nodel[] = {4, 8}; + std::vector nodeLengths(nodel, nodel+sizeof(nodel)/sizeof(int)); + int keyStart = 0; + int keyEnd = 15; + int dataStart = 2; + int dataEnd = 4; + scanByKeyTest(dims, scanDim, nodeLengths, + keyStart, keyEnd, dataStart, dataEnd, 1e-5); +} + +TEST(ScanByKey,Test_Scan_By_key_Simple_1) +{ + af::dim4 dims(8, 256+128, 1, 1); + int scanDim = 1; + int nodel[] = {4, 8}; + std::vector nodeLengths(nodel, nodel+sizeof(nodel)/sizeof(int)); + int keyStart = 0; + int keyEnd = 15; + int dataStart = 2; + int dataEnd = 4; + scanByKeyTest(dims, scanDim, nodeLengths, + keyStart, keyEnd, dataStart, dataEnd, 1e-5); +}