Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Couldn't get acceleration OpenMP

I am writing simple parallel program in C++ using OpenMP. I am working on Windows 7 and on Microsoft Visual Studio 2010 Ultimate. I changed the Language property of the project to "Yes/OpenMP" to support OpenMP

Here I provide the code:

#include <iostream>
#include <omp.h> 

using namespace std;

double sum; 
int i;
int n = 800000000;

int main(int argc, char *argv[])
{               
    omp_set_dynamic(0);
    omp_set_num_threads(4); 

    sum = 0;    
    #pragma omp for reduction(+:sum)
    for (i = 0; i < n; i++)
        sum+= i/(n/10);

    cout<<"sum="<<sum<<endl;        

    return  EXIT_SUCCESS;
}

But, I couldn't get any acceleration by changing the x in omp_set_num_threads(x); It doesn't matter if I use OpenMp or not, the calculating time is the same, about 7 seconds.

Does Someone know what is the problem?

like image 806
Nurlan Avatar asked Dec 28 '25 22:12

Nurlan


2 Answers

Your pragma statement is missing the parallel specifier:

#include <iostream>
#include <omp.h> 

using namespace std;

double sum; 
int i;
int n = 800000000;

int main(int argc, char *argv[])
{               
    omp_set_dynamic(0);
    omp_set_num_threads(4); 

    sum = 0;    
    #pragma omp parallel for reduction(+:sum)  //  add "parallel"
    for (i = 0; i < n; i++)
        sum+= i/(n/10);

    cout<<"sum="<<sum<<endl;        

    return  EXIT_SUCCESS;
}

Sequential:

sum=3.6e+009
2.30071

Parallel:

sum=3.6e+009
0.618365

Here's a version that some speedup with Hyperthreading. I had to increase the # of iterations by 10x and bump the datatypes to long long:

double sum; 
long long i;
long long n = 8000000000;

int main(int argc, char *argv[])
{               
    omp_set_dynamic(0);
    omp_set_num_threads(8); 

    double start = omp_get_wtime();


    sum = 0;    
    #pragma omp parallel for reduction(+:sum)
    for (i = 0; i < n; i++)
        sum+= i/(n/10);

    cout<<"sum="<<sum<<endl;       

    double end = omp_get_wtime(); 
    cout << end - start << endl;
    system("pause");

    return  EXIT_SUCCESS;
}

Threads: 1

sum=3.6e+014
13.0541

Threads: 2

sum=3.6e+010
6.62345

Threads: 4

sum=3.6e+010
3.85687

Threads: 8

sum=3.6e+010
3.285
like image 104
Mysticial Avatar answered Dec 30 '25 16:12

Mysticial


Apart from the error pointed out by Mystical, you seemed to assume that openMP can justs to magic. It can at best use all cores on your machine. If you have 2 cores, it may reduce the execution time by two if you call omp_set_num_threads(np) with np>=2, but for np much larger than the number of cores, the code will be inefficient due to parallelization overheads.

The example from Mystical was apparently run on at least 4 cores with np=4.

like image 21
Walter Avatar answered Dec 30 '25 18:12

Walter



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!