2

I have written the following program for matrix multiplication:

#include <stdio.h>
#include <omp.h>
#include <time.h>
#define NRA 500
#define NCA 500
#define NCB 500

int mat_mul() ;
int i , j , k ;
int main(){
    double start , end ;
    start  =  omp_get_wtime() ;
    mat_mul() ;
    end = omp_get_wtime() ; 
    printf("Time taken : \n %lf " , (end - start) );
    return 0;
}

int mat_mul(){
    int mat1[NRA][NCA] , mat2[NCA][NCB] , mat3[NRA][NCB] ;
    //double start , end ;
    //start  =  omp_get_wtime() ;
    #pragma omp parallel private( i , j , k ) shared(mat1 , mat2 , mat3)
    #pragma omp for

    for( i = 0 ; i < NRA ; i++){
        for( j = 0 ; j < NCB ; j++){
            mat1[i][j] = mat2[i][j] = rand() ;
            for ( k = 0 ; k <  NCB ; k++){
                mat3[i][k] += mat1[i][k] * mat2[k][j] ;
            }
        }
    }
    //end = omp_get_wtime() ; 
    printf("REsult : \n");
    for( i = 0 ; i < NRA ; i ++ ) {
        for( j =0 ; j < k ; j ++)
            printf("%lf" , (double)mat3[i][j]);
        printf("\n") ;
    //printf("Time taken : \n %lf " , (end - start) );
    }
    return 0 ;
}

Everything's fine(almost): It compiles, it executes, even terminates :-D (and it ACTUALLY provides a speed-up(Compare.

But unfortunately, the output appears somethinf like this:

[tejas@localhost Documents]$ gcc -pedantic -Wall  -std=c99 -fopenmp  par.c
par.c: In function ‘mat_mul’:
par.c:28:30: warning: implicit declaration of function ‘rand’ [-Wimplicit-function-declaration]
    mat1[i][j] = mat2[i][j] = rand() ;
                              ^~~~
[tejas@localhost Documents]$ ./a.out
REsult :
...
(LOTS of blank spaces later)
...
Time taken : 
0.177506 [tejas@localhost Documents]$ 

What am I doing wrong? I'm using Fedora 27 , GCC

Thank you in advance.

10
  • 2
    LOTS of blank spaces = 500? Because that would make sense. Step through this with a debugger and/or insert printfs inside the loops to see why the inner loop prints nothing. Commented Jan 18, 2018 at 9:19
  • It actually prints when I comment out the pragmas(i checked that just before posting this question). I didn't bother calculating, but the blanks should be 250000. Commented Jan 18, 2018 at 9:23
  • (No they would not. That loop only loops over NRA, which is 500.) If commenting out the optimize-parallel pragmas makes it work then the conclusion can only be that trying to print stuff in parallel processing is not a good idea. Switch the parallel processing off before printing, or use other variables there. Commented Jan 18, 2018 at 9:56
  • Thank you for bringing that to my attention. It's actually printing now(The k variable is not supposed to be at the last loop, it's supposed to be NCB...)... and my speedup has gone away ;-; . I will try measuring performance again but without using printf in either one of the programs this time. I have no idea how to use gdb(started programming recently) and the documentation looks... intimidating. Commented Jan 18, 2018 at 10:07
  • stackoverflow.com/questions/10624755/… Commented Jan 18, 2018 at 10:09

1 Answer 1

3

It's because of j < k condition in the loop:

for( j =0 ; j < k ; j ++)

The value of k differs when using openmp. Can you just replace k with NCB?

Sign up to request clarification or add additional context in comments.

6 Comments

Yep the comment guy also made me realize that... it's printing and now my speedup is gone ;-; Do you have any idea what I'm doing wrong? Thank you for answering.
You marked the value k private for threads, hence it's not shared with main thread and remains equal to 0 (can be undefined behaviour I think).
@TejasGarhewal: Just for clarity: you didn't really think the printing would be faster, right?
The printing is not parallelised in the program, only the computation.
Don't know , I removed printf() and got my speed up again just fine
|

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.