PDA

View Full Version : سوال: انجام یک پردازش با استفاده از هر 2 هسته CPU



raravaice
یک شنبه 02 تیر 1387, 16:57 عصر
با سلام

برای انجام یک پردازش سنگین نیاز هست از هر 2 هسته CPU استفاده بشه!
مستنداتش در msdn هست. منتهی نتونستم از اونا استفاده کنم.

کلا چطور میشه CPU رو مدیریت کرد و چه شرایطی نیاز داره؟


ممنون

tc1000
یک شنبه 02 تیر 1387, 17:27 عصر
باسلام
تا اونجایی که من اطلاع دارم CPU های 2 هسته ای بصورت موازی کار میکنند یعنی با هم این نسیت که اگه 2 هسته ای هستش از یکیشون کار بکسید و از اون یکی یه کار دیگه
اطلاعاتی که من دارم اینه

Alireza_Salehi
یک شنبه 02 تیر 1387, 17:32 عصر
شما فقط کافیه پردازش سنگین رو بین چند Thread تقسیم کنید باقی قضایا اتوماتیک حل میشه، مثالMulti Threading هم تو تالار سی شارپ یا وی بی اگر بگردید پیدا میشه.

raravaice
دوشنبه 03 تیر 1387, 12:19 عصر
علی جان فرمایش شما درست ولی شرایط من به صورت زیر هست.

2 تا CPU هست Xeon هر کدام 2 هسته.
یک پردازش منسجم هست که داخل یه روتین قرار هست کارش رو انجام بده شما فرض رو مثال زیر بگیر.


For i = 0 To 9000000000

Next
این پروسه در حالت معمولی و بدون Thread و در شرایطی که پروسه CPU من 1% هست با استفاده از یک هسته از 4 هسته موجود داره در عرض حدود 27 ثانیه کارش رو انجام میده حالا من میخوام این پروسه رو روی 2 یا هر 4 هسته پردازش کنم که زمان انجام پردازش کاهش پیدا کنه.

با اطلاعاتی که من از Thread دارم این کار انجام نشد و اینم در نظر بگیر که این پردازش کاملا به هم پیوسته هست و تفکیک شده جزء یه پردازش خیلی بزرگتره و امکان اینکه از این کوچیک تر بشه وجود نداره که بخوام خود این هم کوچیک تر کنم و بین چند Thread تقسیم کار کنم.

راه حل تجربی در این خصوص نداری؟!

موفق باشید

Alireza_Salehi
دوشنبه 03 تیر 1387, 22:00 عصر
والا خیلی بعید میدونم یه کاری رو که نمیشه به کارهای کوچیکتر تقسیم کرد بشه روی چند هسته یا حتی روی چند CPU تقسیم کرد! مگر این که یه فناوری جدیدی اومده باشه ما بیخبریم.

به هر حال اگر می خواهید از چند پردازنده استفاده کنید باید پروسه رو بشکنید.
http://www.yoda.arachsys.com/csharp/threads/

http://www.c-sharpcorner.com/UploadFile/mgold/MultithreadingIntro10062005000439AM/MultithreadingIntro.aspx?ArticleID=920ecafc-e83b-4a9c-a64d-0b39ad885705

http://www.visualbuilder.com/csharp/tutorial/pageorder/29/
با شکستن یک پروسه سنگین به چند پروسه کوچکتر و قرار دادن هر کدام در یک Thread مجزا سیستم عامل به صورت خودکار اونها رو بین هسته ها و CPU ها تقسیم میکنه شما فقط باید شروع و پایانش رو کنترل کنید وبس.

b581102
سه شنبه 04 تیر 1387, 10:08 صبح
خب چرا پروسه رو اينجوری نمیشکنيد ؟

for(int i=0 ; i<1000000 ; i++)
{
dowork();
}
for(int i=1000000 ; i<2000000;i++)
{
dowork();


}
, ....

raravaice
سه شنبه 04 تیر 1387, 12:26 عصر
خب چرا پروسه رو اينجوری نمیشکنيد ؟
........
dowork();

این دستور شما فکر کنم توی Win App سازگار باشه که خودش باعث وقفه میشه که پردازنده به بقیه پیامهای سیستم هم توجه کنه.



والا خیلی بعید میدونم یه کاری رو که نمیشه به کارهای کوچیکتر تقسیم کرد بشه روی چند هسته یا حتی روی چند CPU تقسیم کرد! مگر این که یه فناوری جدیدی اومده باشه ما بیخبریم.

علی جان تئوریش رو اینجا مایکروسافت گفته منتهی اطلاعاتم راجع بهش هنوز کامل نیست.

اینو ببین : من دقیقا پیاده سازیه چنین حالتی رو میخوام.

http://msdn.microsoft.com/en-us/library/system.web.configuration.processmodelsection.cpuma sk.aspx

اطلاعاتی درباره این کلاس داری؟

موفق باشی

Alireza_Salehi
سه شنبه 04 تیر 1387, 14:24 عصر
با این پیش زمینه ها:


Using the ASP.NET Process Model (IIS 6.0) (http://www.microsoft.com/technet/prodtechnol/WindowsServer2003/Library/IIS/ee81b97b-b967-48f7-8ce9-1796a2e994fd.mspx?mfr=true)

ASP.NET Internals – IIS and the Process Model (http://dotnetslackers.com/articles/iis/ASPNETInternalsIISAndTheProcessModel.aspx)

The-ASP.NET-Process-Model (http://dotnetextract.googlepages.com/the-asp.net-process-model)

در این لینکها توضیح کامل در مورد تنظیمات ProcessModel داده:


10 ASP.NET Performance and Scalability Secrets (http://www.codeproject.com/KB/aspnet/10ASPNetPerformance.aspx)


Improving ASP.NET Performance (http://msdn.microsoft.com/en-us/library/ms998549.aspx#scalenetchapt06_topic8)


ولی با این حال همه اینها فقط شما رو قادر می کنند سرویس دهنده ای داشته باشید که از حداکثر منابع استفاده کند. یعنی اگر چند Thread وجود داشت ASP.NET منابع لازم برای اجرای همزمان اونها رو داشته باشه.


چه 1 cpu چه 100 تا، حالا اگر تنها یک کار داشته باشیم چطور می خواد این یک کار (غیرقابل خرد شدن) رو با همه cpu ها انجام بده؟
در مورد کاری که داری انجام میدی یه کم بیشتر توضیح بده.

vcldeveloper
سه شنبه 04 تیر 1387, 16:47 عصر
یک پردازش منسجم هست که داخل یه روتین قرار هست کارش رو انجام بده شما فرض رو مثال زیر بگیر.
کد:
For i = 0 To 9000000000

Next
می تونید از Task Parallel Library (http://msdn.microsoft.com/msdnmag/issues/07/10/Futures/default.aspx?print=true&loc=null) که در نسخه 3.5 دات نت معرفی شده، استفاده کنید. علاوه بر چیزی که خواستید، قابلیت های زیادی برای تولید برنامه Multi-threaded بهتون میده. از طرفی بعضی کامپایلرها این امکان را دارند که در صورت امکان، کد را به branchهایی جهت اجرا بر روی چند CPU تبدیل کنند. شاید کامپایلر شما هم سوئیچ هایی برای این منظور داشته باشه. نکته دیگه هم این هست که شاید الگوریتم فعلی شما برای انجام کار مورد نظر، قابلیت شکسته شدن به اجزاء کوچکتر را نداشته باشه، اما ممکنه بتونید از الگوریتم دیگه ایی برای انجام همون کار استفاده کنید که قابل شکسته شدن به اجزاء کوچکتر باشه. به این نکته هم توجه داشته باشیدکه در بدترین حالت اگر پردازش شما فقط روی یک CPU امکان اجرا داشته باشه، باز هم با جدا کردن Thread اجرای آن پردازش از Thread اصلی برنامه، چند درصدی سرعت کار افزایش پیدا خواهد کرد.

raravaice
سه شنبه 04 تیر 1387, 17:35 عصر
نکته فوق العاده ای بود ولی ظاهرا این یک کلاس الحاقی هست درست میگم؟!

http://www.microsoft.com/downloads/details.aspx?FamilyId=348F73FD-593D-4B3C-B055-694C50D2B0F3&displaylang=en

یا من با چیزه دیگه اشتباه گرفتمش؟

-------------------------------------
نوع کار اینه که:
چند تا وب سرور یه سری در خواستها رو پروسس و ذخیره میکنن حالا یه سرور اصلی در نظر گرفته شده که اطلاعات ذخیره شده توسط وب سرور ها رو بر اساس یه الگوریتم خاص مجداد پردازش میکنه و در اصل اطلاعاتی که از وب سرور ها گرفته شده را نوع خاصی فیلتر روشون اعمال میکنه.
حالا این وسط زمان پردازش اهمیت داره ، چون مثلا اگر یکی از رکورد ها تا 30 ثانیه آینده پردازش اصلی روش انجام نشه کل پروسس بیهوده بوده و همینوطر پردازش تمام رکورد ها وابسته به پردازش رکورد قبلی و یه سری دیگه اطلاعات هست برای همین محدودیت دارم برای استفاده بیشتر از Thread برای همین من پردازش رو میخوام به دو دسته تقسیم کنم و هر CPU من یک گروه کاری رو به عهده بگیره منتها میخوام از هر 2 هسته Cpu استفاده بشه که زمان رو نصف کنم.

ممنون از لطفت

vcldeveloper
چهارشنبه 05 تیر 1387, 04:30 صبح
ظاهرا این یک کلاس الحاقی هست درست میگم؟!

http://www.microsoft.com/downloads/d...displaylang=en (http://www.microsoft.com/downloads/details.aspx?FamilyId=348F73FD-593D-4B3C-B055-694C50D2B0F3&displaylang=en)

یا من با چیزه دیگه اشتباه گرفتمش؟
همینی هست که گرفتید.


اگر یکی از رکورد ها تا 30 ثانیه آینده پردازش اصلی روش انجام نشه کل پروسس بیهوده بوده
اینجور محدودیت های زمانی، یعنی به نوعی سیستم شما یک سیستم Real-time هست. می تونید در زمینه سیستم های Real-time تحقیق کنید. بطور کلی، سیستم Real-time سیستمی هست که تضمین میکنه عمل خاصی را در محدوده یک بازه زمانه مشخص انجام بده.


همینوطر پردازش تمام رکورد ها وابسته به پردازش رکورد قبلی و یه سری دیگه اطلاعات هست
اگر پردازش ها به همدیگر مربوط هستند و حتما باید پشت سر هم انجام شوند، ممکن هست که بتوانید هر پردازش را به اجزاء کوچکتری تقسیم کنید، یعنی بجای آنکه هر هسته CPU با یک پردازش کار کند، می توانید هر پردازش را به اجزاء کوچکتری تقسیم کنید که هر یک بر روی یک CPU اجرا شوند. این کار باعث افزایش سرعت هر پردازش و در نتیجه افزایش سرعت انجام کل پردازش ها می شود.


برای همین من پردازش رو میخوام به دو دسته تقسیم کنم و هر CPU من یک گروه کاری رو به عهده بگیره منتها میخوام از هر 2 هسته Cpu استفاده بشه که زمان رو نصف کنم.

اگر بخواید از TPL استفاده کنید، می تونید یک Task Manager داشته باشید که وظیفه اش مدیریت انجام پردازش شما ست. حالا می تونید این پردازش کلی را به چند Task کوچکتر تقسیم کنید (مثلا به قول شما کار را به دو دسته یا بیشتر تقسیم کنید). خوبی کار با TPL این هست که شما فقط به کار نوشتن Taskها و تقسیم کار کلی بین آنها مشغول میشید. TPL خودش بر اساس فاکتورهای مختلف - مثل تعداد هسته های CPU موجود- تعداد Thread ها و نحوه اجرای آنها را کنترل می کند. از طرفی سعی می کند بار حاصل از انجام پردازش را روی تمامی هسته ها تقسیم کند، یعنی اگر هسته ایی پردازش مربوط به خود را انجام داد و آزاد شد، ولی سایر هسته ها هنوز مشغول هستند، TPL بطور خودکار بخشی از کار مربوط به سایر هسته ها را به هسته آزاد واگزار می کند تا توازن بار پردازشی حفظ شود. یکی از مزیت های TPL این هست که برنامه نویس را از درگیر شدن در جزئیات ساخت Thread-pool، ساخت و آزاد کردن Worker Thread ها، مدیریت اجرای آنها، و حفظ توازن بار پردازشی بی نیاز میکنه؛ برنامه نویس فقط روی تقسیم مسئله به چند Task و چگونگی انجام هر Task تمرکز میکنه.

در هر حال، ممکن هست که دوستان دیگه بتوانند راهنمایی های عملی بهتری بکنند، چون من اصلا دات نت کار نمی کنم.

Behrouz_Rad
چهارشنبه 05 تیر 1387, 10:35 صبح
http://brad.barnamenevis.org/?p=64

raravaice
چهارشنبه 05 تیر 1387, 11:43 صبح
علی کشاورز (http://barnamenevis.org/forum/member.php?u=4729)
لطف شما رو فراموش نمیکنم.

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

موفق باشید