#include #include #include #define NUM_LOOPS 50 int main(int argc, char *argv[]) { double **A; double *u, *v; long rows = 5000, columns = 5000; time_t begin_t, end_t; long i, j, k; // Inicjujemy wektory i macierz. u = (double*)malloc(columns * sizeof(double)); v = (double*)malloc(rows * sizeof(double)); A = (double**)malloc(rows * sizeof(double*)); for (i = 0; i < rows; i++) A[i] = (double*)malloc(columns * sizeof(double)); // Wypełniamy wektor u oraz macierz A dowolnymi wartościami. for (i = 0; i < columns; i++) { u[i] = (double)(i / 1000.0f); for ( j = 0; j < rows; j++ ) A[j][i] = (double)(i * j / 1000.0f); } begin_t = time(NULL); // Pętla zewnętrzna. for (k = 0; k < NUM_LOOPS; k++) { // Obliczamy v = A*u z wykorzystaniem dyrektyw OpenMP. #pragma omp parallel for shared(A, v, u, rows, columns) private(i, j) for (i = 0; i < rows; i++) { v[i] = 0.0f; for (j = 0; j < columns; j++) v[i] = v[i] + A[i][j] * u[j]; } } end_t = time(NULL); printf("Czas obliczen: %f.\n", difftime(end_t, begin_t)); // Zwalniamy pamięć. free(u); free(v); for (i = 0; i < rows; i++) free(A[i]); free(A); return 0; }