#include #include #include #include #include #include "c_matrix.h" #include #include void MM(int *A, int *B, int *C, int n); void openMP_MM(int *A, int *B, int *C, int n); void winograd(int *A, int *B, int *C, int n); int winograd_inner(int *a, int *b, int n); void run_algo(void (*algo)(), char alog_name[], int print); void run_algo_cblas(int print); void MM_dc(int *A, int *B, int *C, int n); void strassen(int *A, int *B, int *C, int n); void printMatrix(int *C, int n); void printMatrix_double(double *C, int n); void split(int *in, int *out, int n, int col, int row); void join(int *in, int *out, int n, int col, int row); void add(int *A, int *B, int *C, int n); void sub(int *A, int *B, int *C, int n); void multiply(int *A, int *B, int *C, int n); int main() { // omp_set_dynamic(0); // omp_set_num_threads(4); // run_algo(openMP_MM, "openMP_MM",0); run_algo(MM_dc, "MM_dc",0); run_algo(strassen, "strassen",0); run_algo(MM, "MM", 0); run_algo(winograd, "winograd", 0); run_algo_cblas(0); return 0; } void MM(int *A, int *B, int *C, int n) { for (int i = 0; i < n; ++i) { for (int j = 0; j < n; ++j) { int sum = 0; for (int k = 0; k < n; ++k) { sum += (*((A + i * n) + k)) * (*((B + k * n) + j)); } *((C + i * n) + j) = sum; } } } int winograd_inner(int *a, int *b, int n){ int ab = 0; if(n%2==0) { int xi = 0; int etha = 0; for(int i = 0; i