Issues with omp simd

hello,

i am trying to optimize omp simd loop as follows

int main(int argc, char **argv)
{
const int size = 1000000;

float a[size], b[size],c[size];

#pragma omp simd
for (int i=0; i<size; ++i)
{
c[i]= a[i] + b[i];
}

return 0;
}

i run it using the following command;

g++ -O0 --std=c++14 -fopenmp-simd lab.cpp -Iinclude -S -o lab.s

when i compared it with code as follows without simd

int main(int argc, char **argv)
{
const int size = 1000000;

float a[size], b[size],c[size];

for (int i=0; i<size; ++i)
{
c[i]= a[i] + b[i];
}

return 0;
}

using following command

g++ -O0 --std=c++14 lab.cpp -Iinclude -S -o lab.s

I am getting the same assembly. Why is that so? why not omp simd is more efficient?

Please help

I didn’t look at the assembly, but you didn’t initialize your arrays. Your program isn’t meaningful.

I even tried following;

int main(int argc, char **argv)
{
const int size = 1000000;

float a[size], b[size],c[size];

#pragma omp simd
for (int i=0; i<size; ++i)
{
a[i]=2; b[i]=3; c[i]=4;
c[i]= a[i] + b[i];
}

return 0;
}

but the output with and without openmp simd is same. why is that so?

The for loop has no effect on the observable behavior of the program. If you run the program there is no way to tell if the numbers were added or not. So the loop doesn’t matter, so the compiler deleted the code. You need to print the contents of c or something so that it matters.

i changed my code to following;

#pragma omp simd
for (int i=0; i<size; ++i)
{
a[i]=2; b[i]=3; c[i]=4;
c[i]= a[i] + b[i];
printf(“c value %f”,c[i]);
}

still no effect of omp simd?

i changed my code to following;

#pragma omp simd
for (int i=0; i<size; ++i)
{
a[i]=2; b[i]=3; c[i]=4;
c[i]= a[i] + b[i];
printf(“c value %f”,c[i]);
}

still no effect of omp simd?

i changed my code to following;
   #pragma omp simd
        for (int i=0; i<size; ++i)
        {
             a[i]=2; b[i]=3; c[i]=4;
            c[i]= a[i] + b[i];
    printf("c value %f",c[i]);
        }

still no effect of omp simd?

> The for loop has no effect on the observable behavior of the program. If
> you run the program there is no way to tell if the numbers were added or
> not. So the loop doesn’t matter, so the compiler deleted the code. You need
> to print the contents of c or something so that it matters.

Printing within the loop is likely also not a good idea, as the side-effects of printf make vectorization harder. I typically just print
c[42] after the loop. Also, why don't you use -O3 rather than -O0?

Best,
Tobias