PDA

View Full Version : برنامه نویسی با openmp



nana rad
سه شنبه 13 خرداد 1393, 10:37 صبح
من برنامه کویک سورتquicksort رو بصورت موازی با openmp نوشتم و الان استادم میگن باید affinity رورعایت کنی
کسی میتونه به من کمک کنه..
من کدها رو بفرستم که مشکلشو حل کنید
برنامه من کامل باید نشون بده که داره از کدوم هسته ها استفاده میکنه
لطفا کمکم کنید:ناراحت::ناراحت:

omid_kma
پنج شنبه 15 خرداد 1393, 01:07 صبح
کدتون رو بزارید همین جا کسی اگر بخواد نگاه می کنه !
فروم برنامه نویسی سرویس دیباگ رایگان که نیست !

nana rad
شنبه 17 خرداد 1393, 21:09 عصر
متاسفانه کدهامو بهم میریزه اینجا که بفرستمشون

nana rad
شنبه 17 خرداد 1393, 21:14 عصر
#include<stdafx.h>
#include <omp.h>
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <math.h>
#define MAX 1000
static int CmpInt(const void *a, const void *b)
{
return ( *(int*)a - *(int*)b );
}
/* Merge sorted lists A and B into list A. A must have dim >= m+n */
void merge(int A[], int B[], int m, int n)
{int i=0, j=0, k=0;
int size = m+n;
int *C = (int *)malloc(size*sizeof(int));
while (i < m && j < n) {
if (A[i] <= B[j])
C[k] = A[i++];
else C[k] = B[j++];
k++;
}
if (i < m)
for (int p = i; p < m; p++,k++)
C[k] = A[p];
else
for (int p = j; p < n; p++,k++)
C[k] = B[p];
for( i=0; i<size; i++ )
A[i] = C[i];
free(C);
}
/* Merges N sorted sub-sections of array a into final, fully sorted array a */
void arraymerge(int *a, int size, int *index, int N)
{int i;
while ( N>1 ) {
for( i=0; i<N; i++ )
index[i]=i*size/N;
index[N]=size;
#pragma omp parallel for private(i)
for( i=0; i<N; i+=2 )
{
merge(a+index[i],a+index[i+1],index[i+1]-index[i],index[i+2]-index[i+1]);
for(int i=0; i<size; i++)
fprintf(stderr,"after: %d %d\n",i,a[i]);
}
N /= 2;
}//while
}
int main(int argc,char **argv)
{int i,j;
// set up array to be sorted
int size = MAX;
int a[MAX];
for(j=0;j<MAX;j++)
a[j]=rand();
// set up threads
int threads = omp_get_max_threads();
if( argc == 3 ) // if( argc == 3 )
threads=2;
omp_set_num_threads(threads);
int *index = (int *)malloc((threads+1)*sizeof(int));
for(i=0; i<threads; i++)
index[i]=i*size/threads;
index[threads]=size;
/* Main parallel sort loop */
double start = omp_get_wtime();
#pragma omp parallel for private(i)
for(i=0; i<threads; i++)
qsort(a+index[i],index[i+1]-index[i],sizeof(int),CmpInt);
double middle = omp_get_wtime();
/* Merge sorted array pieces */
if( threads>1 )
arraymerge(a,size,index,threads);
double end = omp_get_wtime();
fprintf(stderr,"sort time = %g s, of which %g s is merge time\n",end-start,end-middle);
/* Check the sort -- output should never show "BAD: ..." */
for(int i=1; i<size; i++)
if( a[i-1]>a[i] )
fprintf(stderr,"BAD: %d %d %d\n",i,a[i-1],a[i]);
getch();
return 0;
}

Azar.099
شنبه 17 خرداد 1393, 22:39 عصر
دوست عزیز اگر کدتون را بزارید داخل تگ بهم نمیریزه ...
مثل الان کپی پیس نکنین توی صفحه ...

omid_kma
دوشنبه 19 خرداد 1393, 01:10 صبح
من فکر نمی کنم این که از qsort توی thread های مجزا استفاده کنین روش درستی برای نوشتن quick sort بصورت موازی باشه . چون هر thread یک قسمت از آرایه رو می خونه miss caching خیلی خیلی زیادی دارین و هم این که هر thread جداگانه pivot رو مشخص میکنه که بازم کار درستی نیست. به احتمال خیلی زیاد این الگوریتم از حالت معمولی هم کند تره)
واین روش merge ای که نوشتین زیاد جالب نیست . ( هم malloc که استفاده کردین cycle زیادی مصرف می کنه هم branch های بی مورد زیادی داره )
داخل pdf اول چند تا الگوریتم هست که راحت میتونین پیادشون کنین .
https://www.uio.no/studier/emner/matnat/ifi/INF3380/v10/undervisningsmateriale/inf3380-week12.pdf
https://www.google.de/?gws_rd=cr,ssl&ei=M9OUU6m0FuX64QSS_oGYCg#q=parallel+quick+sort+fi letype:pdf

nana rad
پنج شنبه 22 خرداد 1393, 18:07 عصر
این برنامه رو یه آقای هندی نوشتن که میگن زمان خیلی خوبی داره به اسم Romeel Dave

nana rad
پنج شنبه 22 خرداد 1393, 18:08 عصر
من تموم مطالبی که گفتید رو خوندم این میگه بهینه کار میکنه