совместное использование времени выполнения и spmd - PullRequest
0 голосов
/ 03 мая 2018

Я пишу две похожие программы для сравнения времени выполнения в spmd и worsharing. К моему удивлению, я получаю больше времени на выполнение работы, а время в spmd значительно меньше.

Что я сделал не так, чтобы получить это?

Вот мои коды:

Код SPMD:

#define N 1000
float A[N][N], B[N][N], C[N][N]; // declaring matrices of NxN size
int main() {
    /* DECLARING VARIABLES */
    int i, j, k; // indices for matrix multiplication

    /* FILLING MATRICES WITH RANDOM NUMBERS */
    srand ( time(NULL) );
    for(i=0;i<N;i++) {
        for(j=0;j<N;j++) {
            A[i][j]= (rand()%10);
            B[i][j]= (rand()%10);
        }
    }
    /* MATRIX MULTIPLICATION */
    omp_set_num_threads(4);
    int id;
    int m;
    int nthrds;  
    #pragma omp parallel // num_threads(4)
    {
        id=omp_get_thread_num();
        nthrds=omp_get_num_threads();
        printf("number of threads %d",nthrds);
        double wtime = omp_get_wtime();
        for (i=id;i<N;i=i+nthrds) {
            //dummy=i+nthrds;
            for(j=id;j<N;j=j+nthrds) {
                C[i][j]=0;
                for(k=id;k<N;k=k+nthrds) {
                    C[i][j]+=A[i][k]*B[k][j];
                }
                // printf("%d ", C[i][j]);  
            }
            //printf("\n");
        }

        wtime = omp_get_wtime() - wtime;
        printf( "Time taken  is %f\n", wtime );
        getchar(); 
    }
}

код разделения работы:

.......
int main() {
    /* DECLARING VARIABLES */
    int i, j, k; // indices for matrix multiplication

    /* FILLING MATRICES WITH RANDOM NUMBERS */
    srand ( time(NULL) );
    for(i=0;i<N;i++) {
        for(j=0;j<N;j++) {
            A[i][j]= (rand()%10);
            B[i][j]= (rand()%10);
        }
    }
    /* MATRIX MULTIPLICATION */
    //printf("Max number of threads: %i \n",omp_get_max_threads()); 

    double wtime = omp_get_wtime();
    #pragma omp parallel private(j,k) num_threads(8)
    {   
        #pragma omp for 
        for (i=0;i<N;i++) {
            for(j=0;j<N;j++) {
                C[i][j]=0;
                for(k=0;k<N;k++) {
                    C[i][j]+=A[i][k]*B[k][j];
                } 
                // printf("%d ", C[i][j]);  
            }
            //printf("\n");
        }
        double etime = omp_get_wtime() - wtime;
        printf( "Time taken  is %f\n", etime );
        getchar(); 
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...