[Omp] slow performance
Herbert Fruechtl
Herbert.Fruchtl at uk.fujitsu.com
Wed Dec 15 07:12:37 PST 2004
You are not doing anything in parallel, but only replicating your work.
You need either an "omp parallel for" pragma, or "parallel" AND "for"
pragmas. Also be careful with accumulating your result. The statement
pi += sum;
needds an "atomic" pragma. Or better still, specify pi as "accumulate"
in your omp pragma.
Hope this helps,
Herbert
> -----Original Message-----
> From: Omp-bounces at openmp.org [mailto:Omp-bounces at openmp.org]
> On Behalf Of andrew wang
> Sent: 15 December 2004 14:53
> To: omp at openmp.org
> Subject: [Omp] slow performance
>
>
> Hello,
>
> I am pretty new to OpenMP, before do some real thing, I write
> a simple code
> to test my understanding. But to my
> big suprise, I see that the result is quite different from what I can
> imagine. The more threads I have, the more
> slow the calculation is.
>
> Can you help me to take a look at the source code and the
> result I got? Is
> it too much fork/join, but little time on calculation in each thread?
>
> Thanks
> Andrew
>
>
>
>
>
> source:
>
> #include <omp.h>
> #include <time.h>
> #include <stdio.h>
>
> static long num_steps = 1000000000L;
> double step;
>
> int omp_threads = 1;
>
> void main (int argc,char **argv) {
>
> double x, sum, pi=0.0;
> int id;
> time_t t1,t2,t11,t22;
> int ii, jj, kk, i;
> int total_time=0;
>
> (void) time(&t1);
>
>
> omp_threads=atoi(argv[1]);
>
>
> printf("omp_get_num_procs=%d\n",omp_get_num_procs());
>
> step = 1.0/(double) num_steps;
> omp_set_num_threads(omp_threads);
>
>
> for (i=0;i<16200;i++) {
>
> for (ii=0; ii<50; ii++)
> {
>
> (void) time(&t11);
> #pragma omp parallel private (jj,kk,x, sum)
> {
>
> id = omp_get_thread_num();
>
> for (jj=id;jj<3; jj=jj+omp_threads )
> {
>
> for (kk=0; kk< 50; kk ++){
>
>
> x = (kk+0.5)*step;
> sum += 4.0/(1.0+x*x);
> // more complicated calculation here.
> }
>
> pi += sum;
> }
> }
>
> (void) time(&t22);
> total_time += (long)(t22-t11);
>
> }
> }
>
>
> id = omp_get_thread_num();
>
>
> printf("Parallel region time=%d seconds\n", (int) total_time);
>
> (void) time(&t2);
> printf("Total time = %d seconds\n", (int) (t2-t1));
>
> }
>
> result:
>
>
> atlas1> a.out 1
> omp_get_num_procs=4
> Parallel region time=2 seconds
> Total time = 3 seconds
> atlas1> a.out 2
> omp_get_num_procs=4
> Parallel region time=41 seconds
> Total time = 41 seconds
> atlas1> a.out 3
> omp_get_num_procs=4
> Parallel region time=71 seconds
> Total time = 72 seconds
>
>
>
> _______________________________________________
> Omp mailing list
> Omp at openmp.org http://openmp.org/mailman/listinfo/omp_openmp.org
>
More information about the Omp
mailing list