monadifard
جمعه 07 تیر 1392, 14:17 عصر
دوستان سلام
نمیدونم جای درستی دارم سوال رو میپرسم یا نه؟
در هر صورت لطف کنید
نوشتن برنامه به صورت موازی توسط open mp با زبان c
برنامه شناسایی عدد اول رو پیدا کردم ولی نمیدونم چرا سرعتش پایین تر از مدل مشابه ولی به صورت غیر موازی خودشه؟
مگه نباید سرعت موازی بیشتر از سری باشه؟
لطف کنید سریع جواب بدید برای امشب لازمش دارم
# include <stdlib.h>
# include <stdio.h>
# include <omp.h>
#include<time.h>
int main ( int argc, char *argv[] );
void prime_number_sweep ( int n_lo, int n_hi, int n_factor );
int prime_number ( int n );
/************************************************** ****************************/
int main ( int argc, char *argv[] )
{
int n_factor;
int n_hi;
int n_lo;
printf ( "\n" );
printf ( "PRIME_OPENMP\n" );
printf ( " C/OpenMP version\n" );
printf ( "\n" );
printf ( " Number of processors available = %d\n", omp_get_num_procs ( ) );
printf ( " Number of threads = %d\n", omp_get_max_threads ( ) );
omp_set_num_threads(4);
n_lo = 1;
n_hi = 131072;
n_factor = 2;
prime_number_sweep ( n_lo, n_hi, n_factor );
n_lo = 5;
n_hi = 500000;
n_factor = 10;
prime_number_sweep ( n_lo, n_hi, n_factor );
printf ( "\n" );
printf ( "PRIME_OPENMP\n" );
printf ( " Normal end of execution.\n" );
getchar();
return 0;
}
/************************************************** ****************************/
void prime_number_sweep ( int n_lo, int n_hi, int n_factor )
{
int i;
int n;
int primes;
double wtime;
printf ( "\n" );
printf ( "TEST01\n" );
printf ( " Call PRIME_NUMBER to count the primes from 1 to N.\n" );
printf ( "\n" );
printf ( " N Pi Time\n" );
printf ( "\n" );
n = n_lo;
while ( n <= n_hi )
{
wtime = omp_get_wtime ( );
primes = prime_number ( n );
wtime = omp_get_wtime ( ) - wtime;
printf ( " %8d %8d %14f\n", n, primes, wtime );
n = n * n_factor;
}
return;
}
/************************************************** ****************************/
int prime_number ( int n )
{
int i;
int j;
int prime;
int total = 0;
# pragma omp parallel \
shared ( n ) \
private ( i, j, prime )
# pragma omp for reduction ( + : total )
for ( i = 2; i <= n; i++ )
{
prime = 1;
for ( j = 2; j < i; j++ )
{
if ( i % j == 0 )
{
prime = 0;
break;
}
}
total = total + prime;
}
return total;
}
اینم مدل غیر موازی
#include<stdio.h>
#include<conio.h>
#include "stdafx.h"
#include<math.h>
#include<time.h>
void prime_numbers ( int n ){
int i;
int j;
int is_prime;
int total=0;
clock_t t;
t = clock();
for ( i = 2; i <= n; i++ )
{
is_prime = 1;
for ( j = 2; j <= sqrt(static_cast<float>(i)); j++ )
{
if ( i % j == 0 )
{
is_prime = 0;
break;
}
}
total=total+is_prime;
}
t = clock()-t;
printf ("\n It took me %d clicks (%f seconds).\n",t,((float)t)/CLOCKS_PER_SEC);
printf("total: %d ",total);
}
int main ( int argc, char *argv[] ){
prime_numbers (1048576);
getchar();
return 0;
}
نمیدونم جای درستی دارم سوال رو میپرسم یا نه؟
در هر صورت لطف کنید
نوشتن برنامه به صورت موازی توسط open mp با زبان c
برنامه شناسایی عدد اول رو پیدا کردم ولی نمیدونم چرا سرعتش پایین تر از مدل مشابه ولی به صورت غیر موازی خودشه؟
مگه نباید سرعت موازی بیشتر از سری باشه؟
لطف کنید سریع جواب بدید برای امشب لازمش دارم
# include <stdlib.h>
# include <stdio.h>
# include <omp.h>
#include<time.h>
int main ( int argc, char *argv[] );
void prime_number_sweep ( int n_lo, int n_hi, int n_factor );
int prime_number ( int n );
/************************************************** ****************************/
int main ( int argc, char *argv[] )
{
int n_factor;
int n_hi;
int n_lo;
printf ( "\n" );
printf ( "PRIME_OPENMP\n" );
printf ( " C/OpenMP version\n" );
printf ( "\n" );
printf ( " Number of processors available = %d\n", omp_get_num_procs ( ) );
printf ( " Number of threads = %d\n", omp_get_max_threads ( ) );
omp_set_num_threads(4);
n_lo = 1;
n_hi = 131072;
n_factor = 2;
prime_number_sweep ( n_lo, n_hi, n_factor );
n_lo = 5;
n_hi = 500000;
n_factor = 10;
prime_number_sweep ( n_lo, n_hi, n_factor );
printf ( "\n" );
printf ( "PRIME_OPENMP\n" );
printf ( " Normal end of execution.\n" );
getchar();
return 0;
}
/************************************************** ****************************/
void prime_number_sweep ( int n_lo, int n_hi, int n_factor )
{
int i;
int n;
int primes;
double wtime;
printf ( "\n" );
printf ( "TEST01\n" );
printf ( " Call PRIME_NUMBER to count the primes from 1 to N.\n" );
printf ( "\n" );
printf ( " N Pi Time\n" );
printf ( "\n" );
n = n_lo;
while ( n <= n_hi )
{
wtime = omp_get_wtime ( );
primes = prime_number ( n );
wtime = omp_get_wtime ( ) - wtime;
printf ( " %8d %8d %14f\n", n, primes, wtime );
n = n * n_factor;
}
return;
}
/************************************************** ****************************/
int prime_number ( int n )
{
int i;
int j;
int prime;
int total = 0;
# pragma omp parallel \
shared ( n ) \
private ( i, j, prime )
# pragma omp for reduction ( + : total )
for ( i = 2; i <= n; i++ )
{
prime = 1;
for ( j = 2; j < i; j++ )
{
if ( i % j == 0 )
{
prime = 0;
break;
}
}
total = total + prime;
}
return total;
}
اینم مدل غیر موازی
#include<stdio.h>
#include<conio.h>
#include "stdafx.h"
#include<math.h>
#include<time.h>
void prime_numbers ( int n ){
int i;
int j;
int is_prime;
int total=0;
clock_t t;
t = clock();
for ( i = 2; i <= n; i++ )
{
is_prime = 1;
for ( j = 2; j <= sqrt(static_cast<float>(i)); j++ )
{
if ( i % j == 0 )
{
is_prime = 0;
break;
}
}
total=total+is_prime;
}
t = clock()-t;
printf ("\n It took me %d clicks (%f seconds).\n",t,((float)t)/CLOCKS_PER_SEC);
printf("total: %d ",total);
}
int main ( int argc, char *argv[] ){
prime_numbers (1048576);
getchar();
return 0;
}