#include "common.hpp" #include #include "viennacl/vector.hpp" #include "viennacl/linalg/inner_prod.hpp" #include "atidlas/templates/reduction.hpp" #include "atidlas/execute.hpp" template void test_reduction(NumericT epsilon, XType & cx, YType & cy) { using namespace viennacl::linalg; using namespace std; atidlas::reduction_parameters parameters(1, 32, 128, atidlas::FETCH_FROM_GLOBAL_CONTIGUOUS); int failure_count = 0; NumericT cs = 0; NumericT tmp = 0; viennacl::scalar s(0); viennacl::vector xtmp(cx.internal_size()); typename vector_maker::result_type x = vector_maker::make(xtmp, cx); viennacl::vector ytmp(cy.internal_size()); typename vector_maker::result_type y = vector_maker::make(ytmp, cy); #define RUN_TEST(NAME, CPU_REDUCTION, ASSIGNMENT, GPU_STATEMENT) \ cout << NAME "..." << flush;\ cs = 0;\ for(int_t i = 0 ; i < cx.size() ; ++i)\ CPU_REDUCTION;\ cs= ASSIGNMENT ;\ atidlas::execute(atidlas::reduction_template(parameters),\ GPU_STATEMENT,\ viennacl::ocl::current_context(), true);\ tmp = s;\ if((std::abs(cs - tmp)/std::max(cs, tmp)) > epsilon)\ {\ failure_count++;\ cout << " [Failure!]" << endl;\ }\ else\ cout << endl; RUN_TEST("s = x.y", cs+=cx[i]*cy[i], cs, viennacl::scheduler::statement(s, viennacl::op_assign(), viennacl::linalg::inner_prod(x, y))) #undef RUN_TEST if(failure_count > 0) exit(EXIT_FAILURE); } template void test_impl(NumericT epsilon) { int_t N = 24378; INIT_VECTOR_AND_PROXIES(N, 4, 5, x); INIT_VECTOR_AND_PROXIES(N, 7, 8, y); #define TEST_OPERATIONS(XTYPE, YTYPE)\ std::cout << "> x : " #XTYPE " | y : " #YTYPE << std::endl;\ test_reduction(epsilon, x_ ## XTYPE, y_ ## YTYPE);\ TEST_OPERATIONS(vector, vector) TEST_OPERATIONS(vector, range) TEST_OPERATIONS(vector, slice) TEST_OPERATIONS(range, vector) TEST_OPERATIONS(range, range) TEST_OPERATIONS(range, slice) TEST_OPERATIONS(slice, vector) TEST_OPERATIONS(slice, range) TEST_OPERATIONS(slice, slice) } int main() { std::cout << ">> float" << std::endl; test_impl(1e-4); std::cout << ">> double" << std::endl; test_impl(1e-9); std::cout << "---" << std::endl; std::cout << "Passed" << std::endl; return EXIT_SUCCESS; }