Paralelo para bucle en openmp

Estoy intentando paralelizar un bucle for muy simple, pero este es mi primer intento de usar OpenMP en mucho tiempo. Me estoy desconcertado por los tiempos de ejecución. Aquí está mi código:

#include <vector>
#include <algorithm>

using namespace std;

int main () 
{
    int n=400000,  m=1000;  
    double x=0,y=0;
    double s=0;
    vector< double > shifts(n,0);


    #pragma omp parallel for 
    for (int j=0; j<n; j++) {

        double r=0.0;
        for (int i=0; i < m; i++){

            double rand_g1 = cos(i/double(m));
            double rand_g2 = sin(i/double(m));     

            x += rand_g1;
            y += rand_g2;
            r += sqrt(rand_g1*rand_g1 + rand_g2*rand_g2);
        }
        shifts[j] = r / m;
    }

    cout << *std::max_element( shifts.begin(), shifts.end() ) << endl;
}

Lo compilo con

g++ -O3 testMP.cc -o testMP  -I /opt/boost_1_48_0/include

es decir, no hay "-fopenmp", y obtengo estos tiempos:

real    0m18.417s
user    0m18.357s
sys     0m0.004s

cuando uso "-fopenmp",

g++ -O3 -fopenmp testMP.cc -o testMP  -I /opt/boost_1_48_0/include

Obtengo estos números para los tiempos:

real    0m6.853s
user    0m52.007s
sys     0m0.008s

Lo que no tiene sentido para mí. ¿Cómo el uso de ocho núcleos solo puede dar como resultado un aumento de rendimiento de solo 3 veces? ¿Estoy codificando el bucle correctamente?

Respuestas a la pregunta(3)

Su respuesta a la pregunta