====== 12. Cvičení - Experimenty s paralelizací... ====== Paralelizujte pomocí OpenMP níže uvedený program pro součin matice a vektoru. \\ \\ #include #include #include #include #define abs(x) ((x)>0?(x):-(x)) void printUsage(const char *s){ printf( " *********************************** \ \n Pouziti: %s dimM dimN numOfThreads \ \n *********************************** \ \n Spoustim s default paramatry: %s 100 100 2\n\n",s,s); } void matrix_vector_mult_basic (double *A, double *x, double *y, int M, int N); void matrix_vector_mult_parallel_first (double *A, double *x, double *y, int M, int N); void matrix_vector_mult_parallel_second (double *A, double *x, double *y, int M, int N); void matrix_vector_mult_parallel_third (double *A, double *x, double *y, int M, int N); void matrix_vector_mult_parallel_forth (double *A, double *x, double *y, int M, int N); void matrix_vector_mult_parallel_fifth (double *A, double *x, double *y, int M, int N); void sleep(int sleep_time_ms); int eq_test(double *a, double *b, int dim); void show_vector(double *a, int dim); int main(int argc, const char* argv[]){ int ii,jj, numOfProcs; double tmp, sequential_time; struct timespec start, stop; double elapsed; double *A, *x, *y,*res; int M, N, numOfThreads; // Dimenze matic, pocet vlaken if(argc < 4){ // Defaultni konfigurace printUsage(argv[0]); M=N=100; numOfThreads=2; }else{ // Konfigurace nactena z prikazoveho radku M=atoi(argv[1]); N=atoi(argv[2]); numOfThreads = atoi(argv[3]); } /* Alokace pameti */ if((x=(double*)malloc(N*sizeof(double)))==NULL) { printf("Nedostatek pameti..\n"); return 1; } if((y=(double*)malloc(M*sizeof(double)))==NULL) { printf("Nedostatek pameti..\n"); return 1; } if((res=(double*)malloc(M*sizeof(double)))==NULL) { printf("Nedostatek pameti..\n"); return 1; } if((A=(double*)malloc(M*N*sizeof(double)))==NULL) { printf("Nedostatek pameti..\n"); return 1; } /* Inicializace */ srand((unsigned)time(0)); for(ii=0;ii \\ \\ \\ Možné výsledky: \\ {{courses:B4M35PAP:tutorials:12:paralelizace.png|}}