Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <stdlib.h>
- #include <time.h>
- #include <omp.h>
- #define NUM_LOOPS 50
- int main(int argc, char *argv[])
- {
- double **A;
- double *u, *v;
- long rows = 6000, columns = 6000;
- time_t start0, stop0;
- double start1, stop1;
- 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);
- }
- omp_set_num_threads(12); // Funkcja przyjmuje jako parametr liczbe watków ( moze przewyższać liczbe faktycznych rdzeni ) .
- start0 = time(NULL);
- start1 = omp_get_wtime();
- for (k = 0; k < NUM_LOOPS; k++) { // dyrektywa for powoduje że zrównoleglamy petle for
- #pragma omp parallel for shared(A, v, u, rows, columns) private(i, j)
- for (i = 0; i < rows; i++) { // wykonujemy mnozenie macierzy
- v[i] = 0.0f;
- for (j = 0; j < columns; j++)
- v[i] = v[i] + A[i][j] * u[j];
- }
- }
- stop0 = time(NULL);
- stop1 = omp_get_wtime();
- printf("Czas obliczen funkcja time(): %fs.\n", difftime(stop0,start0));
- printf("Czas obliczen funkcja omp_get_wtime(): %lfs.\n", stop1-start1);
- // Zwalniamy pamięć.
- free(u);
- free(v);
- for (i = 0; i < rows; i++)
- free(A[i]);
- free(A);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment