نمایش نتایج 1 تا 30 از 30

نام تاپیک: برنامه نویسی موازی در vs C++‎ 2010 به وسیله OPENMP

  1. #1

    Lightbulb برنامه نویسی موازی در vs C++‎‎ 2010 به وسیله OPENMP

    برنامه نویسی موازی با OPENMP
    هنوز ابتدای راهم اما بلاخره بعد از مدت ها تونستم راه اندازی OPENMP رو در ویژوال استودیو 2010 (visual studio 2010) رو پیدا کنم چون هرچه هم کتابخانه omp.h رو include می کردم فایده نداشت.
    این مختصر رو اینجا می نویسم امیدوارم اگر کسی هم مثل من مشکلی براش پیش اومد بتونه از این راهنمایی استفاده کنه.
    برای راه اندازی ابتدا یک پروژه C++‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎ ‎ ایجاد می کنیم البته از نوع win32 consol application توجه داشته باشید از پنجره application setting علامت تیک perecompiled heder رو بردارید (یعنی این گزینه نباید انتخاب شده باشه) بعد ok کنید.
    قسمت اصل کاری:
    در قسمت solution explorer روی پروژه راست کلیک کنید بعد این مسیر رو برید
    peroperties-> configuration peroperties-> c/C++‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎ -> language

    حالا از فریم کناری گزینه openmp support رو yes می کنیم بعدم applay و ok می کنیم.
    حالا دیگه پروژه شما OPENMP رو پشتیبانی می کنه.
    بعد یک فایل .cpp هم برای برنامه نویسی ایجاد می کنیم و داخلش باید برای استفاده از openmp فایل omp.h رو include کنیم.

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

    اینم لینک یه راهنمای خارجی که باز هم دستورات رو خیلی خوب و همراه مثال توضیح داده

    اینم یه نمونه کد کوتاه برای اینکه ببنید برنامه بصورت موازی اجرا می شه یا نه.
    خروجی برنامه باید چاپ اعداد یک تا ده بصورت نامرتب باشه (چون هر عدد توسط یک thread بصورت موازی با threadهای دیگه چاپ میشه و ممکنه threadها پشت سر هم اجرا نشن(این خاصیت برنامه نویسی موازی هست اگر اعداد مرتب چاپ شد به موازی سازی تون شک کنید)
    در این برنامه چون پردازنده من دو هسته ای هست برنامه برام دوتا thread درست می کنه و همه دستورات چاپ رو دوبار برام چاپ می کنه و اعداد داخل حلقه رو هم قاطی دستورات چاپ دیگه چاپ می کنه:) !!!!!!
    باید از دستورات هماهنگ سازی استفاده کرد که من هنوز باهاشون کار نکردم.
    انشاءالله که خدا کمک کنه بیشتر یاد بگیرم اینجا هم بیشتر درباره OPENMP و برنامه نویسی موازی با اون می نویسم.

    اگر دوستان مطلبی بلد هستن به من هم یاد بدن جای دوری نمیره (خدا یک در دنیا صد در آخرت عوض خیر بهتون بده آمییییین)

    اینم اون کد که بهتون گفتم
    #include<omp.h>
    #include<stdio.h>
    #include<conio.h>
    long int i,j,a,k;
    int main(int argc, char* argv[])
    {omp_set_num_threads(4);
    omp_set_dynamic(true);
    omp_set_nested(true);


    #pragma omp parallel shared(i,j,a) num_threads(4)

    {
    k=omp_get_num_procs();
    printf("number of processor= %d \n",k);
    k=omp_in_parallel();
    printf("if program in paralle=1 or serial=0 ?? %d \n",k);
    k=omp_get_max_threads();
    printf("muaximum number of thread= %d \n",k);
    k=omp_get_num_threads();
    printf("number of threads= %d \n",k);
    k=omp_get_thread_num();
    printf("thread number is= %d \n",k);

    #pragma omp for
    for(j=0;j<10;j++)
    printf("%d",j);

    }

    j=0;
    getch();
    return 0;
    }

    خدا خیر بده هرکسی این داکیومنتو درست کرده (از لینک زیر دانلود کیند)

    اگر خدا بخواد تجربیات برنامه نویسی خودم رو هم اینجا میگذارم
    ***************** مطلب جدید *************
    طریقه ایجاد حلقه تو در تو در OpenMP نسخه 2.0 (از نسخه 3.0 به بعد حلقه های تو در تو پشتیبانی می شن.)
    یک راه جالب توی کتاب OpenMP پیدا کردم دوتا حلقه تو در تو رو می شه به یکی از این دو شیوه موازی کرد نمی دونم حلقه سوم رو هم با همین شیوه می شه موازی کرد یا نه اما همینم غنیمته.
    شیوه اول:

    #pragma omp parallel default (shared)
    {
    #pragma omp for
    for(i=0;i<n;i++)
    {
    #pragma omp parallel shared(i,n)
    {
    #pragma omp for
    for(j=0;j<n;j++)
    work(i,j);
    }
    }
    }

    شیوه دوم:

    #pragma omp parallel default (shared)
    {
    #pragma omp for
    for(i=0;i<n;i++)
    work1(i,n);
    }

    void work1(int 1, int n)
    {
    int j;
    #pragma omp for
    for(j=0;j<n;j++)
    work2(i,j);
    }

    ***************************************

    اگر میخواید برنامه نویسی بسیار موازی با cuda رو هم تازه شروع کنید این دو لینک خیلی به دردتون خواهد خورد
    برای نصب و راه اندازی cuda روی ویژوال استودیو C++‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎ ‎ به لینک زیر برید

    و برای آشنایی با نحوه نوشتن یک برنامه موازی کوتاه در cuda به لینک زیر برید

    درپناه حق تعالی باشید

    بقیه آموزش ها رو توی این تاپیک گذاشتم
    https://barnamenevis.org/showthread.p...7-%D8%A7%DB%8C

    --------------------------------
    زکات علم نشر آن است. مولی علی(ع)
    آخرین ویرایش به وسیله sibooy : چهارشنبه 18 تیر 1393 در 18:57 عصر دلیل: قسمت اصلی مطلب جا افتاده بود، اضافه ش کردم

  2. #2

    نقل قول: برنامه نویسی موازی در vs C++‎ 2010 به وسیله OPENMP

    دوست عزیز توی این زمینه چقدر کار کردین؟ یه برنامه دارم که باید با omp بنویسم میشه کمکم کنین؟ منظور از دستور shared چیه؟

  3. #3

    نقل قول: برنامه نویسی موازی در vs C++‎ 2010 به وسیله OPENMP

    سلام دوست عزیز
    shared منظور متغیرهایی هست که بین همه نخ ها به اشتراک گذاشته میشه.
    راستش نمی دونم بگ چقدر. در حدی که مورد نیازم بوده. بیشتر برای کارای محاسبتی استفاده کردم.

  4. #4

    نقل قول: برنامه نویسی موازی در vs C++‎ 2010 به وسیله OPENMP

    با عرض سلام خدمت اساتید عزیز بنده قصد دارم این قطعه کد رو موازی سازی کنم

    for (i=1; i<=n-diagonal; i++)
    {
    j=i+diagonal;
    sum=0;
    for (m=i; m<=j; m++)
    sum+=P[m];
    A[i][j]=A[i][i-1]+A[i+1][j]+sum;
    R[i][j]=i;

    for (k=i; k<=j; k++)
    {
    min=A[i][k-1]+A[k+1][j]+sum;
    if(min<A[i][j])
    {
    A[i][j]=min;
    R[i][j]=k;
    }
    }
    }


    با توجه به راهنمایی هایی که کردین من این چند خط رو به ابتدای کد ام اضافه کردم

    #pragma omp parallel shared(i,j,m,k,sum,min) num_threads(4)
    {
    #pragma omp for

    ولی مشکل این هست که در حالت موازی به جای تسریع دیر تر به جواب میرسم میشه لطفا منو راهنمایی کنید آیا موازی سازی رو درست انجام دادم؟ آیا pragma omp for هارو میشه برای هر for تو در تو بنویسم؟ خیلی واجبه اساتید لطفا کمکم کنین

  5. #5

    نقل قول: برنامه نویسی موازی در vs C++‎ 2010 به وسیله OPENMP

    در ضمن تعداد thread هام 4 تا هست...

  6. #6

    نقل قول: برنامه نویسی موازی در vs C++‎‎ 2010 به وسیله OPENMP

    در ضمن پردازنده ام core i5 و تعداد thread هام 4 تا هست...

  7. #7

    نقل قول: برنامه نویسی موازی در vs C++‎ 2010 به وسیله OPENMP

    سلام دوست عزیز
    خواستم اول برنامه تون رو خودم امتحان کنم. ولی نه! اول اون جیزایی که تو ذهنمه می گم. برنامه شما وارد محیط موازی سازی می شه؟
    اینکه بتونید for های تو در تو رو موازی کنید بستگی به نسخه OpenMp داره که شما استفاده می کنید. ویژوال استودیو 2010 از OpenMP نسخه 2.0 پشتیبانی می کنه که این نسخه فقط خارجی ترین حلقه رو موازی می کنه و حلقه های داخلی بصورت سریال اجرا می شن.
    نسخه 3.0 OpenMP فقط با اضافه کردن عبارت colaps() و قرار دادن تعداد حلقه های تو درتویی که میخواید موازی اجرا بشه در قسمت () حلقه ها رو تا هر عمقی که می خواید موازی اجرا می کنه.
    فکر می کنم ویژوال استودیو 2012 از OpenMp نسخه 3.0 پشتیبانی کنه.
    توی این لینک طریقه موازی کردن تو در تو توضیح داده شده.
    http://www.shabakeh-mag.com/article.aspx?id=1004072

    حالا برنامه شما اجازه بدید من ببرم رو کامپیوتر خودم اجرا کنم بعد نتیجه ش رو بهتون می گم
    یک سوال برنامه ای که نوشتید ساختارش به این صورته؟


    #pragma omp parallel shared(i,j,m,k,sum,min) num_threads(4)
    {
    #pragma omp for
    for (i=1; i<=n-diagonal; i++)
    {
    j=i+diagonal;
    sum=0;
    for (m=i; m<=j; m++)
    sum+=P[m];
    A[i][j]=A[i][i-1]+A[i+1][j]+sum;
    R[i][j]=i;

    for (k=i; k<=j; k++)
    {
    min=A[i][k-1]+A[k+1][j]+sum;
    if(min<A[i][j])
    {
    A[i][j]=min;
    R[i][j]=k;
    }
    }
    }
    }

    آخرین ویرایش به وسیله sibooy : دوشنبه 07 مرداد 1392 در 16:10 عصر

  8. #8

    نقل قول: برنامه نویسی موازی در vs C++‎ 2010 به وسیله OPENMP

    نقل قول نوشته شده توسط ka1_fire
    سلام دوست عزیزم مرسی بابت این که وقت گذاشتین و پاسخ دادین بله 4 تا thread رو میشناسه رو سیستم ام
    }[/LTR_INLINE]
    من برنامه شما رو روی کامپیوترم اجرا کردم. وقتی بیرونی ترین حلقه رو موازی می کنید زمان پردازش افزایش پیدا می کنه. من فکر می کنم ممکنه که به خاطر وابستگی بین شمارنده های حلقه های داخلی به شمارنده حلقه خارجی باشه.
    برای اینکه بتونید بهترین نتیجه رو از موازی سازی بگیرید باید انجام کارهاتون به اندازه کافی استقلال داشته باشه. وقتی داده های وابسته به هم داشته باشید این می شه که نخ ها هی با هم تداخل پیدا می کنن و زمان پردازش افزایش پیدا می کنه.
    مثلا اگر شما بخواید کل کارهای این حلقه رو 200 بار انجام بدین و این 200 بار موازی اجرا بشه زمان اجرای برنامه بهبود پیدا می کنه اما چون همه نخ ها دارن روی یک آرایه مشترک کار می کنن باز هم تداخل وجود داره. توی یه پردازنده چهار هسته ای باید چیزی حدود 30 تا 40 درصد افزایش سرعت داشته باشید که ما اینجا نداریم.
    یک همچین کدی رو ببینید؛ هیچ کدام از شمارنده ها به هم وابسته نیستن

    #pragma omp parallel num_threads(4)
    {
    #pragma omp for ordered schedule (static)
    for(i2=0;i2<5000;i2++)
    for(j2=0;j2<5000;j2++)
    R[i2][j2]=i2*j2;
    #pragma omp for ordered schedule (static)
    for(i2=0;i2<5000;i2++)
    for(j2=0;j2<5000;j2++)
    A[i2][j2]=R[2][j2]+i2*j2;
    }


    من این کد رو با 4 نخ روی یک پردازنده دو هسته ای اجرا کردم 0.266 ثانیه طول کشید با 2 تا نخ 0.281 ثانیه و با یک نخ 0.391 ثانیه

    حالا اگه بخوایم کل کد شما رو 200 بار بصورت موازی اجرا کنیم. یعنی کد

    for(i2=0;i2<200;i2++) /*******************/

    رو به کدتون اضافه کنیم (همون قسمت که با ستاره مشخص شده)
    i2 یک متغیر مستقله و موازی سازی روش جواب مثبت میده اما چون خونه های آرایه هاتون بین نخ ها مشترک استفاده می شه بازم اونطور که باید کاهش زمان نداریم
    این کد رو ببینید

    #pragma omp parallel num_threads(4)
    {
    #pragma omp for ordered schedule (static)
    for(i2=0;i2<200;i2++) /*******************/
    for (i=1; i<n-diagonal; i++)
    {
    j=i+diagonal;
    sum=0;
    for (m=0; m<j; m++)
    sum+=P[m];
    A[i][j]=A[i][j-1]+A[i+1][j]+sum;
    R[i][j]=i;

    for (k=0; k<j; k++)
    {
    min=A[i][k-1]+A[k+1][j]+sum;
    if(min<A[i][j])
    {
    A[i][j]=min;
    R[i][j]=k;
    }
    }
    i1=i;
    }
    }


    اگه می تونید الگوریتم رو طوری تغییر بدید که متغیرها (می بخشید شمارنده ها) مستقل باشن

  9. #9

    نقل قول: برنامه نویسی موازی در vs C++‎ 2010 به وسیله OPENMP

    نقل قول نوشته شده توسط sibooy مشاهده تاپیک
    من برنامه شما رو روی کامپیوترم اجرا کردم. وقتی بیرونی ترین حلقه رو موازی می کنید زمان پردازش افزایش پیدا می کنه. من فکر می کنم ممکنه که به خاطر وابستگی بین شمارنده های حلقه های داخلی به شمارنده حلقه خارجی باشه.
    برای اینکه بتونید بهترین نتیجه رو از موازی سازی بگیرید باید انجام کارهاتون به اندازه کافی استقلال داشته باشه. وقتی داده های وابسته به هم داشته باشید این می شه که نخ ها هی با هم تداخل پیدا می کنن و زمان پردازش افزایش پیدا می کنه.
    مثلا اگر شما بخواید کل کارهای این حلقه رو 200 بار انجام بدین و این 200 بار موازی اجرا بشه زمان اجرای برنامه بهبود پیدا می کنه اما چون همه نخ ها دارن روی یک آرایه مشترک کار می کنن باز هم تداخل وجود داره. توی یه پردازنده چهار هسته ای باید چیزی حدود 30 تا 40 درصد افزایش سرعت داشته باشید که ما اینجا نداریم.
    یک همچین کدی رو ببینید؛ هیچ کدام از شمارنده ها به هم وابسته نیستن

    #pragma omp parallel num_threads(4)
    {
    #pragma omp for ordered schedule (static)
    for(i2=0;i2<5000;i2++)
    for(j2=0;j2<5000;j2++)
    R[i2][j2]=i2*j2;
    #pragma omp for ordered schedule (static)
    for(i2=0;i2<5000;i2++)
    for(j2=0;j2<5000;j2++)
    A[i2][j2]=R[2][j2]+i2*j2;
    }


    من این کد رو با 4 نخ روی یک پردازنده دو هسته ای اجرا کردم 0.266 ثانیه طول کشید با 2 تا نخ 0.281 ثانیه و با یک نخ 0.391 ثانیه

    حالا اگه بخوایم کل کد شما رو 200 بار بصورت موازی اجرا کنیم. یعنی کد

    for(i2=0;i2<200;i2++) /*******************/

    رو به کدتون اضافه کنیم (همون قسمت که با ستاره مشخص شده)
    i2 یک متغیر مستقله و موازی سازی روش جواب مثبت میده اما چون خونه های آرایه هاتون بین نخ ها مشترک استفاده می شه بازم اونطور که باید کاهش زمان نداریم
    این کد رو ببینید

    #pragma omp parallel num_threads(4)
    {
    #pragma omp for ordered schedule (static)
    for(i2=0;i2<200;i2++) /*******************/
    for (i=1; i<n-diagonal; i++)
    {
    j=i+diagonal;
    sum=0;
    for (m=0; m<j; m++)
    sum+=P[m];
    A[i][j]=A[i][j-1]+A[i+1][j]+sum;
    R[i][j]=i;

    for (k=0; k<j; k++)
    {
    min=A[i][k-1]+A[k+1][j]+sum;
    if(min<A[i][j])
    {
    A[i][j]=min;
    R[i][j]=k;
    }
    }
    i1=i;
    }
    }


    اگه می تونید الگوریتم رو طوری تغییر بدید که متغیرها (می بخشید شمارنده ها) مستقل باشن
    دوست عزیزم خیلی ممنون که کمک میکنین بله میخوام با یک الگوریتم جدید مثل اگوریتم SA داده هام رو تقسیم کنم و این عملیات رو روی هر کدوم مستقلن انجام بدم ولی خودم نمیدونم چه جوری اساتیدی که الگوریتم خوب بلدن کمک کنن خیلی ممنون میشم

  10. #10

    نقل قول: برنامه نویسی موازی در vs C++‎ 2010 به وسیله OPENMP

    سلام
    درمورد بهبود الگوریتم به نظرم باید توی چندتا از تالارها سوالتون رو مطرح کنید دوستان زیادی هستن که می تونن کمکتون کنن.
    درمورد thread share برای ساختارای دیگه مثل section بود فکر می کنم (اگر یادم نرفته باشه حافظه درست و درمانی ندارم) خیلی کاربرد داره. برای for فکر نکنم زیاد به درد بخوره.
    دوم اینکه خیلی خوبه که اینقدر افزایش سرعت دارید.
    اگر فقط کارتون با OpenMP و پردازنده های چند هسته ای راه میفته که هیچ. من نظر خاص دیگه ای ندارم ولی اگر فقط قصدتون پردازش موازی هست و افزایش سرعت می تونید با استفاده از پردازنده گرافیکی CUDA یه افزایش سرعت فوق العاده رو داشته باشید. حتی اگه از نسخه های بالاتر OpenMP استفاده کنید محاله به افزایش سرعتب بیش از چهار برابر (متناسب با تعداد هسته های پردازنده) داشته باشید.
    محاسبات من با پردازنده های چند هسته ای دو تا سه برابر افزایش سرعت داشت(متناسب با تعداد هسته ها).
    اما با استفاده از پردازنده گرافیکی چیزی حدود 58 برابر افزایش سرعت داشتم.
    البته بازم اینو یاد آوری کنم که برای استفاده از پردازنده های گرافیکی باید استقلال کارهاتون خیلی بالا باشه.
    و همچنین حجم محاسباتتون انقدر زیاد باشه که به زمان انتقال داده از حافظه رم به حافظه پردازنده گرافیکی غلبه کنه.
    مورد دیگه ای که فرموده بودین. C++‎‎‎ ویژوال استودیو آرایه های خیلی بزرگ رو نمی تونه ساپورت کنه البته یه تنظیماتی داره
    من این سوال رو توی فروم مطرح کردم یه بلبشویی را افتاد بیا و ببین. اما یه بنده خدایی یه جواب درست بهم داد
    اونم اینه
    project properties\c,C++‎‎‎\linker\system\enable large address

    تقریبا فضای آدرس دهی آرایه رو تا دو برابر افزایش میده
    خواستید امتحان کنید
    اینم لینک اون پست. شاید توی نظرات دیگه ای که دوستان دادن چیز بدرد بخورتری پیدا کنید

    در پناه خدای یکتا موفق باشید

  11. #11

    نقل قول: برنامه نویسی موازی در vs C++‎ 2010 به وسیله OPENMP

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

  12. #12

    نقل قول: برنامه نویسی موازی در vs C++‎ 2010 به وسیله OPENMP

    در مورد thread shareباید بگم وقتی حذف میکنم جوابه اشتباه میده. میشه لطف کنین و بگین چه طوری میتونم با استفاده از پردازنده گرافیکی CUDA افزایش سرعت داشته باشم؟ چون تا حالا در این زمینه کار نکردم. تا الگوریتم تغییر نکنه فکر نکنم با استفاده از mpi هم به نتیجه برسم چون الگوریتم به گونه ای است که حافظه اشتراکی بهتر به جواب میرسه نظر شما چیه؟ من دنبال تسریع هستم حالا به هر طریقی وقتی تعداد آرایه ام 4000 تا هست در حالت موازی 273 ثانیه و در حالت سری 440 ثانیه است که عملا دردی رو دوا نمیکنه حالا باید به نظر شما از کدوم روش استفاده کنم تغییر الگوریتم و استفاده از ترکیب mpi و openmp و یا استفاده از پردازنده گرافیکی CUDA؟؟؟

  13. #13

    نقل قول: برنامه نویسی موازی در vs C++‎ 2010 به وسیله OPENMP

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

  14. #14

    نقل قول: برنامه نویسی موازی در vs C++‎ 2010 به وسیله OPENMP

    در این پست هم روش نصب CUDA هم یک مثال از اون رو گذاشتم. هم برنامه نویسی موازی روی پردازنده های چندهسته ای با openMP رو با یک مثال گذاشتم.

    دوستان اگر نکته ای آموزشی چیزی در مورد برنامه نویسی موازی با پردازنده های چند هسته ای پردازنده های گرافیکی و چند پردازنده ای بلدید همونجا بذارید.

  15. #15
    کاربر جدید
    تاریخ عضویت
    خرداد 1392
    محل زندگی
    مشهد
    پست
    8

    نقل قول: برنامه نویسی موازی در vs C++‎ 2010 به وسیله OPENMP

    سلام خسته نباشید
    من میخواستم پوسته محدب(convex hull) را با openmp بنویسم میتونید یکم کمکم کنید
    ممنون میشم
    اینم میل منه
    safiyehpor@yahoo.com

  16. #16

    نقل قول: برنامه نویسی موازی در vs C++‎ 2010 به وسیله OPENMP

    دوست عزیز پوسته محدب اصلا چی هست؟

  17. #17

    نقل قول: برنامه نویسی موازی در vs C++‎ 2010 به وسیله OPENMP

    با سلام
    دوستای عزیز من به الگوریتم مرتب سازی های مختلف مثل مرتب سازی درجی، ادغام،.... و همین طور الگوریتم های bfs و dfs که با openmp موازی شدن خیلی خیلی نیاز دارم
    ممنون میشم اگه کسی بتونه کمکم کنه
    مرسی

  18. #18

    نقل قول: برنامه نویسی موازی در vs C++‎ 2010 به وسیله OPENMP

    سلام عزیز
    برای موازی کردن در open mp ابتدا بعد از نوشتن کد هاتون با توجه به اینکه میخوایی چند تا پروسز رو به کار بگیرید و یا چند تا ترد ایجاد کنید از قطعه برنامه زیر استفاده کنید.
    int omp_ get_num_procs (void
    void omp_ get_num_thread (int t

  19. #19

    نقل قول: برنامه نویسی موازی در vs C++‎ 2010 به وسیله OPENMP

    کسی میتونه این کدضرب ماتریس رو موازی کنه

    که سه حلقه تودر توه
    چطور موازیش کنم

  20. #20

    نقل قول: برنامه نویسی موازی در vs C++‎‎ 2010 به وسیله OPENMP

    سلام من این برنامه رو کپی کردم اجرا کردم اعداد به صورت مرتب چاپ میشه که !!!!!!!!!!!!!!!!!!1

  21. #21

    نقل قول: برنامه نویسی موازی در vs C++‎‎ 2010 به وسیله OPENMP

    نقل قول نوشته شده توسط sibooy مشاهده تاپیک
    برنامه نویسی موازی با OPENMP
    هنوز ابتدای راهم اما بلاخره بعد از مدت ها تونستم راه اندازی OPENMP رو در ویژوال استودیو 2010 (visual studio 2010) رو پیدا کنم چون هرچه هم کتابخانه omp.h رو include می کردم فایده نداشت.
    این مختصر رو اینجا می نویسم امیدوارم اگر کسی هم مثل من مشکلی براش پیش اومد بتونه از این راهنمایی استفاده کنه.
    برای راه اندازی ابتدا یک پروژه C++‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎ ایجاد می کنیم البته از نوع win32 consol application توجه داشته باشید از پنجره application setting علامت تیک perecompiled heder رو بردارید (یعنی این گزینه نباید انتخاب شده باشه) بعد ok کنید.
    قسمت اصل کاری:
    در قسمت solution explorer روی پروژه راست کلیک کنید بعد این مسیر رو برید
    peroperties-> configuration peroperties-> c/C++‎‎‎‎‎‎‎‎‎‎‎‎‎‎ -> language

    حالا از فریم کناری گزینه openmp support رو yes می کنیم بعدم applay و ok می کنیم.
    حالا دیگه پروژه شما OPENMP رو پشتیبانی می کنه.
    بعد یک فایل .cpp هم برای برنامه نویسی ایجاد می کنیم و داخلش باید برای استفاده از openmp فایل omp.h رو include کنیم.

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

    اینم لینک یه راهنمای خارجی که باز هم دستورات رو خیلی خوب و همراه مثال توضیح داده

    اینم یه نمونه کد کوتاه برای اینکه ببنید برنامه بصورت موازی اجرا می شه یا نه.
    خروجی برنامه باید چاپ اعداد یک تا ده بصورت نامرتب باشه (چون هر عدد توسط یک thread بصورت موازی با threadهای دیگه چاپ میشه و ممکنه threadها پشت سر هم اجرا نشن(این خاصیت برنامه نویسی موازی هست اگر اعداد مرتب چاپ شد به موازی سازی تون شک کنید)
    در این برنامه چون پردازنده من دو هسته ای هست برنامه برام دوتا thread درست می کنه و همه دستورات چاپ رو دوبار برام چاپ می کنه و اعداد داخل حلقه رو هم قاطی دستورات چاپ دیگه چاپ می کنه:) !!!!!!
    باید از دستورات هماهنگ سازی استفاده کرد که من هنوز باهاشون کار نکردم.
    انشاءالله که خدا کمک کنه بیشتر یاد بگیرم اینجا هم بیشتر درباره OPENMP و برنامه نویسی موازی با اون می نویسم.

    اگر دوستان مطلبی بلد هستن به من هم یاد بدن جای دوری نمیره (خدا یک در دنیا صد در آخرت عوض خیر بهتون بده آمییییین)

    اینم اون کد که بهتون گفتم
    #include<omp.h>
    #include<stdio.h>
    #include<conio.h>
    long int i,j,a,k;
    int main(int argc, char* argv[])
    {omp_set_num_threads(4);
    omp_set_dynamic(true);
    omp_set_nested(true);


    #pragma omp parallel shared(i,j,a) num_threads(4)

    {
    k=omp_get_num_procs();
    printf("number of processor= %d \n",k);
    k=omp_in_parallel();
    printf("if program in paralle=1 or serial=0 ?? %d \n",k);
    k=omp_get_max_threads();
    printf("muaximum number of thread= %d \n",k);
    k=omp_get_num_threads();
    printf("number of threads= %d \n",k);
    k=omp_get_thread_num();
    printf("thread number is= %d \n",k);

    #pragma omp for
    for(j=0;j<10;j++)
    printf("%d",j);

    }

    j=0;
    getch();
    return 0;
    }

    خدا خیر بده هرکسی این داکیومنتو درست کرده (از لینک زیر دانلود کیند)

    اگر خدا بخواد تجربیات برنامه نویسی خودم رو هم اینجا میگذارم
    ***************** مطلب جدید *************
    طریقه ایجاد حلقه تو در تو در OpenMP نسخه 2.0 (از نسخه 3.0 به بعد حلقه های تو در تو پشتیبانی می شن.)
    یک راه جالب توی کتاب OpenMP پیدا کردم دوتا حلقه تو در تو رو می شه به یکی از این دو شیوه موازی کرد نمی دونم حلقه سوم رو هم با همین شیوه می شه موازی کرد یا نه اما همینم غنیمته.
    شیوه اول:

    #pragma omp parallel default (shared)
    {
    #pragma omp for
    for(i=0;i<n;i++)
    {
    #pragma omp parallel shared(i,n)
    {
    #pragma omp for
    for(j=0;j<n;j++)
    work(i,j);
    }
    }
    }

    شیوه دوم:

    #pragma omp parallel default (shared)
    {
    #pragma omp for
    for(i=0;i<n;i++)
    work1(i,n);
    }

    void work1(int 1, int n)
    {
    int j;
    #pragma omp for
    for(j=0;j<n;j++)
    work2(i,j);
    }

    ***************************************

    اگر میخواید برنامه نویسی بسیار موازی با cuda رو هم تازه شروع کنید این دو لینک خیلی به دردتون خواهد خورد
    برای نصب و راه اندازی cuda روی ویژوال استودیو C++‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎ به لینک زیر برید

    و برای آشنایی با نحوه نوشتن یک برنامه موازی کوتاه در cuda به لینک زیر برید

    درپناه حق تعالی باشید

    --------------------------------
    زکات علم نشر آن است. مولی علی(ع)
    من به این کد برای بخشی از برنامه ام نیاز دارم که تعداد سی پی یو ها رو چاپ کنه اما این برنامه اعداد رو برای من مرتب چاپ میزنه؟؟؟؟؟؟؟؟؟؟؟؟

  22. #22

    نقل قول: برنامه نویسی موازی در vs C++‎‎ 2010 به وسیله OPENMP

    سلام
    آیا اصلا وارد محیط موازی میشید؟ باید این پیغام براتون چاپ بشه
    if program in paralle=1 or serial=0 ? 1

    اگر پیغام مثل زیر باشه یعنی وارد محیط موازی نشدین
    if program in paralle=1 or serial=0 ? 0

    اگر وارد محیط موازی نشدین باید تنظیماتتون رو درست انجام بدین

  23. #23

    نقل قول: برنامه نویسی موازی در vs C++‎‎ 2010 به وسیله OPENMP

    نقل قول نوشته شده توسط nana rad مشاهده تاپیک
    سلام من این برنامه رو کپی کردم اجرا کردم اعداد به صورت مرتب چاپ میشه که !!!!!!!!!!!!!!!!!!1
    سلام
    آیا اصلا وارد محیط موازی میشید؟ باید این پیغام براتون چاپ بشه
    if program in paralle=1 or serial=0 ? 1

    اگر پیغام مثل زیر باشه یعنی وارد محیط موازی نشدین
    if program in paralle=1 or serial=0 ? 0

    اگر وارد محیط موازی نشدین باید تنظیماتتون رو درست انجام بدین

  24. #24

    نقل قول: برنامه نویسی موازی در vs C++‎ 2010 به وسیله OPENMP

    سلام
    من می خوام با mpi ، مرتب سازی ادغامی و بنویسم تا به حال هم برنامه نویسی موازی کار نکردم میشه را هنمایی کنین از کجا شروع کنم؟
    با تشکر

  25. #25

    نقل قول: برنامه نویسی موازی در vs C++‎ 2010 به وسیله OPENMP

    سلام
    من mpi کار نکردم. سخت افزار من فقط اجازه کار با shared memory رو می داد.
    برای کار با mpi یا باید چندتا cpu جداگانه داشته باشید یا اینکه cpu چند هسته ای داشته باشید که از معماری mpi استفاده کرده باشه. برای این کار باز هم OpenMP چاره ساز هست اما نمی دونم که آیا نوع برنامه نویسیش همینطوره که من نوشتم یا جور دیگه ایه!!!!!!!!!
    شرمنده که نمی تونم کمک کنم.
    دوستان کسی هست که جواب بده؟

  26. #26

    نقل قول: برنامه نویسی موازی در vs C++‎ 2010 به وسیله OPENMP

    با سلام خدمت دوستان
    من visual studio team system 2008 دارم.تمام تنظیمات گفته شده رو انجام میدم ولی وقتی include <omp.h وارد می کنم پروژه >بدون خطا build میشه ولی هنگام اجرا پیام زیر رو میده؟لطفا راهنماییی کنید؟Untitled.jpg

  27. #27

    نقل قول: برنامه نویسی موازی در vs C++‎‎ 2010 به وسیله OPENMP

    سلام دوستان
    وقتتون بخیر
    کسی کد موازی یکی از گرافهای bfs dfsدیکسترا یا کروسکالو داره بمن کمک کنه
    ممنون میشم اگ بتونین کمکم کنین پروژمه و من با open mp کار نکردم
    ممنون از وقتی که صرف خوندن کردین
    میلم میزارم اگه کسی تونست کمکم کنه بهم خبر بده دستتون درد نکنه
    star69taro@gmail.com
    موفق و پیروز باشید

  28. #28

    نقل قول: برنامه نویسی موازی در vs C++‎ 2010 به وسیله OPENMP

    با سلام خدمت دوستان
    من visual studio team system 2008 دارم.تمام تنظیمات گفته شده رو انجام میدم ولی وقتی include <omp.h وارد می کنم پروژه >بدون خطا build میشه ولی هنگام اجرا پیام زیر رو میده؟لطفا راهنماییی کنید؟
    سلام
    برنامه تون رو خط به خط اجرا کنید
    تا ببینید از کدوم خط اشکال می گیره.
    یک راه بسیار عالی برای کشف خطاست.

  29. #29

    نقل قول: برنامه نویسی موازی در vs C++‎‎ 2010 به وسیله OPENMP

    با سلام

    اگه من بخوام یک حلقه مثل حلقه زیر رو به صورت Parallel اجرا کنم باید چیکار کنم ؟


    for(int i=0 ; i<n ; i++)
    j = a[i] + j;


    با تشکر

  30. #30

    نقل قول: برنامه نویسی موازی در vs C++‎ 2010 به وسیله OPENMP

    با سلام
    من یک برنامه ضرب ماتریس نوشتم، با CUDA در VS2015 این برنامه ضرب سریال را با ضرب موازی مقایسه می نماید. برای ضرب دو ماتریس 1024*1024 جواب میدهد . اما برای ضرب دو ماتریس 2048*2048 در زمان کپی نتیجه ماتریس (پس از ضرب در GPU)به HOST ، متد cudaMemcpy خطا میده ؟ کسی هست بتواند راهنمایی بفرماید . حتی ضرب را به صورت tile بندی دو ماتریس هم نوشته ام . باز هم همین طوری است . فکر میکنم تنظیم خاصی باید صورت گیرد ؟ ممنون میشم یک از اساتید راهنمایی بفرمایند

تاپیک های مشابه

  1. برنامه نویسی موازی
    نوشته شده توسط bpzone در بخش C#‎‎
    پاسخ: 9
    آخرین پست: دوشنبه 06 اردیبهشت 1395, 07:40 صبح
  2. مقاله: دانلود کتاب فارسی برنامه نویسی موازی با C#‎ 2010 و NET 4.
    نوشته شده توسط zahmatkesh8519 در بخش C#‎‎
    پاسخ: 0
    آخرین پست: چهارشنبه 28 تیر 1391, 23:25 عصر
  3. برنامه نویسی C در Visual Studio 2010
    نوشته شده توسط Amir.Mansoury در بخش برنامه نویسی با زبان C و ++C
    پاسخ: 3
    آخرین پست: شنبه 01 خرداد 1389, 21:06 عصر
  4. برنامه نویسی موبایل با Visual Studio 2010 Proffesional
    نوشته شده توسط mostafarastin239 در بخش WPF
    پاسخ: 2
    آخرین پست: یک شنبه 29 شهریور 1388, 03:50 صبح
  5. کمک : برنامه نویسی موازی
    نوشته شده توسط nima_trade در بخش الگوریتم، کامپایلر، هوش مصنوعی و ساختمان داده ها
    پاسخ: 11
    آخرین پست: پنج شنبه 19 آذر 1383, 00:43 صبح

برچسب های این تاپیک

قوانین ایجاد تاپیک در تالار

  • شما نمی توانید تاپیک جدید ایجاد کنید
  • شما نمی توانید به تاپیک ها پاسخ دهید
  • شما نمی توانید ضمیمه ارسال کنید
  • شما نمی توانید پاسخ هایتان را ویرایش کنید
  •