X Tutup
// This program computes the dot products over a set of independent vectors // and compares the runtime between baseline (sequential), OpenMP, C++ thread, // and Taskflow implementations. #include #include #include #include using matrix_t = std::vector>; // ---------------------------------------------------------------------------- // Utility section // ---------------------------------------------------------------------------- // Function: random_matrix matrix_t random_matrix(size_t N) { thread_local std::default_random_engine gen(0); std::normal_distribution d{0.0f, 1.0f}; std::ostringstream oss; oss << "|----> generating " << N << "x" << N << " matrix by thread " << std::this_thread::get_id() << "\n"; std::cout << oss.str(); matrix_t mat(N); for(auto& r : mat) { r.resize(N); for(auto& c : r) { c = d(gen); } } return mat; } // Operator: multiplication matrix_t operator * (const matrix_t& A, const matrix_t& B) { if(A.empty() || B.empty() || A[0].size() != B.size()) { std::cout << A[0].size() << " " << B.size() << std::endl; throw std::runtime_error("Dimension mismatched in matrix multiplication\n"); } size_t M, K, N; N = A.size(); K = A[0].size(); M = B[0].size(); printf("A[%zux%zu] * B[%zux%zu]\n", N, K, K, M); // Initialize the matrix matrix_t ret(N); for(auto& r : ret) { r.resize(M); for(auto& c : r) { c = 0.0f; } } // Matrix multiplication for(size_t i=0; i& D) { std::cout << "========== baseline ==========\n"; auto tbeg = std::chrono::steady_clock::now(); std::cout << "Generating matrix As ...\n"; std::vector As(D.size()); for(size_t j=0; j Bs(D.size()); for(size_t j=0; j Cs(D.size()); for(size_t j=0; j(tend-tbeg).count() << " ms\n"; } // Procedure: taskflow void taskflow(const std::vector& D) { auto tbeg = std::chrono::steady_clock::now(); tf::Taskflow tf; std::cout << "Generating task As ...\n"; std::vector As(D.size()); std::vector TaskAs; for(size_t j=0; j Bs(D.size()); std::vector TaskBs; for(size_t j=0; j Cs(D.size()); std::vector TaskCs; for(size_t j=0; j(tend-tbeg).count() << " ms\n"; } // ------------------------------------------------------------------------------------------------ // Function: main int main(int argc, char* argv[]) { if(argc != 3) { std::cerr << "usage: ./matrix [baseline|openmp|cppthread|taskflow] N\n"; std::exit(EXIT_FAILURE); } // Create a unbalanced dimension for vector products. const auto N = std::stoul(argv[2]); std::vector dimensions(N); std::default_random_engine engine(0); std::uniform_int_distribution dis(1, 1000); std::cout << "matrix sizes = ["; for(size_t i=0; i
X Tutup