1 #ifndef ELEMENT_OPENCL_HH 2 #define ELEMENT_OPENCL_HH 3 #include "test_opencl.hpp" 4 5 template <class T, class F, int number_of_tests, int max_dimension> 6 class bench_elementwise 7 { 8 public: 9 typedef test_opencl<T, F> test; run()10 void run() 11 { 12 opencl::library lib; 13 int passedOperations = 0; 14 // get default device and setup context 15 compute::device device = compute::system::default_device(); 16 compute::context context(device); 17 compute::command_queue queue(context, device); 18 19 std::srand(time(0)); 20 21 ublas::matrix<T, F> a; 22 ublas::matrix<T, F> b; 23 24 //matrix-matrix operations of cpu 25 ublas::matrix<T, F> result_m_add; 26 ublas::matrix<T, F> result_m_sub; 27 ublas::matrix<T, F> result_m_mul; 28 29 //matrix-matrix operations of gpu 30 ublas::matrix<T, F> result_m_add_cl; 31 ublas::matrix<T, F> result_m_sub_cl; 32 ublas::matrix<T, F> result_m_mul_cl; 33 34 35 ublas::vector<T> va; 36 ublas::vector<T> vb; 37 38 //vector-vector operations of cpu 39 ublas::vector<T> result_v_add; 40 ublas::vector<T> result_v_sub; 41 ublas::vector<T> result_v_mul; 42 43 //vector-vector operations of gpu 44 ublas::vector<T> result_v_add_cl; 45 ublas::vector<T> result_v_sub_cl; 46 ublas::vector<T> result_v_mul_cl; 47 48 49 for (int i = 0; i<number_of_tests; i++) 50 { 51 int rows = std::rand() % max_dimension + 1; 52 int cols = std::rand() % max_dimension + 1; 53 54 a.resize(rows, cols); 55 b.resize(rows, cols); 56 va.resize(rows); 57 vb.resize(rows); 58 59 60 test::init_matrix(a, 200); 61 test::init_matrix(b, 200); 62 test::init_vector(va, 200); 63 test::init_vector(vb, 200); 64 65 result_m_add = a + b; 66 result_m_add_cl = opencl::element_add(a, b, queue); 67 68 result_m_sub = a - b; 69 result_m_sub_cl = opencl::element_sub(a, b, queue); 70 71 result_m_mul = ublas::element_prod(a, b); 72 result_m_mul_cl = opencl::element_prod(a, b, queue); 73 74 75 result_v_add = va + vb; 76 result_v_add_cl = opencl::element_add(va, vb, queue); 77 78 result_v_sub = va - vb; 79 result_v_sub_cl = opencl::element_sub(va, vb, queue); 80 81 result_v_mul = ublas::element_prod(va, vb); 82 result_v_mul_cl = opencl::element_prod(va, vb, queue); 83 84 85 86 87 88 89 if ((!test::compare(result_m_add, result_m_add_cl)) || 90 (!test::compare(result_m_sub, result_m_sub_cl)) || 91 (!test::compare(result_m_mul, result_m_mul_cl)) || 92 (!test::compare(result_v_add, result_v_add_cl)) || 93 (!test::compare(result_v_sub, result_v_sub_cl)) || 94 (!test::compare(result_v_mul, result_v_mul_cl)) 95 ) 96 { 97 std::cout << "Error in calculations" << std::endl; 98 99 std::cout << "passed: " << passedOperations << std::endl; 100 return; 101 } 102 103 passedOperations++; 104 105 } 106 std::cout << "All is well (matrix opencl element wise operations) of " << typeid(T).name() << std::endl; 107 108 109 110 } 111 112 }; 113 114 #endif 115