mesytec-mnode/external/taskflow-3.8.0/benchmarks/wavefront/matrix.hpp

86 lines
2.1 KiB
C++
Raw Normal View History

2025-01-04 01:25:05 +01:00
#include <algorithm> // for std::max
#include <cassert>
#include <cstdio>
#include <chrono>
#include <iostream>
#include <iomanip>
#include <thread>
#include <random>
#include <cmath>
extern int M, N;
extern int B;
extern int MB;
extern int NB;
extern double **matrix;
// nominal operations
inline double calc(double v0, double v1) {
return (v0 == v1) ? std::pow(v0/v1, 4.0f) : std::max(v0,v1);
//return std::max(v0, v1);
}
// initialize the matrix
inline void init_matrix(){
matrix = new double *[M];
for ( int i = 0; i < M; ++i ) matrix[i] = new double [N];
for(int i=0; i<M; ++i){
for(int j=0; j<N ; ++j){
matrix[i][j] = i*N + j;
}
}
}
// destroy the matrix
inline void destroy_matrix() {
for ( int i = 0; i < M; ++i ) {
delete [] matrix[i];
}
delete [] matrix;
}
//computation given block row index i, block col index j
inline int block_computation(int i, int j){
return i + j;
//int start_i = i*B;
//int end_i = (i*B+B > M) ? M : i*B+B;
//int start_j = j*B;
//int end_j = (j*B+B > N) ? N : j*B+B;
//for ( int ii = start_i; ii < end_i; ++ii ) {
// for ( int jj = start_j; jj < end_j; ++jj ) {
// double v0 = ii == 0 ? 0 : matrix[ii-1][jj];
// double v1 = jj == 0 ? 0 : matrix[ii][jj-1];
// matrix[ii][jj] = ii==0 && jj==0 ? 1 : calc(v0,v1);
// }
//}
}
//computation given block row index i, block col index j
inline void framework_computation(int i, int j){
// When testing framework
int start_i = i*B;
int end_i = (i*B+B > M) ? M : i*B+B;
int start_j = j*B;
int end_j = (j*B+B > N) ? N : j*B+B;
for ( int ii = start_i; ii < end_i; ++ii ) {
for ( int jj = start_j; jj < end_j; ++jj ) {
matrix[ii][jj] += ii == 0 ? 0.0 : matrix[ii-1][jj];
matrix[ii][jj] += ii >= M-1 ? 0.0 : matrix[ii+1][jj];
matrix[ii][jj] += jj == 0 ? 0.0 : matrix[ii][jj-1];
matrix[ii][jj] += jj >= N-1 ? 0.0 : matrix[ii][jj+1];
matrix[ii][jj] *= 0.25;
//matrix[ii][jj] = matrix[ii][jj];
}
}
}
std::chrono::microseconds measure_time_taskflow(unsigned);
std::chrono::microseconds measure_time_omp(unsigned);
std::chrono::microseconds measure_time_tbb(unsigned);