TEST(Join, JoinLargeDim) { using af::constant; using af::deviceGC; using af::span; // const int nx = 32; const int nx = 1; const int ny = 4 * 1024 * 1024; const int nw = 4 * 1024 * 1024; deviceGC(); { array in = randu(nx, ny, u8); array joined = join(0, in, in); dim4 in_dims = in.dims(); dim4 joined_dims = joined.dims(); ASSERT_EQ(2 * in_dims[0], joined_dims[0]); ASSERT_EQ(0.f, sum<float>((joined(0, span) - joined(1, span)).as(f32))); array in2 = constant(1, (dim_t)nx, (dim_t)ny, (dim_t)2, (dim_t)nw, u8); joined = join(3, in, in); in_dims = in.dims(); joined_dims = joined.dims(); ASSERT_EQ(2 * in_dims[3], joined_dims[3]); } }
TEST(JIT, CPP_JIT_HASH) { const int num = 20; const float valA = 3; const float valB = 5; const float valC = 2; const float valD = valA + valB; const float valE = valA + valC; const float valF1 = valD * valE - valE; const float valF2 = valD * valE - valD; array a = constant(valA, num); array b = constant(valB, num); array c = constant(valC, num); eval(a); eval(b); eval(c); // Creating a kernel { array d = a + b; array e = a + c; array f1 = d * e - e; float *hF1 = f1.host<float>(); for (int i = 0; i < num; i++) { ASSERT_EQ(hF1[i], valF1); } freeHost(hF1); } // Making sure a different kernel is generated { array d = a + b; array e = a + c; array f2 = d * e - d; float *hF2 = f2.host<float>(); for (int i = 0; i < num; i++) { ASSERT_EQ(hF2[i], valF2); } freeHost(hF2); } }
TEST(JIT, LinearLarge) { // Needs to be larger than 65535 * 256 (or 1 << 24) float v1 = std::rand() % 100; float v2 = std::rand() % 100; array a = constant(v1, 1 << 25); array b = constant(v2, 1 << 25); array c = (a + b) * (a - b); eval(c); float v3 = (v1 + v2) * (v1 - v2); vector<float> hc(c.elements()); c.host(hc.data()); for (size_t i = 0; i < hc.size(); i++) { ASSERT_EQ(hc[i], v3); } }
TEST(JIT, CPP_JIT_Reset_Unary) { array a = constant(2, 5,5); array b = constant(1, 5,5); array c = sin(a); array d = cos(b); array e = c * d; e.eval(); array f = c - d; f.eval(); array g = d - c; g.eval(); vector<float> hf(f.elements()); vector<float> hg(g.elements()); f.host(&hf[0]); g.host(&hg[0]); for (int i = 0; i < (int)f.elements(); i++) { ASSERT_EQ(hf[i], -hg[i]); } }
TEST(Accum, MaxDim) { const size_t largeDim = 65535 * 32 + 1; //first dimension kernel tests array input = constant(0, 2, largeDim, 2, 2); input(span, seq(0, 9999), span, span) = 1; array gold_first = constant(0, 2, largeDim, 2, 2); gold_first(span, seq(0, 9999), span, span) = range(2, 10000, 2, 2) + 1; array output_first = accum(input, 0); ASSERT_ARRAYS_EQ(gold_first, output_first); input = constant(0, 2, 2, 2, largeDim); input(span, span, span, seq(0, 9999)) = 1; gold_first = constant(0, 2, 2, 2, largeDim); gold_first(span, span, span, seq(0, 9999)) = range(2, 2, 2, 10000) + 1; output_first = accum(input, 0); ASSERT_ARRAYS_EQ(gold_first, output_first); //other dimension kernel tests input = constant(0, 2, largeDim, 2, 2); input(span, seq(0, 9999), span, span) = 1; array gold_dim = constant(10000, 2, largeDim, 2, 2); gold_dim(span, seq(0, 9999), span, span) = range(dim4(2, 10000, 2, 2), 1) + 1; array output_dim = accum(input, 1); ASSERT_ARRAYS_EQ(gold_dim, output_dim); input = constant(0, 2, 2, 2, largeDim); input(span, span, span, seq(0, 9999)) = 1; gold_dim = constant(0, 2, 2, 2, largeDim); gold_dim(span, span, span, seq(0, 9999)) = range(dim4(2, 2, 2, 10000), 1) + 1; output_dim = accum(input, 1); ASSERT_ARRAYS_EQ(gold_dim, output_dim); }
TEST(FFTConvolve, Docs_Unified_Wrapper) { // This unit test doesn't necessarily need to function // accuracy as af::convolve is merely a wrapper to // af::convolve[1|2|3] using af::array; using af::dim4; using af::randu; using af::constant; using af::convolve; //![ex_image_convolve_1d] array a = randu(10); //af_print(a); //a [10 1 1 1] = 0.0000 0.1315 0.7556 0.4587 0.5328 0.2190 0.0470 0.6789 0.6793 0.9347 array b = randu(4); //af_print(b); //b [4 1 1 1] = 0.3835 0.5194 0.8310 0.0346 array c = convolve(a, b); //af_print(c); //c [10 1 1 1] = 0.3581 0.6777 1.0750 0.7679 0.5903 0.4851 0.6598 1.2770 1.0734 0.8002 //![ex_image_convolve_1d] //![ex_image_convolve_2d] array d = constant(0.5, 5, 5); //af_print(d); //d [5 5 1 1] // 0.5000 0.5000 0.5000 0.5000 0.5000 // 0.5000 0.5000 0.5000 0.5000 0.5000 // 0.5000 0.5000 0.5000 0.5000 0.5000 // 0.5000 0.5000 0.5000 0.5000 0.5000 // 0.5000 0.5000 0.5000 0.5000 0.5000 array e = constant(1, 2, 2); //af_print(e); //e [2 2 1 1] // 1.0000 1.0000 // 1.0000 1.0000 array f = fftConvolve(d, e); //af_print(f); //f [5 5 1 1] // 2.0000 2.0000 2.0000 2.0000 1.0000 // 2.0000 2.0000 2.0000 2.0000 1.0000 // 2.0000 2.0000 2.0000 2.0000 1.0000 // 2.0000 2.0000 2.0000 2.0000 1.0000 // 1.0000 1.0000 1.0000 1.0000 0.5000 //![ex_image_convolve_2d] //![ex_image_convolve_3d] array g = constant(1, 4, 4, 4); //af_print(g); //g [4 4 4 1] // 1.0000 1.0000 1.0000 1.0000 // 1.0000 1.0000 1.0000 1.0000 // 1.0000 1.0000 1.0000 1.0000 // 1.0000 1.0000 1.0000 1.0000 // 1.0000 1.0000 1.0000 1.0000 // 1.0000 1.0000 1.0000 1.0000 // 1.0000 1.0000 1.0000 1.0000 // 1.0000 1.0000 1.0000 1.0000 // 1.0000 1.0000 1.0000 1.0000 // 1.0000 1.0000 1.0000 1.0000 // 1.0000 1.0000 1.0000 1.0000 // 1.0000 1.0000 1.0000 1.0000 // 1.0000 1.0000 1.0000 1.0000 // 1.0000 1.0000 1.0000 1.0000 // 1.0000 1.0000 1.0000 1.0000 // 1.0000 1.0000 1.0000 1.0000 array h = constant(0.5, 2, 2, 2); //af_print(h); //h [2 2 2 1] // 0.5000 0.5000 // 0.5000 0.5000 // 0.5000 0.5000 // 0.5000 0.5000 array i = fftConvolve(g, h); //af_print(i); //i [4 4 4 1] // 4.0000 4.0000 4.0000 2.0000 // 4.0000 4.0000 4.0000 2.0000 // 4.0000 4.0000 4.0000 2.0000 // 2.0000 2.0000 2.0000 1.0000 // 4.0000 4.0000 4.0000 2.0000 // 4.0000 4.0000 4.0000 2.0000 // 4.0000 4.0000 4.0000 2.0000 // 2.0000 2.0000 2.0000 1.0000 // 4.0000 4.0000 4.0000 2.0000 // 4.0000 4.0000 4.0000 2.0000 // 4.0000 4.0000 4.0000 2.0000 // 2.0000 2.0000 2.0000 1.0000 // 2.0000 2.0000 2.0000 1.0000 // 2.0000 2.0000 2.0000 1.0000 // 2.0000 2.0000 2.0000 1.0000 // 1.0000 1.0000 1.0000 0.5000 //![ex_image_convolve_3d] }