From 48725f22460a7b69df32798f8ca1d2f164723966 Mon Sep 17 00:00:00 2001 From: OXPHOS Date: Tue, 7 Jun 2016 18:32:40 -0400 Subject: [PATCH] CPU and GPU dot --- benchmarks/linalg_refactor_benchmark.cpp | 149 +++++++++++++++++++++++ 1 file changed, 149 insertions(+) create mode 100644 benchmarks/linalg_refactor_benchmark.cpp diff --git a/benchmarks/linalg_refactor_benchmark.cpp b/benchmarks/linalg_refactor_benchmark.cpp new file mode 100644 index 00000000000..1ff9db4754c --- /dev/null +++ b/benchmarks/linalg_refactor_benchmark.cpp @@ -0,0 +1,149 @@ +#include +#include +#include + +#include +#include +#include + +#include +#include +#include + +#include + +using namespace shogun; + +/** + * Instructions : + * 1. Install benchmarking toolkit "hayai" (https://github.com/nickbruun/hayai) + * 2. Compile against libhayai_main, e.g. + * g++ -O3 -std=c++11 linglg_refactor_benchmark.cpp -I/usr/include/eigen3 \ + * -lshogun -lhayai_main -lOpenCL -o benchmark + * 3. ./benchmark + */ + +/** Generate data only once */ +typedef float32_t T; +typedef viennacl::vector_base VCLVectorBase; + +template +struct Data +{ + typedef viennacl::backend::mem_handle VCLMemoryArray; + + Data() + { + num_rows = 100; + init(); + } + + Data(index_t num_rows) + { + this->num_rows = num_rows; + init(); + } + + ~Data() + { + exit_shogun(); + } + + void init() + { + A = init_sg(1); + B = init_sg(2); + Av = init_v(A); + Bv = init_v(B); + Ac = std::unique_ptr> (init_c(A)); + Bc = std::unique_ptr> (init_c(B)); + Ag = std::unique_ptr> (init_g(A)); + Bg = std::unique_ptr> (init_g(B)); + + init_shogun_with_defaults(); + GPUBackend viennaclBackend; + sg_linalg->set_gpu_backend(&viennaclBackend); + } + + /** SGVector **/ + SGVector init_sg(value_type begin) + { + SGVector m(num_rows); + m.range_fill(begin); + + return m; + } + + /** ViennaCL Vector for test **/ + VCLVectorBase init_v(SGVector m) + { + VCLVectorBase mv; + std::shared_ptr vector(new VCLMemoryArray()); + viennacl::backend::memory_create(*vector, sizeof(value_type)*num_rows, + viennacl::context()); + viennacl::backend::memory_write(*vector, 0, num_rows*sizeof(value_type), + m.vector); + mv = VCLVectorBase(*vector, num_rows, 0, 1); + + return mv; + } + + /** CPUVector derived from BaseVector **/ + std::unique_ptr> init_c(SGVector m) + { + std::unique_ptr> mc(new CPUVector(m)); + return std::move(mc); + } + + /** GPUVector derived from BaseVector **/ + std::unique_ptr> init_g(SGVector m) + { + std::unique_ptr> mg(new GPU_Vector(m)); + return std::move(mg); + } + + SGVector A; + SGVector B; + VCLVectorBase Av; + VCLVectorBase Bv; + std::unique_ptr> Ac; + std::unique_ptr> Bc; + std::unique_ptr> Ag; + std::unique_ptr> Bg; + + index_t num_rows; +}; + +BENCHMARK_P(CPUVector, dot_explict_eigen3, 10, 1000, + (const SGVector &A, const SGVector &B)) +{ + typedef Eigen::Matrix VectorXt; + Eigen::Map vec_A(A.vector, A.vlen); + Eigen::Map vec_B(B.vector, B.vlen); + + auto C = vec_A.dot(vec_B); +} + +BENCHMARK_P(CPUVector, dot_eigen3, 10, 1000, + (BaseVector *A, BaseVector *B)) +{ + auto C = sg_linalg->dot(A, B); +} + +BENCHMARK_P(GPU_Vector, dot_explict_viennacl, 10, 1000, + (const VCLVectorBase &A, const VCLVectorBase &B)) +{ + auto C = viennacl::linalg::inner_prod(A, B); +} + +BENCHMARK_P(GPU_Vector, dot_viennacl, 10, 1000, + (BaseVector *A, BaseVector *B)) +{ + auto C = sg_linalg->dot(A, B); +} + +Data data(1000000); +BENCHMARK_P_INSTANCE(CPUVector, dot_explict_eigen3, (data.A, data.B)); +BENCHMARK_P_INSTANCE(CPUVector, dot_eigen3, (data.Ac.get(), data.Bc.get())); +BENCHMARK_P_INSTANCE(GPU_Vector, dot_explict_viennacl, (data.Av, data.Bv)); +BENCHMARK_P_INSTANCE(GPU_Vector, dot_viennacl, (data.Ag.get(), data.Bg.get()));