db1234
db1234

Reputation: 807

Compiling using GSL and OpenMP

I am not the best when it comes to compiling/writing makefiles.

I am trying to write a program that uses both GSL and OpenMP.

I have no problem using GSL and OpenMP separately, but I'm having issues using both. For instance, I can compile the GSL program http://www.gnu.org/software/gsl/manual/html_node/An-Example-Program.html By typing

$gcc -c Bessel.c
$gcc Bessel.o -lgsl -lgslcblas -lm
$./a.out

and it works.

I was also able to compile the program that uses OpenMP that I found here: Starting a thread for each inner loop in OpenMP

In this case I typed

$gcc -fopenmp test_omp.c
$./a.out

And I got what I wanted (all 4 threads I have were used).

However, when I simply write a program that combines the two codes

#include <stdio.h>
#include <gsl/gsl_sf_bessel.h>
#include <omp.h> 

 int
 main (void)
 {
   double x = 5.0;
   double y = gsl_sf_bessel_J0 (x);
   printf ("J0(%g) = %.18e\n", x, y);


int dimension = 4;
int i = 0;
int j = 0;
#pragma omp parallel private(i, j)
for (i =0; i < dimension; i++)
    for (j = 0; j < dimension; j++)
        printf("i=%d, jjj=%d, thread = %d\n", i, j, omp_get_thread_num());

return 0;

 }

Then I try to compile to typing

$gcc -c Bessel_omp_test.c
$gcc Bessel_omp_test.o -fopenmp -lgsl -lgslcblas -lm
$./a.out

The GSL part works (The Bessel function is computed), but only one thread is used for the OpenMP part. I'm not sure what's wrong here...

Upvotes: 2

Views: 3316

Answers (2)

Hristo Iliev
Hristo Iliev

Reputation: 74435

You missed the worksharing directive for in your OpenMP part. It should be:

// Just in case GSL modifies the number of threads
omp_set_num_threads(omp_get_max_threads());
omp_set_dynamic(0);

#pragma omp parallel for private(i, j)
for (i =0; i < dimension; i++)
    for (j = 0; j < dimension; j++)
        printf("i=%d, jjj=%d, thread = %d\n", i, j, omp_get_thread_num());

Edit: To summarise the discussion in the comments below, the OP failed to supply -fopenmp during the compilation phase. That prevented GCC from recognising the OpenMP directives and thus no paralle code was generated.

Upvotes: 3

user1202136
user1202136

Reputation: 11567

IMHO, it's incorrect to declare the variables i and j as shared. Try declaring them private. Otherwise, each thread would get the same j and j++ would generate a race condition among threads.

Upvotes: 0

Related Questions