#include #include #include using namespace std; // Inner product double benchmark_A(const vector &x, const vector &y) { double sum = 0.0; #pragma omp parallel for reduction(+:sum) for (unsigned int i = 0; i < x.size(); i++) { sum += x[i]*y[i]; } return sum; } // Inner product double benchmark_A_sum(const vector &x) { double sum = 0.0; #pragma omp parallel for reduction(+:sum) for (unsigned int i = 0; i < x.size(); i++) { sum += x[i]; } return sum; } //Matrix-vector product vector benchmark_B(const vector &A, const vector &x) { unsigned int N = x.size(); unsigned int M = A.size() / N; vector b(M, 0.0); #pragma omp parallel for for (unsigned int i = 0; i < M; i++) { double bi = 0.0; for (unsigned int j = 0; j < N; j++) { bi += A[i*N+j]*x[j]; } b[i] = bi; } return b; } //Matrix-Matrix product vector benchmark_C(const vector &A, const vector &B, unsigned int M) { unsigned int L = A.size()/M; unsigned int N = B.size()/L; vector C(M*N,0.0); #pragma omp parallel for collapse(2) for (unsigned int i = 0; i < M; i++) { for (unsigned int j = 0; j < N; j++) { double sum = 0.0; for (unsigned int k = 0; k < L; k++) { sum += A[i*L+k]*B[k*N+j]; } C[i*N+j] = sum; } } return C; } //polynomial evaluation vector benchmark_D(const vector& coeff, const vector& x) { unsigned int p = coeff.size(); // p coefficients, degree p-1 unsigned int N = x.size(); vector y(N); #pragma omp parallel for for (unsigned int i = 0; i < N; i++){ double yi = coeff[p-1]; double xi = x[i]; for(int j=p-2; j>=0; --j) { yi = yi*xi+coeff[j]; } y[i] = yi; } return y; } double benchmark_A_old(const vector &x, const vector &y) { double sum = 0.0; for (unsigned int i = 0; i < x.size(); i++) { sum += x[i]*y[i]; } return sum; } double benchmark_A_sum_old(const vector &x) { double sum = 0.0; for (unsigned int i = 0; i < x.size(); i++) { sum += x[i]; } return sum; }