miller
miller

Reputation: 1728

What is a right way to use task directive in OpenMP

I am trying to multiply two matrices using OpenMP task. This is a basic code:

long i, j, k;

   for (i = 0; i < N; i ++)
      for (j = 0; j < N; j ++)
         for (k = 0; k < N; k ++)
            c[i * N + j] += a[i * N + k] * b[k * N + j];

So, I want to use task on column level and then I modified code like this:

   long i, j, k;
#pragma omp parallel 
{
   #pragma omp single
   {
   for (i = 0; i < N; i ++)
     #pragma omp task private(i, j, k)
     {
      for (j = 0; j < N; j ++)
         for (k = 0; k < N; k ++)

            c[i * N + j] += a[i * N + k] * b[k * N + j];
      }
    }
  }

When I run a program I get message like this:

Segmentation fault (core dumped)

Now, I know I'm missing some piece, but can't figure it what. Any idea?

Upvotes: 0

Views: 283

Answers (1)

Hristo Iliev
Hristo Iliev

Reputation: 74405

private variables in OpenMP are not initialised and have random initial values. When the task executes, i would have random value and therefore probably lead to an out-of-bound access of c[] and a[].

firstprivate variables are similar to private, but have their initial value set to the value that the referenced variable had at the moment the construct is entered. In your case i has to be firstprivate and not private.

Also it is advisable that i is made private in the parallel region for a small performance increase. Thus the final code should look like this (with all variable sharing classes written explicitly and private variables declared in their use scopes):

#pragma omp parallel shared(a, b, c)
{
   #pragma omp single
   {
      long i;
      for (i = 0; i < N; i++)
         #pragma omp task shared(a, b, c) firstprivate(i)
         {
            int j, k;
            for (j = 0; j < N; j++)
               for (k = 0; k < N; k++)
                  c[i * N + j] += a[i * N + k] * b[k * N + j];
         }
   }
}

Upvotes: 1

Related Questions