با سلام
برای انجام یک پردازش سنگین نیاز هست از هر 2 هسته CPU استفاده بشه!
مستنداتش در msdn هست. منتهی نتونستم از اونا استفاده کنم.
کلا چطور میشه CPU رو مدیریت کرد و چه شرایطی نیاز داره؟
ممنون
با سلام
برای انجام یک پردازش سنگین نیاز هست از هر 2 هسته CPU استفاده بشه!
مستنداتش در msdn هست. منتهی نتونستم از اونا استفاده کنم.
کلا چطور میشه CPU رو مدیریت کرد و چه شرایطی نیاز داره؟
ممنون
باسلام
تا اونجایی که من اطلاع دارم CPU های 2 هسته ای بصورت موازی کار میکنند یعنی با هم این نسیت که اگه 2 هسته ای هستش از یکیشون کار بکسید و از اون یکی یه کار دیگه
اطلاعاتی که من دارم اینه
شما فقط کافیه پردازش سنگین رو بین چند Thread تقسیم کنید باقی قضایا اتوماتیک حل میشه، مثالMulti Threading هم تو تالار سی شارپ یا وی بی اگر بگردید پیدا میشه.
علی جان فرمایش شما درست ولی شرایط من به صورت زیر هست.
2 تا CPU هست Xeon هر کدام 2 هسته.
یک پردازش منسجم هست که داخل یه روتین قرار هست کارش رو انجام بده شما فرض رو مثال زیر بگیر.
این پروسه در حالت معمولی و بدون Thread و در شرایطی که پروسه CPU من 1% هست با استفاده از یک هسته از 4 هسته موجود داره در عرض حدود 27 ثانیه کارش رو انجام میده حالا من میخوام این پروسه رو روی 2 یا هر 4 هسته پردازش کنم که زمان انجام پردازش کاهش پیدا کنه.
For i = 0 To 9000000000
Next
با اطلاعاتی که من از Thread دارم این کار انجام نشد و اینم در نظر بگیر که این پردازش کاملا به هم پیوسته هست و تفکیک شده جزء یه پردازش خیلی بزرگتره و امکان اینکه از این کوچیک تر بشه وجود نداره که بخوام خود این هم کوچیک تر کنم و بین چند Thread تقسیم کار کنم.
راه حل تجربی در این خصوص نداری؟!
موفق باشید
والا خیلی بعید میدونم یه کاری رو که نمیشه به کارهای کوچیکتر تقسیم کرد بشه روی چند هسته یا حتی روی چند CPU تقسیم کرد! مگر این که یه فناوری جدیدی اومده باشه ما بیخبریم.
به هر حال اگر می خواهید از چند پردازنده استفاده کنید باید پروسه رو بشکنید.
http://www.yoda.arachsys.com/csharp/threads/
http://www.c-sharpcorner.com/UploadF...d-0b39ad885705
http://www.visualbuilder.com/csharp/.../pageorder/29/
با شکستن یک پروسه سنگین به چند پروسه کوچکتر و قرار دادن هر کدام در یک Thread مجزا سیستم عامل به صورت خودکار اونها رو بین هسته ها و CPU ها تقسیم میکنه شما فقط باید شروع و پایانش رو کنترل کنید وبس.
خب چرا پروسه رو اينجوری نمیشکنيد ؟
for(int i=0 ; i<1000000 ; i++)
{
dowork();
}
for(int i=1000000 ; i<2000000;i++)
{
dowork();
}
, ....
این دستور شما فکر کنم توی Win App سازگار باشه که خودش باعث وقفه میشه که پردازنده به بقیه پیامهای سیستم هم توجه کنه.خب چرا پروسه رو اينجوری نمیشکنيد ؟
........
dowork();
علی جان تئوریش رو اینجا مایکروسافت گفته منتهی اطلاعاتم راجع بهش هنوز کامل نیست.والا خیلی بعید میدونم یه کاری رو که نمیشه به کارهای کوچیکتر تقسیم کرد بشه روی چند هسته یا حتی روی چند CPU تقسیم کرد! مگر این که یه فناوری جدیدی اومده باشه ما بیخبریم.
اینو ببین : من دقیقا پیاده سازیه چنین حالتی رو میخوام.
http://msdn.microsoft.com/en-us/libr...n.cpumask.aspx
اطلاعاتی درباره این کلاس داری؟
موفق باشی
با این پیش زمینه ها:
در این لینکها توضیح کامل در مورد تنظیمات ProcessModel داده:
ولی با این حال همه اینها فقط شما رو قادر می کنند سرویس دهنده ای داشته باشید که از حداکثر منابع استفاده کند. یعنی اگر چند Thread وجود داشت ASP.NET منابع لازم برای اجرای همزمان اونها رو داشته باشه.
چه 1 cpu چه 100 تا، حالا اگر تنها یک کار داشته باشیم چطور می خواد این یک کار (غیرقابل خرد شدن) رو با همه cpu ها انجام بده؟
در مورد کاری که داری انجام میدی یه کم بیشتر توضیح بده.
می تونید از Task Parallel Library که در نسخه 3.5 دات نت معرفی شده، استفاده کنید. علاوه بر چیزی که خواستید، قابلیت های زیادی برای تولید برنامه Multi-threaded بهتون میده. از طرفی بعضی کامپایلرها این امکان را دارند که در صورت امکان، کد را به branchهایی جهت اجرا بر روی چند CPU تبدیل کنند. شاید کامپایلر شما هم سوئیچ هایی برای این منظور داشته باشه. نکته دیگه هم این هست که شاید الگوریتم فعلی شما برای انجام کار مورد نظر، قابلیت شکسته شدن به اجزاء کوچکتر را نداشته باشه، اما ممکنه بتونید از الگوریتم دیگه ایی برای انجام همون کار استفاده کنید که قابل شکسته شدن به اجزاء کوچکتر باشه. به این نکته هم توجه داشته باشیدکه در بدترین حالت اگر پردازش شما فقط روی یک CPU امکان اجرا داشته باشه، باز هم با جدا کردن Thread اجرای آن پردازش از Thread اصلی برنامه، چند درصدی سرعت کار افزایش پیدا خواهد کرد.یک پردازش منسجم هست که داخل یه روتین قرار هست کارش رو انجام بده شما فرض رو مثال زیر بگیر.
کد:
For i = 0 To 9000000000
Next
وَ سَيَعْلَمُ الَّذِينَ ظَلَمُوا [آل محمد حقهم] أَيَّ مُنْقَلَبٍ يَنْقَلِبُونَ - الشعراء (227)
و ظالمین [حق آل محمد (ص) ] به زودی خواهند دانست که به کدام بازگشتگاه بازخواهند گشت.
نکته فوق العاده ای بود ولی ظاهرا این یک کلاس الحاقی هست درست میگم؟!
http://www.microsoft.com/downloads/d...displaylang=en
یا من با چیزه دیگه اشتباه گرفتمش؟
-------------------------------------
نوع کار اینه که:
چند تا وب سرور یه سری در خواستها رو پروسس و ذخیره میکنن حالا یه سرور اصلی در نظر گرفته شده که اطلاعات ذخیره شده توسط وب سرور ها رو بر اساس یه الگوریتم خاص مجداد پردازش میکنه و در اصل اطلاعاتی که از وب سرور ها گرفته شده را نوع خاصی فیلتر روشون اعمال میکنه.
حالا این وسط زمان پردازش اهمیت داره ، چون مثلا اگر یکی از رکورد ها تا 30 ثانیه آینده پردازش اصلی روش انجام نشه کل پروسس بیهوده بوده و همینوطر پردازش تمام رکورد ها وابسته به پردازش رکورد قبلی و یه سری دیگه اطلاعات هست برای همین محدودیت دارم برای استفاده بیشتر از Thread برای همین من پردازش رو میخوام به دو دسته تقسیم کنم و هر CPU من یک گروه کاری رو به عهده بگیره منتها میخوام از هر 2 هسته Cpu استفاده بشه که زمان رو نصف کنم.
ممنون از لطفت
آخرین ویرایش به وسیله raravaice : سه شنبه 04 تیر 1387 در 17:48 عصر
همینی هست که گرفتید.ظاهرا این یک کلاس الحاقی هست درست میگم؟!
http://www.microsoft.com/downloads/d...displaylang=en
یا من با چیزه دیگه اشتباه گرفتمش؟
اینجور محدودیت های زمانی، یعنی به نوعی سیستم شما یک سیستم Real-time هست. می تونید در زمینه سیستم های Real-time تحقیق کنید. بطور کلی، سیستم Real-time سیستمی هست که تضمین میکنه عمل خاصی را در محدوده یک بازه زمانه مشخص انجام بده.اگر یکی از رکورد ها تا 30 ثانیه آینده پردازش اصلی روش انجام نشه کل پروسس بیهوده بوده
اگر پردازش ها به همدیگر مربوط هستند و حتما باید پشت سر هم انجام شوند، ممکن هست که بتوانید هر پردازش را به اجزاء کوچکتری تقسیم کنید، یعنی بجای آنکه هر هسته CPU با یک پردازش کار کند، می توانید هر پردازش را به اجزاء کوچکتری تقسیم کنید که هر یک بر روی یک CPU اجرا شوند. این کار باعث افزایش سرعت هر پردازش و در نتیجه افزایش سرعت انجام کل پردازش ها می شود.همینوطر پردازش تمام رکورد ها وابسته به پردازش رکورد قبلی و یه سری دیگه اطلاعات هست
اگر بخواید از TPL استفاده کنید، می تونید یک Task Manager داشته باشید که وظیفه اش مدیریت انجام پردازش شما ست. حالا می تونید این پردازش کلی را به چند Task کوچکتر تقسیم کنید (مثلا به قول شما کار را به دو دسته یا بیشتر تقسیم کنید). خوبی کار با TPL این هست که شما فقط به کار نوشتن Taskها و تقسیم کار کلی بین آنها مشغول میشید. TPL خودش بر اساس فاکتورهای مختلف - مثل تعداد هسته های CPU موجود- تعداد Thread ها و نحوه اجرای آنها را کنترل می کند. از طرفی سعی می کند بار حاصل از انجام پردازش را روی تمامی هسته ها تقسیم کند، یعنی اگر هسته ایی پردازش مربوط به خود را انجام داد و آزاد شد، ولی سایر هسته ها هنوز مشغول هستند، TPL بطور خودکار بخشی از کار مربوط به سایر هسته ها را به هسته آزاد واگزار می کند تا توازن بار پردازشی حفظ شود. یکی از مزیت های TPL این هست که برنامه نویس را از درگیر شدن در جزئیات ساخت Thread-pool، ساخت و آزاد کردن Worker Thread ها، مدیریت اجرای آنها، و حفظ توازن بار پردازشی بی نیاز میکنه؛ برنامه نویس فقط روی تقسیم مسئله به چند Task و چگونگی انجام هر Task تمرکز میکنه.برای همین من پردازش رو میخوام به دو دسته تقسیم کنم و هر CPU من یک گروه کاری رو به عهده بگیره منتها میخوام از هر 2 هسته Cpu استفاده بشه که زمان رو نصف کنم.
در هر حال، ممکن هست که دوستان دیگه بتوانند راهنمایی های عملی بهتری بکنند، چون من اصلا دات نت کار نمی کنم.
وَ سَيَعْلَمُ الَّذِينَ ظَلَمُوا [آل محمد حقهم] أَيَّ مُنْقَلَبٍ يَنْقَلِبُونَ - الشعراء (227)
و ظالمین [حق آل محمد (ص) ] به زودی خواهند دانست که به کدام بازگشتگاه بازخواهند گشت.
علی کشاورز
لطف شما رو فراموش نمیکنم.
با تشکر از همه دوستان
موفق باشید