PDA

View Full Version : حرفه ای: سوال در مورد برنامه نویسی موازی....



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;
}

UfnCod3r
جمعه 07 تیر 1392, 14:50 عصر
در خیلی مواقع موازی کردن سرعتش خیلی کمتره
اگه درست استفاده بشه تا دو تا 4چهار برابری سرعت زیاد می شه
وگرنه فقط سرعتو کم می کنه ی سری شرایط داره که باید تشخیص بدی
مثلا من خودم ضرب یه سری ماتریس 4در4 رو موازی کردم دو برابری سریع تر شد (سی پیو 4 هسته ای):لبخند:

#pragma omp parallel for
for(int j = 0; j < nMatrix; j++)
{
matrixRes[j] = matrix[j];
XMatix4x4::Mul(&gMatVP, matrix[j], matrixMVP + j);
}

nMatrix همیشه بیش از 16 تا بوده پس اینجا ارزشش رو داشته
یا مثلا negative کردن پیکسل ها

void negativeColor(Color* c, int n)
{
#pragma omp parallel for
for(int i = 0; i < n; i++)
{
c[i] = 1.0f - c[i];
}
}


ی سری نکاتو باید توجه کنی
اول از همه باید داده هات زیاد باشن یک حلقه کوچیک ارزش نداره
دوم اینکه باید دستورات یک جور باشن طوری ک همه با هم کارشونو تموم کنن نه اینکه منتظم بمونن تا هسته ان ام پردازشش انجام بشه .
مثلا این ضرب ماتریسو ببینی خب ن شرطی داره نه بازگشتی فقط کارا تفسیم می شه و هر هسته سی پیو ضرب رو انجام میده
کلا برا این کاری ک شما نوشتی خوب نیست
هر جایی نمیشه استفاده کرک بعضی وقتا هم باعث کند شدن تا چند برابر هم میشه
خلاصه تشخیص می خواد:لبخند:

monadifard
جمعه 07 تیر 1392, 17:17 عصر
مرسی عزیز
میشه یه منبع فارسی از mpi معرفی کنید
آموزش کامل داده باشه
متشکر