elementwise_operations_test.hpp 2.6 KB

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