| 1 | #include <stdlib.h>
|
|---|
| 2 | #include <stdio.h>
|
|---|
| 3 |
|
|---|
| 4 | extern "C" {
|
|---|
| 5 | void InitTim();
|
|---|
| 6 | void PrtTim(char *);
|
|---|
| 7 | }
|
|---|
| 8 |
|
|---|
| 9 | void Mult(int n, double *v1, double *v2, double *v3);
|
|---|
| 10 | void MultOMP(int n, double *v1, double *v2, double *v3);
|
|---|
| 11 | void MultOMP2(int N, int n, double *v1, double *v2, double *v3);
|
|---|
| 12 |
|
|---|
| 13 | int main (int narg, char *arg[])
|
|---|
| 14 | {
|
|---|
| 15 | int i,j, N, M;
|
|---|
| 16 |
|
|---|
| 17 | double *v1, *v2, *v3;
|
|---|
| 18 |
|
|---|
| 19 | if (narg < 2) {
|
|---|
| 20 | printf("\n Usage tompCXX P/x [N M] \n \n");
|
|---|
| 21 | printf(" P -> Calling MultOMP2 p -> Calling MultOMP, x -> Calling Mult \n");
|
|---|
| 22 | printf(" N (=100): External loop number M : Array Size (500000) \n");
|
|---|
| 23 | exit(0);
|
|---|
| 24 | }
|
|---|
| 25 | N = 100;
|
|---|
| 26 | M = 500000;
|
|---|
| 27 | if (narg > 2) N = atoi(arg[2]);
|
|---|
| 28 | if (narg > 3) M = atoi(arg[3]);
|
|---|
| 29 |
|
|---|
| 30 | InitTim();
|
|---|
| 31 |
|
|---|
| 32 | v1 = new double[M];
|
|---|
| 33 | v2 = new double[M];
|
|---|
| 34 | v3 = new double[M];
|
|---|
| 35 |
|
|---|
| 36 | for(i=0; i<M; i++) { v1[i] = random()%1000; v2[i] = random()%5000; }
|
|---|
| 37 | PrtTim("End of Init ");
|
|---|
| 38 |
|
|---|
| 39 | if (*arg[1] == 'P') {
|
|---|
| 40 | printf("Calling MultOMP2(N=%d, Size= %d) \n", N, M);
|
|---|
| 41 | MultOMP2(N, M, v1, v2, v3);
|
|---|
| 42 | }
|
|---|
| 43 | else if (*arg[1] == 'p') {
|
|---|
| 44 | printf("Calling N=%d times MultOMP(Size= %d) \n", N, M);
|
|---|
| 45 | for(i=0; i<N; i++) MultOMP(M, v1, v2, v3);
|
|---|
| 46 | }
|
|---|
| 47 | else {
|
|---|
| 48 | printf("Calling N=%d times Mult(Size= %d) \n", N, M);
|
|---|
| 49 | for(i=0; i<N; i++) Mult(M, v1, v2, v3);
|
|---|
| 50 | }
|
|---|
| 51 |
|
|---|
| 52 | PrtTim("End of Multiplication ");
|
|---|
| 53 |
|
|---|
| 54 | delete[] v1;
|
|---|
| 55 | delete[] v2;
|
|---|
| 56 | delete[] v3;
|
|---|
| 57 | exit(0);
|
|---|
| 58 | }
|
|---|
| 59 |
|
|---|
| 60 |
|
|---|
| 61 | void Mult(int n, double *v1, double *v2, double *v3)
|
|---|
| 62 | {
|
|---|
| 63 | int k;
|
|---|
| 64 | for(k=0; k<n; k++)
|
|---|
| 65 | v3[k] = v1[k] * v2[k];
|
|---|
| 66 | }
|
|---|
| 67 |
|
|---|
| 68 | void MultOMP(int n, double *v1, double *v2, double *v3)
|
|---|
| 69 | {
|
|---|
| 70 | int k;
|
|---|
| 71 | #pragma omp parallel for
|
|---|
| 72 | for(k=0; k<n; k++)
|
|---|
| 73 | v3[k] = v1[k] * v2[k];
|
|---|
| 74 | }
|
|---|
| 75 | void MultOMP2(int N, int n, double *v1, double *v2, double *v3)
|
|---|
| 76 | {
|
|---|
| 77 | int k;
|
|---|
| 78 | int i;
|
|---|
| 79 | #pragma omp parallel default(shared)
|
|---|
| 80 | {
|
|---|
| 81 | #pragma omp parallel for
|
|---|
| 82 | for(i=0; i<N; i++)
|
|---|
| 83 | #pragma omp parallel for
|
|---|
| 84 | for(k=0; k<n; k++)
|
|---|
| 85 | v3[k] = v1[k] * v2[k];
|
|---|
| 86 | }
|
|---|
| 87 | }
|
|---|