Jump to content

OpenMP OSX


besty
 Share

Recommended Posts

Boas,

estou a ter alguns problemas a obter resultados positivos, usando OpenMP, num Macbook Pro 13" 2010 usando o Xcode. Com o mesmo código consigo, usando o Virtual Studio 2008 Profissional e outra maquina, ter speedup em relação ao código sequencial ao paralelo. Quando mudo de plataforma a coisa não corre como queria. Até mesmo usando maquina virtual com o Windows XP e o Visual Studio, no mac, não consigo ter speedup. Alguém me consegue explicar porquê? Será que o OSX me está a bloquear a velocidade dos cores? Não consigo perceber.

Link to comment
Share on other sites

Não tenho a certeza sobre o funcionamento do clock() em Unix, mas acho que te devolve os clocks gastos pelas várias threads, e nesse caso não te permite avaliar o speedup.

Num exemplo rápido que fiz, com duas thread usava mais ciclos, mas demorava metade do tempo.

Penso que a função mais indicada para medir tempos em C é o gettimeofday.

Link to comment
Share on other sites

O programa consiste em calcular o valor de pi, o mais próximo possível dele. O código é o seguinte:

#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#include <unistd.h>
#include <omp.h>
#include <sys/types.h>
#include <time.h>
#include <sys/time.h>

#define iter 10000000

void sequencial();
void parallel();

int main (int argc, char* argv[])
{
sequencial();

parallel();

return 0;
}

void sequencial()
{
double x,y,z;
int i;
double numb=0;
int count=0;
long mtime, seconds, useconds;    

struct timeval start, end;

printf("Sequencial\n");

srand(time(NULL));

gettimeofday(&start, NULL);	

for(i=0; i<iter; i++)
{
	x = (double)rand()/RAND_MAX;
	y = (double)rand()/RAND_MAX;

	z = (x*x)+(y*y);

	if(z<1) count++;
}

printf("%d \n",count);

numb=(double)(4*count)/iter;
gettimeofday(&end, NULL);

seconds  = end.tv_sec  - start.tv_sec;
    useconds = end.tv_usec - start.tv_usec;

mtime = ((seconds) * 1000 + useconds/1000.0) + 0.5;

printf("pi = %f \n",numb);

printf("Elapsed time: %ld milliseconds\n", mtime);	
}

void parallel()
{
double x,y,z;
int i;
double numb=0;
int count=0;
long mtime, seconds, useconds;    

struct timeval start, end;

printf("Parallel\n");

srand(time(NULL));

omp_set_num_threads(omp_get_num_procs());

gettimeofday(&start, NULL);

#pragma omp parallel for reduction(+:count) private(x,y,z)

for(i=0; i<iter; i++)
{
	x = (double)rand()/RAND_MAX;
	y = (double)rand()/RAND_MAX;

	z = (x*x)+(y*y);

	if(z<1) count++;
}


printf("%d \n",count);

numb=(double)(4*count)/iter;

gettimeofday(&end, NULL);

seconds  = end.tv_sec  - start.tv_sec;
    useconds = end.tv_usec - start.tv_usec;

mtime = ((seconds) * 1000 + useconds/1000.0) + 0.5;

printf("pi = %f \n",numb);

printf("Elapsed time: %ld milliseconds\n", mtime);	
}
Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.