@@ -151,3 +151,67 @@ TEST(Reduce,Test_Reduce_Big1)
151151 1
152152 );
153153}
154+
155+ // ///////////////////////////////// CPP //////////////////////////////////
156+ //
157+ typedef af::array (*ReductionOp)(const af::array&, const int );
158+
159+ using af::sum;
160+ using af::min;
161+ using af::max;
162+ using af::alltrue;
163+ using af::anytrue;
164+ using af::count;
165+
166+ template <typename Ti, typename To, ReductionOp reduce>
167+ void cppReduceTest (string pTestFile)
168+ {
169+ vector<af::dim4> numDims;
170+
171+ vector<vector<int >> data;
172+ vector<vector<int >> tests;
173+ readTests<int ,int ,int > (pTestFile,numDims,data,tests);
174+ af::dim4 dims = numDims[0 ];
175+
176+ vector<Ti> in (data[0 ].begin (), data[0 ].end ());
177+
178+ af::array input (dims, &in.front ());
179+
180+ // Compare result
181+ for (int d = 0 ; d < (int )tests.size (); ++d) {
182+
183+ vector<To> currGoldBar (tests[d].begin (), tests[d].end ());
184+
185+ // Run sum
186+ af::array output = reduce (input, d);
187+
188+ // Get result
189+ To *outData = new To[dims.elements ()];
190+ output.host ((void *)outData);
191+
192+ size_t nElems = currGoldBar.size ();
193+ for (size_t elIter = 0 ; elIter < nElems; ++elIter) {
194+ ASSERT_EQ (currGoldBar[elIter], outData[elIter]) << " at: " << elIter
195+ << " for dim " << d << std::endl;
196+ }
197+
198+ // Delete
199+ delete[] outData;
200+ }
201+ }
202+
203+
204+ #define CPP_REDUCE_TESTS (FN, Ti, To ) \
205+ TEST (Reduce, Test_##FN##_CPP) \
206+ { \
207+ cppReduceTest<Ti, To, FN>( \
208+ string (TEST_DIR" /reduce/" #FN" .test" ) \
209+ ); \
210+ }
211+
212+ CPP_REDUCE_TESTS (sum, float , float );
213+ CPP_REDUCE_TESTS (min, float , float );
214+ CPP_REDUCE_TESTS (max, float , float );
215+ CPP_REDUCE_TESTS (anytrue, float , unsigned char );
216+ CPP_REDUCE_TESTS (alltrue, float , unsigned char );
217+ CPP_REDUCE_TESTS (count, float , unsigned );
0 commit comments