مجله اینترنتی دیتاسرا
امروز یکشنبه ۴ تیر ۱۳۹۶

توانمندسازی نرم افزار برای معماری های چند هسته ای SOFTWARE ENABLEMENT FOR MULTICORE ARCHITECTURES

Abstract



A recent trend of transitioning to multicore architectures in the mainstream market segments creates significant challenges for programming systems. The market need for creating portable multithreaded applications that exploit high performance of chip multiprocessors is not easily supported by existing programming models and languages, compiler technology, performance analysis and testing tools. We overview various research directions in this area and present some partial results achieved by the industry.



چکیده فارسی



روند اخیر گذار به معماری چند هسته ای(multicore architectures) در بخش های اصلی بازار، چالش های مهمی برای سیستم های برنامه نویسی ایجاد می نماید. بازار به ایجاد برنامه های چند ریسه ای (multithreaded) قابل حملی نیاز دارد که از کارایی بالای چند پردازشی تراشه استفاده نموده، اما به راحتی توسط مدل های برنامه نویسی و زبان موجود، فن آوری کامپایلر، تجزیه و تحلیل عملکرد و ابزارهای آزمون پشتیبانی نمی شود. در این زمینه دستورالعمل های پژوهشی مختلفی را جهت های مختلف مرور می نماییم و نتایج نسبی بدست آمده توسط صنعت را ارائه می دهیم.


مشخصات

مشخصات

توسط: David Bernstein سال انتشار: 2007 میلادی تعداد صفحات متن اصلی: 7 تعداد صفحات متن ترجمه: 17 درج در دیتاسرا: ۱۳۹۵/۱۰/۵ منبع: دیتاسرا

خرید فایل ترجمه

خرید فایل ترجمه

عنوان: توانمندسازی نرم افزار برای معماری های چند هسته ای حجم: 1.45 مگابایت فرمت فایل: pdf قیمت: 9000 تومان رمز فایل (در صورت نیاز): www.datasara.com

فرمت ایمیل صحیح نمی باشد.

گروه نرم افزاری دیتاسرا www.datasara.com

دانلود فایل اصلی

دانلود فایل اصلی

عنوان: SOFTWARE ENABLEMENT FOR MULTICORE ARCHITECTURES

رمز فایل
رمز فایل (در صورت نیاز): www.datasara.com

نمای مطلب

1. مقدمه



دنیای معماری کامپیوتر(computer architecture) از طریق تغییر قابل توجه در سال های گذشته مورد بررسی قرار می گیرد. از اینرو در دهه هشتاد و نود قرن گذشته، بر اساس تدوین قانون مور(Moore law) نسل جدید پردازنده های سریع هر 18 تا 24 ماه به بازار عرضه شدند و در آنها نسخه جدید سخت افزار معمولاً دارای نرخ زمان سنجی دو برابر یا حتی بیشتر سریع تر از نرخ قبلی بود. بنابراین، در آن زمان تمرکز معماران کامپیوتر و افراد گردآورنده(compiler people) صرفاً بر نحوه افزایش موازی سازی در سطح دستورالعمل (ILP)، در سخت افزار پردازشگر و تکنیک های بهینه سازی کامپایلر و همچنین ترکیبی از آنها قرار داشت.



بهر حال خیلی زود آشکار شد که چرخه های زیادی صرف اجرای هسته پردازنده نشده اند، بجز در زیر حافظه سیستم که شامل ساختار ذخیره سازی چند سطحی(multilevel caching) می باشد و در آن اصطلاحاً مشکل «دیوار حافظه (Memory Wall)» بطور کاملاً معناداری با توجه به این واقعیت شروع می شود که افزایش سرعت در حافظه با هسته های پردازشگر مطابقت ندارد. مهمتر از همه، چند سال پیش شواهد جدیدی رخ داد که نشان داد سرعت بخشیدن به کلاک پردازنده(processor clock) بعلت افزایش فوق العاده ای در مصرف انرژی و تلفات توان توسط سیستم های کامپیوتری پیشرفته، کار بسیار سختی است و مقرون به صرفه نیست. این پدیده، مشکل دیوار قدرت(Power Wall problem) نام گرفت و نتیجه اصلی آن این است که اکثر تولید کنندگان صنعتی پردازنده های پیشرفته از قبیل Intel ،AMD ،Sun و IBM دست از عرضه پردازنده هایی با نرخ زمان سنجی افزایشی برداشتند و شروع به در نظر گرفتن راه های جایگزین برای ارائه افزایش عملکرد در کامپیوترهای ارائه شده شان نمودند.



خیلی زود مسیر جدیدی برای افزایش عملکرد کلی سیستم های کامپیوتری، برای مثال تغییر ساختار زیر سیستم های پردازنده برای استفاده از هسته های چند پردازشی بر روی تک چیپ(single chip)، پیشنهاد شد. این معماری های کامپیوتری جدید، تراشه چند پردازشی(Chip Multi Processors) (CMP) نام گرفتند و در حین حفظ نرخ زمان سنجی هسته های پردازنده مجزا در یک سطح معقول، اجازه افزایش عملکرد را به سیستم های نسل جدید دادند. نتیجه این تغییر معماری این است که ارائه پیشرفت های بیشتر در عملکرد در حالی امکان پذیر است که مصرف قدرت در زیر سیستم پردازشگرها(processor subsystem) تقریباً ثابت بماند، روندی که ظاهر می گردد نه تنها برای بخش های دارای حساسیت بازار از قبیل سیستم های تعبیه شده ضروری است، برای محاسبه مزرعه های سروری(server farm) که دستخوش مشکلات مصرف / اتلاف قدرت هستند نیز بسیار لازم است. در واقع می توان استدلال نمود که بهره برداری از پردازشگرهای متعدد در سیستم های کامپیوتری چندین دهه پیش شناخته شده است ، اما ادعا می شود که در گذشته صرفاً به سیستم های بسیار گران قیمت و با عملکرد بالا(HPC) محدود شده یا در سیستم های بسیار تخصصی ای تعبیه می شد که مبتنی بر مجموعه ای از DSP ها بودند. این روزها، تقریباً می توانید از فروشگاهی نزدیک به خود کامپیوتر رومیزی معمولی یا کامپیوتر سیاری بخرید که به احتمال زیاد بدون صحبت از مزرعه های سروری(server farms) قدرتمند و کنسول های بازی پیچیده مانند Xbox 360 یا Playstation 3 ، دارای هسته های چند پردازشی می باشد. بنابراین، با این روند سریع CMPها تقریباً در هر بخش های بازار فراگیر هستند و این سوال مطرح می شود که آنها در بخش های سخت افزاری و نرم افزاری صنعت کامپیوتر چه معنایی دارند؟



جهت مشاهده متن کامل، فایل ترجمه را دانلود نمایید.



در این مقاله می توان بحث های طولانی تعریف آمیز زیادی در مورد نحوه تاثیر PMCها بر نتایج طراحی و معاوضه های معماری کامپیوتر انجام داد. می توان متذکر شد که این روند نه تنها «صرفاً» دارای چندین هسته پردازشگر روی یک تراشه می باشد (هر یک از آنها به طور بالقوه از چندین ریسه موازی(parallel thread) پشتیبانی می نمایند)، بلکه برای نیازهای مهم بازار نیز دارای موتورهای محاسباتی تخصصی می باشد (به عنوان مثال پردازش XML ، رمز نگاری، گرافیک) ، پرسش هایی نیز در مورد نحوه اتصال تعداد زیادی هسته پردازشگر (به عنوان مثال شبکه بر روی تراشه) ، نحوه ارائه پهنای باند حافظه کافی، نحوه ساختاردهی به ذخیره سازی چند سطحی(multilevel caching) در زیر سیستم و غیره وجود دارد. آنگاه سوال اساسی در مورد نحوه برقراری تعادل بین منابع محاسباتی همه منظوره با موتورهای پردازشی تخصصی و حافظه های پشتیبان، ذخیره سازی و ساختار بهم متصل، با توجه به بودجه ثابت قدرت، مطرح می شود. حتی اخیراً معیارهای ارزیابی برای سیستم های کامپیوتری بر حسب ارقام وات نیز شروع به اخطار در مورد عملکردی نمودند که در آن چالش های جدیدی برای طراحی موازنه ای در محصولات کامپیوتر ایجاد می شود. به طور کلی، زمان هیجان انگیزی برای جامعه معماری کامپیوتر می باشد و خلاصه ای بصیر از روندهای اخیر را می توان در منبع [1] یافت.



به نظر می رسد برنامه نویسی سیستم های چندپردازشی بسیار پیچیده تر از کامپیوترهای تک پردازشی باشد. باکثر الگوریتم های موجود در مطالعات انجام شده چندین دهه پیش، هنگامی که مفهوم چند پردازی بسیار نوین بود، تدوین و ارائه شده بودند. درست است که می توان از سیستم چندپردازشی برای اجرای چندین برنامه مستقل به صورت موازی و بدون هیچ گونه سرمایه گذاری برای برنامه ریزی مجدد نرم افزار کاربردی استفاده نمود، اما این امر استفاده از چند سیستم پردازشی را به شدت محدود خواهد نمود، این امر به ویژه در هنگامی رخ می دهد که تعداد هسته های محاسباتی در جریان اصلی بازار فراتر از 2 تا 4 هسته بر روی تراشه افزایش یابد. علاوه بر این، نمی توان با استفاده از پارادایم برنامه نویسی معین و سطح بالایC ، به طور موثری از هسته های پردازشی تخصصی در پردازشگر هایی چون IBM’s Cell و ارائه تمام انتقال داده های مورد نیاز در داخل پردازشگر استفاده نمود. بنابراین، دو دستورالعمل مهم برای دنبال نمودن برنامه نویسی سیستم های چند پردازشی وجود دارد: برنامه نویسی دستی صریح و استفاده از ترکیبی از بهینه سازی کامپایلر نرم افزار، ایجاد زنجیره های ابزاری(build tool chains) و زیر سیستم های زمان اجرا(run-time subsystems).



جهت مشاهده متن کامل، فایل ترجمه را دانلود نمایید.



در این مقاله قصد داریم برخی از بخش های اساسی در سیستم های توانمندسازی نرم افزار برای CMPها را بطوراجمالی بررسی نماییم و در مورد دستورالعمل های مختلف برای ارائه راه حل برای آن بحث نماییم. قصد داریم تاکید نماییم که این یک حوزه فعال پژوهشی می باشد و صرفاً نتایج اولیه کمی از نظر استانداردها و فن آوری های محرز در جهان دانشگاه و صنعت وجود دارد، اما نتایج بیشتر در سال های آتی را پیش خواهد آمد. در بخش بعدی مدل های برنامه نویسی و پشتیبانی کامپایلر برای CMPها را در بردارد. سپس در بخش 3 در مورد ابزارهای ارزیابی عملکرد بحث می نماییم، در حالی که در بخش 4 ابزارهای آزمون را ارائه می نماییم. مشاهدات مان در بخش 5 را نتیجه گیری می نماییم. بر حسب منابع، قصد نداریم تمام مقدار کار های صورت گرفته در جهان را ارائه نماییم، تنها برخی از نمونه های منابع مرتبط را ارائه می کنیم (فهرست گسترده تری از منابع را می توان در منبع[1] در یافت) .



2 . مدل های برنامه نویسی و بهینه سازی کامپایلر



جهت مشاهده متن کامل، فایل ترجمه را دانلود نمایید.



در گذشته این امید وجود داشت که کامپایلر ها وسیله ای برای موازی سازی خودکار برنامه های متوالی ارائه خواهند نمود. موانع متعددی در زبانهایی از قبیل جمله C/C++ و جاوا وجود دارد، اما حتی در فورترن (FORTRAN) نیز ، موفقیت موازی سازی خودکار برای حلقه برنامه های ویژه بسیار محدود است. با توجه به حجم زیادی تحقیقات انجام شده در مورد موازی سازی خودکار در سه دهه گذشته، فرض می نماییم که رویکرد صحیح برنامه نویسی PMCها باید مبتنی بر تجانس برنامه نویسان با ارائه اطلاعات در مورد ساختار موازی برنامه با سطح مناسبی از انتزاع باشد و کامپایلر/ زمان اجرا آن را به کد اجرایی برای CMPها تبدیل می نمایند. سپس این سوال مطرح می شود که این زبان برنامه نویسی و/ یا مدل برنامه نویسی که در آن برنامه نویس دانش خود را در مورد ساختار موازی برنامه های بیان می کنند، چیست ؟



تکامل زبان های برنامه نویسی نشان می دهد که زبان های جدید کمتر و کمتری از 2 دهه گذشته تاکنون اختراع شده است. موفقیت جاوا که در ابتدای سال 1995 وارد بازار شده کاملاً تعجب آور است، اما می توان آن را به موفقیت در اینترنت و پیشنهاد ارزشی(value proposition) جاوا در نتیجه ساختار یکبار بنویسید، همه جا اجرا کنید(write-once run-everywhere) نسبت داد. بنابراین، جاوا فقط یک زبان برنامه نویسی جدید نیست، بلکه یک محیط برنامه نویسی جدید (از جمله ماشین مجازی، مفسر، مولفه زباله روبی(garbage collection component)، مجموعه ای از برنامه ها و غیره) و پرادایمی برای توسعه برنامه های اینترنتی می باشد. این سوال مطرح است که آیا CMPها می توانند ایجاد یک زبان/ محیط جدید برای موازات مانند جاوا برای اینترنت ترغیب نمایند ؟ اقدامات متعددی برای مدل های برنامه نویسی، زبان ها و مجموعه برنامه های موازی جدید برای CMPها وجود داردکه در آن برنامه نویسان می توانند اطلاعات اضافی مرتبط با موازی سازی در برنامه های خود را ارائه نمایند. در میان این اقدامات ، نگاشت کاهش (map-reduce ) ،cilk ،UPC ،X10 و STAPL قرار دارد، اما در حال حاضر پارادایم غالب استنتاجی در اینجا را مشاهده نمی کنیم.



جهت مشاهده متن کامل، فایل ترجمه را دانلود نمایید.



استفاده از موازی سازی در سطح ریسه(thread-level parallelism) توسط کامپایلر های متعدد و مجموعه برنامه های پشتیبان برنامه نویسی صریح و با استفاده ازOpenMP ( [10] ، استاندارد رایج برای مدل های حافظه تسهیم شده) ،MPI ([11] ، استاندارد رایج برای مدل های حافظه توزیعی) و استفاده صریح از، به عنوان مثال، ریسه‌های پازیکس(pthreads) یا ریسه های جاوا و بهینه سازی خودکار موازی سازی اغلب متمرکز بر حلقه های بیرونی ارائه شده است.



بسیاری از کامپایلرهای خودکار موازی سازی اصیل، با توجه به قوانین بدنمایی قوی تر آن نسبت به C بر فورترن (FORTRAN ) متمرکز شده اند. همانطور که در بالا ذکر نمودیم، برای یک کامپایلر دشوار اس تا توسط موازی سازیخودکار بتواند تصمیمات کارآمد درشت بافت اتخاذ نماید، در حالی که از سوی دیگر به نظر می رسد، فن آوری کامپایلر برای حلقه های بردارسازی کاملاً بالغ می باشند.



برای خلاصه نمودن این بحث، تصور ما این است که OpenMP به عنوان یک شیوه جالب و قابل انتقال برای برنامه نویسان برای بیان موازی سازی در برنامه های کاربردی، رها نمودن کار توزیع موازی در میان هسته های CMP و همچنین برای SIMD برای کامپایلر بردارسازی تکامل می یابد. سوال مطرح عطف به OpenMP این است که آیا این مدل بعنوان حافظه اشتراکی(shared-memory) فرض می شود یا خیر. با توجه به آنچه که در بالا ذکر نمودیم، چالش های مکملی وجود دارد که توسط معماری های چند هسته ای نا متقارن اخیر مطرح شده اند، مانند پردازشگر Cell که بعنوان مدل حافظه مشترک در نظر گرفته نمی شود. نرم افزار چنین سیستم هایی ابتدا باید برای انواع مختلف پردازشگرهای حاضر در تراشه جزء بندی و همگردانی شود.



جهت مشاهده متن کامل، فایل ترجمه را دانلود نمایید.



برای بهینه سازی کامپایلر کامل، در بهینه سازی لینک ارسالی(post-link) سطح باینری مهمی وجود دارد که هدف آن اساساً مشکلات استفاده از دستور العمل های حافظه نهان و داده های آن می باشد. از آنجا که انتظار داریم اندازه دستورالعمل L1 و حافظه نهان داده در CMP برای هر هسته پردازشگر افزایش نیابد، این تصور ایجاد می شود که اهمیت تکنولوژی بهینه سازی لینک ارسالی(post-link optimization) در آینده بیشتر خواهد شد.



FDPR-Pro بازخورد هدایت شده بهینه ساز لینک ارسالی می باشد که به طور مستقیم بر روی فایل های اجرایی برنامه اعمال شده است. FDPR-Pro در دسترس سیستم های عاملIBM PowerPC (AIX و لینوکس) و پردازشگر Cell می باشد. اهمیت بهینه ساز لینک ارسالی از قبیل FDPR-Pro اساساً بواسطه ویژگی دیدگاه کلی آن استنتاج می شود و در آن کل برنامه قابل اجرا به عنوان تک واحد بهینه سازی به همراه اطلاعات پروفایلی کامل و دقیق جمع آوری شده در حجم کار نمونه در نظر گرفته می شود. در نتیجه،FDPR-Pro قادر به انجام بهینه سازی تهاجمی جهانی از قبیل مرتب سازی مجدد کد جهانی(global code)، مرتب سازی مجدد داده های استاتیک جهانی و درون برنامه ای شدن کدجهانی صورت گرفته در کل کد های برنامه می باشد.



این توانایی بازسازی جهانی با این واقعیت همراه می باشد که FDPR-Pro در انتهای زنجیره ساخت (build chain) اعمال شده است و در نتیجه قراردادهای بهم پیوسته نیازی به حفظ پتانسیل بهینه سازی بیطور قابل توجه اضافی ارائه شده در برنامه های تجاری ندارند.



مرتب سازی مجدد کد جهانی(global code) موجب تنظیم کدی می شود که پیش از اجرا توسط تابع درون خطی تهاجمی نشان داده شده در [19] دارای تاثیرات همگون مهم می باشد. مرتب سازی مجدد کد جهانیFDPR-Pro قبل از بسیاری از بهینه سازی های دیگر از قبیل حذف سریزها در مرزهای رویه ای [20] ، برنامه ریزی کلی، باز شدن حلقه تهاجمی و مابقی موارد، اجرا می شود. در عین حال، مرتب سازی مجدد جهانی داده های استاتیک، فضایی برای حذف دستورالعمل های بارگذاری TOC فراهم می کند (همانطور که در [ 21 ] نشان داده شده است) و همچنین موجب بهبود محل ذخیره سازی داده ها می شود. در نتیجه بهینه سازی جهانیFDPR-Pro ، جای پای کد مکرراً اجرا شده (از جمله داده های اشاره شده در این مناطق) کاهش یافته و استفاده از حافظه نهان افزایش یافته است. این پیشرفت، به دلیل استفاده بهتر از حافظه نهان، نظر به شکاف بین کد برنامه و جای پای داده ها و اندازه حافظه نهان موجود، افزایش قابل توجه تری یافته است. چنین شکافی در برنامه های کاربردی بسیار بزرگ مانند موتورهای پایگاه داده یا برنامه های ایجاد شده در بالای آنها، به عنوان مثال سیستم هایERP و همچنین برنامه هایی با اندازه کوچکتر وجود دارد که در محیط حافظه نهان محدود، به عنوان مثال در سیستم های تعبیه شده، اجرا می شوند. روند حاضر سیستم عامل های چند هسته، که در آن اجرای موازی در برآمد اندازه حافظه نهان ترجیح داده شده ، اشاره می نماید که استفاده از کد جهانی و بهینه سازی داده ها حیاتی خواهد بود. یک نمونه از اثرات مکمل سیستم پردازشی، افزایش تاحد امکان اشتراک نادرستی است که موجب فقدان اطلاعات غیرضروری در حافظه نهان می شود، در نتیجه برای تکنولوژی بهینه سازی جهانی ارسال لینک مانند FDPR-Pro چالش های جدیدی ایجاد می شود.



3. ابزارتجزیه و تحلیل عملکرد



جهت مشاهده متن کامل، فایل ترجمه را دانلود نمایید.


 برچسب ها: 

ISI

Paper

Papers

Article

Articles

مقاله ISI

نرم افزار

دانلود ISI

ترجمه مقاله

توانمندسازی

دریافت مقاله

ISI کامپیوتر

مقاله انگلیسی

Persian Paper

خرید ترجمه ISI

ترجمه مقاله ISI

Persian Article

دانلود مقاله ISI

مقاله رایگان ISI

خرید ترجمه مقاله

دانلود ترجمه ISI

دانلود مقاله جدید

مقالات رایگان ISI

دریافت مقالات ISI

مقاله ISI با ترجمه

مقاله انگلیسی جدید

خرید ترجمه انگلیسی

فروش ترجمه انگلیسی

مقاله ISI کامپیوتر

دانلود مقاله انگیسی

ترجمه مقاله انگلیسی

دانلود ISI کامپیوتر

مقالات معتبر انگلیسی

ترجمه مقالات انگلیسی

دریافت مقاله انگلیسی

ترجمه مقاله کامپیوتر

دانلود مقاله جدید ISI

دریافت مقاله کامپیوتر

مقاله انگلیسی با ترجمه

مقاله انگلیسی کامپیوتر

معماری های چند هسته ای

دانلود رایگان مقاله ISI

خرید ترجمه ISI کامپیوتر

Translate English Paper

دانلود مقالات رایگان ISI

ترجمه مقاله ISI کامپیوتر

دانلود مقاله ISI با ترجمه

دانلود مقاله انگلیسی جدید

دریافت مقاله انگلیسی جدید

دانلود مقاله ISI کامپیوتر

مقاله رایگان ISI کامپیوتر

خرید ترجمه مقاله کامپیوتر

دانلود ترجمه ISI کامپیوتر

Translate English Article

ترجمه مقالات معتبر انگلیسی

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

مقالات رایگان ISI کامپیوتر

دریافت مقالات ISI کامپیوتر

Translate Paper in English

دانلود مقاله انگلیسی رایگان

دانلود رایگان مقاله انگلیسی

دانلود مقاله انگلیسی رایگان

دریافت مقاله انگلیسی رایگان

مقاله ISI با ترجمه کامپیوتر

مقاله انگلیسی جدید کامپیوتر

خرید ترجمه انگلیسی کامپیوتر

فروش ترجمه انگلیسی کامپیوتر

دانلود مقاله انگیسی کامپیوتر

ترجمه مقاله انگلیسی کامپیوتر

Translate Article in English

دانلود مقاله انگلیسی با ترجمه

دریافت مقاله انگلیسی با ترجمه

مقالات معتبر انگلیسی کامپیوتر

ترجمه مقالات انگلیسی کامپیوتر

دریافت مقاله انگلیسی کامپیوتر

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

مقاله انگلیسی با ترجمه کامپیوتر

Translation of Paper in English

دانلود رایگان مقاله ISI کامپیوتر

دانلود مقالات رایگان ISI کامپیوتر

Translation of Article in English

دانلود مقاله ISI با ترجمه کامپیوتر

دانلود مقاله انگلیسی جدید کامپیوتر

دریافت مقاله انگلیسی جدید کامپیوتر

ترجمه مقالات معتبر انگلیسی کامپیوتر

دانلود مقاله انگلیسی رایگان کامپیوتر

دانلود رایگان مقاله انگلیسی کامپیوتر

دانلود مقاله انگلیسی رایگان کامپیوتر

دریافت مقاله انگلیسی رایگان کامپیوتر

دانلود مقاله انگلیسی با ترجمه کامپیوتر

دریافت مقاله انگلیسی با ترجمه کامپیوتر

مطالب پیشنهادی
متأسفانه موردی یافت نشد.
ناحیه کاربری

فرمت ایمیل صحیح نمی باشد. ایمیل خود را وارد نمایید.

رمز عبور خود را وارد نمایید.

گزیده ها
پرواز با اتومبیل پرنده: اتومبیل تی‌اف-ایکس مجوز پرواز گرفت
گزیده های پر بیننده ترین اخبار روز و هفته
جشن کریسمس در نقاط مختلف جهان (+عکس)
گزیده های وبگردی و اخبار جذاب
بازیافت ماشین های قدیمی به روشی نو!
گزیده های وبگردی و اخبار جذاب
لوکس ترین خودروهای دنیا در نمایشگاه اتومبیل لس آنجلس (+عکس)
گزیده های پر بیننده ترین اخبار روز و هفته
مجله اینترنتی دیتاسرا
کلیه حقوق مادی و معنوی این وبسایت متعلق به گروه نرم افزاری دیتاسرا می باشد.
Copyright © 2015