PDA

View Full Version : تقسیم پروسس روی سیستم مالتی کور



Hadizadeh
شنبه 17 آذر 1386, 13:03 عصر
سلام. یک پردازنده ِDual Core دارم. می خوام پروسس جاری روی دو Core به طور مساوی پخش بشه. تقسیم پروسه به دو Thread کفایت می کنه؟ ممنون

Inprise
شنبه 17 آذر 1386, 13:11 عصر
بستگی داره که منظورت از "بطور مساوی" قرار باشه چقدر به معنای علمی "مساوی" نزدیک باشه .
بهر حال فعلا کامپایلرهای مایکروسافت و بورلند هنوز خروجی هائی که به نحو احسن از مالتی کور استفاده کنن تولید نمیکنن . تو نقشه مسیر هر دو کمپانی به این مسئله اشاره شده . کامپایلر اینتل امکانات ویژه ای داره یه سری کتابخانه هم هست اما من تجربهء بیشتری ندارم .

Hadizadeh
شنبه 17 آذر 1386, 13:24 عصر
ممنون. به نظرم حتی اگه کاملا به صورت مساوی هم تقسیم نشه بازم از هیچی بهتره. من روتین هام رو با تکنولوژی MMX/SSE2-3 نوشتم ولی اینجور که تست کردم سرعت کدم روی یک پردازنده تک هسته ای با دو هسته ای زیاد فرق نمی کنه. گویا تقسیم بار درست انجام نمیشه و یا به عبارتی فقط یک هسته در کار دخیل هستش. حالا اگه کامپایلرها نمی تونن این کار رو بکنن ویندوز که می تونه، درسته؟ اگه اینطوری یه تریک اینه که دو تا برنامه مجزا بنویسیم که هر کدوم به طور موازی یه بخش از پروسه رو اجرا می کنن حالا ویندوز خودش پخش بار می کنه. نظرتون چیه؟

Inprise
شنبه 17 آذر 1386, 13:59 عصر
میتونی از Affinity Mask پروسه و Thread هات استفاده کنی ؛ اما به میزان دقیق بودن تقسیمی که انجام میشه امیدوار نباش چون ویندوز واقعا یه سیستم عامل SMP نیست . اگر مسئله ات روی لینوکس بود یک کرنل SMP میساختی و از امکاناتش استفاده میکردی . منظور این نیست که ویندوز با پردازنده های چند هسته ای و ... مشکلی داره یا هر چی . مسئله به "میزان" نزدیکی اون دو تا عاملی که در پست اول گفتم برمیگرده . اگر بقول معروف مشکلت "علمی" و محاسباتی نیست جای نگرانی هم نیست

Hadizadeh
شنبه 17 آذر 1386, 14:06 عصر
ممنون. خوب حالا فرض کنید که من پروسم رو ران کردم می رم Process Affinity اون رو ست می کنم. ولی مسئله اینه که به طور پیش فرض برای همه پروسه ها هر دوی CPU0 و CPU1 فعالند. خوب این چه کمکی می کنه؟

Hadizadeh
شنبه 17 آذر 1386, 14:09 عصر
به نظرم منظور شما این بود که دو برنامه مستقل که هرکدوم یه بخش از کار رو انجام می دن می نویسیم و بعد به صورت دستی تعیین می کنیم که هر کدوم توسط کدوم هسته پردازش بشن. درسته؟

Inprise
شنبه 17 آذر 1386, 14:11 عصر
میتونی اون مسک رو برای Threadهات هم فعال کنی . حداکثر کمکی که میکنه همینه . بقیه اش بر عهدهء Scheduler سیستم عامل است . البته من نمیدونم ملاک و معیار آزمایشی که کردی و کاری که کدهات قرار است انجام بدن چی هست

Inprise
شنبه 17 آذر 1386, 14:12 عصر
منظور شما این بود که دو برنامه مستقل که هرکدوم یه بخش از کار رو انجام می دن می نویسیم و بعد به صورت دستی تعیین می کنیم که هر کدوم توسط کدوم هسته پردازش بشن. درسته؟

طبیعتا اینکار رو هم میتونی بکنی . اما همین مسئله برای Thread ها هم صادق هست . یعنی میتونی Threadهات رو خودت شخصا تقسیم کنی و مسئولیتشون رو به عهده بگیری .

Hadizadeh
شنبه 17 آذر 1386, 14:18 عصر
بسیار عالی. اگه واسه Thread ها هم میشه که خیلی خوب هستش. کاری که من دارم انجام می دم یک سیستم Real Time هستش که حجم زیادی از پردازش ها را باید خیلی سریع و بلادرنگ انجام بده. یه سری از گلوگاه ها رو با MMX/SSE بهینه کردم ولی می خوام از مزایای سیستم های مالتی کور هم استفاده کنم. تستی که انجام دادم خیلی ساده بود. یک برنامه با یک سینگل ترد که با MMX بهینه شده بود رو یک بار روی سیستم سینگل کور و یک بار روی سیتم دوال کور تست کردم ، میانگین زمانی پردازش پروسه مرتبط رو هر دو سیستم زیاد فرقی نمی کرد که به نظرم مشکل از عدم توزیع بار مناسب بود.

Hadizadeh
شنبه 17 آذر 1386, 14:20 عصر
در ضمن می دونم که باید سرچ کنم ولی احیانا کدی که افینیتی هر ترد رو ست می کنه می شناسین؟ ممنون

Hadizadeh
شنبه 17 آذر 1386, 14:30 عصر
این کد رو برای پروسه ها میشه استفاده کرد:


procedure TForm1.Button1Click(Sender: TObject);
var
vHandle : Cardinal;
vMaskProcess, vMaskSystem : cardinal;
begin
vHandle := Form1.Handle;
SetProcessAffinityMask(vHandle, 0); // or 1
GetProcessAffinityMask(vHandle, vMaskProcess, vMaskSystem);
showmessage(inttostr(vMaskProcess));
showmessage(inttostr(vMaskSystem));

end;

,ولی برای ترد ها چی؟

Inprise
شنبه 17 آذر 1386, 14:59 عصر
SetProcessAffinityMask روی همهء Threadهای پروسه اعمال میشه و SetThreadAffinityMask فقط روی Thread ای که هندلش رو پاس میکنی .

Inprise
شنبه 17 آذر 1386, 15:02 عصر
کاری که من دارم انجام می دم یک سیستم Real Time هستش

ویندوز به هیچ عنوان حتی نزدیک به یک سیستم عامل Real Time هم نیست . پس مجددا همون نکته قبلی رو تکرار میکنم که اگر مسئله محاسباتی و علمی است و به دقت جدی ای احتیاج داره قبل از اینکه وقتت تلف بشه ویندوز رو فراموش کن . اما برای مسائل عادی قاعدتا همین چیزها کافی هستن حداکثر اگر لازم بود سراغ کامپایلر اینتل و اون کتابخانه های مسبوق الاشاره و غیره هم میری...

Hadizadeh
شنبه 17 آذر 1386, 15:05 عصر
سیستمم یک دستگاه صنعتی جهت بازبینی کیفی با استفاده از متدهای بینایی ماشین هستش. بنابراین علمی هستش و دقت هم خیلی می خواد. پیشنهاد شما چیه؟ از چی استفاده کنم؟ میگن Win CE خوبه ولی برنامه نویسیش چه فرقی می کنه؟ برنامه های دلفی رو میشه روش اجرا کرد؟

Inprise
شنبه 17 آذر 1386, 15:10 عصر
این دو تا فانکشن تو کدوم یونیت تعریف شدن؟

http://i19.tinypic.com/7wrvn04.jpg

Hadizadeh
شنبه 17 آذر 1386, 15:11 عصر
آره پیداش کردم. ممنونم!!! :)

Inprise
شنبه 17 آذر 1386, 15:12 عصر
بنابراین علمی هستش و دقت هم خیلی می خواد.این لزوما تحت تاثیر Real Time نبودن ویندوز قرار نمیگیره . سیستم عامل Real Time تضمین میکنه حد فاصل بین دو اتفاق مشخص یک زمان مشخص و همیشه یک زمان مشخص باشه . بعضی از نرم افزارها و سیستمها نیاز به چنین ضمانتی دارن ، که چون زمینه الکترونیک و کنترل داری لازم نیست برات مثال بزنم ، بعضی ها نه . سیستمی که گفتی رو هر چند من تجربه ای ندارم اما بعید میدونم به چنین ضمانتی نیاز داشته باشه . بنابراین بعید هست که مشکلی پیدا کنی اما اگر مشکلی بود اولا برنامه های دلفی 32 بیتی و برای اینتل هستن و اغلب ویندوزهای CE روی محیطهائی غیر از این اجرا میشن و من تجربه ای ندارم . غیر از این بهترین توصیه استفاده از لینوکس هست . سواد دلفی ات به میزان فوق العاده خوبی روی فری پاسکال قابل استفاده است . این توصیه ها رو فقط به عنوان بک آپ در نظر بگیر

Hadizadeh
شنبه 17 آذر 1386, 15:13 عصر
تو عکسی که برام گذاشتین یه منو هست به نام MMX این چه نسخه ای از دلفی هستش؟!!!! خیلی جالبه برام. این منو چی کار می کنه؟ من با D7 کد می نویسم.

Hadizadeh
شنبه 17 آذر 1386, 15:17 عصر
این لزوما تحت تاثیر Real Time نبودن ویندوز قرار نمیگیره . سیستم عامل Real Time تضمین میکنه حد فاصل بین دو اتفاق مشخص یک زمان مشخص و همیشه یک زمان مشخص باشه . بعضی از نرم افزارها و سیستمها نیاز به چنین ضمانتی دارن ، که چون زمینه الکترونیک و کنترل داری لازم نیست برات مثال بزنم ، بعضی ها نه . سیستمی که گفتی رو هر چند من تجربه ای ندارم اما بعید میدونم به چنین ضمانتی نیاز داشته باشه .

آره، بر اساس تعریف شما، این پروژه در اون حد Real Time نیست ولی به هر حال زمان پردازش همیشه باید تو یک حد مشخص باشه. این طور نباشه که یه بار یک پروسه 30 میلی ثانیه طول بکشه یه بار 16 میلی ثانیه. هر چند که من خیلی وقت ها این مسئله رو تجربه کردم. علی الخصوص وقتی که یک پروسه مفروض برای اولین بار اجرا میشه. مثلا در بار اول 100 میلی ثانیه زمان می بره ولی اگه همونو یه بار دیگه بلافاصله اجرا کنیم 70 میلی ثانیه طول میکشه. من فکر کنم این قضیه به Cache و Fetching مربوط میشه. نظر شما چیه؟

vcldeveloper
شنبه 17 آذر 1386, 18:58 عصر
اگر الگوریتم محاسباتی شما به گونه ایی باشه که بشه اونو به چندین بخش کوچک تقسیم کرد که به موازات هم اجرا بشند، می تونید با استفاده از یک Thread Pool (http://en.wikipedia.org/wiki/Thread_pool_pattern) چندین Thread بصورت همزمان داشته باشید و وظیفه محاسبه هر بخش از کار را به یکی از اینها واگذار کنید. اینطوری می تونید بهتر از توان CPU های چند هسته ایی استفاده کنید.

Hadizadeh
یک شنبه 18 آذر 1386, 08:03 صبح
تو Device Manager در شاخه Processors دو تا CPU با این عنوان وجود داره:
Intel(R) Pentium(R) 4 CPU 3.00GHz
خودم شک کردم که سیستمم Dual Core هست یا نه. چون تو دیالوگ Set Affinity من دو تا پردازنده CPU0, CPU1 می بینم. ولی وقتی یک برنامه رو با هر دو تا اجرا می کنم 100 میلی ثانیه طول میکشه و وقتی توسط فقط یکی از اونها هم اجرا می کنم زمان پردازش فرقی نمی کنه. به نظرتون دلیلش چیه؟

ICEMAN
یک شنبه 18 آذر 1386, 09:28 صبح
سلام ...
یه سری اصطلاحات بود که من یا شاید خیلی های دیگه باحاشون کمتر آشنا هستن
MMX SSE نحوه بهینه کردن برنامه ها و ...

Hadizadeh
یک شنبه 18 آذر 1386, 09:32 صبح
اینا مفاهیم خیلی پیشرفته در معماری پردازنده های اینتل هستند که باید به زبان اسمبلی نوشته بشن. نیاز به خیلی تجربه جهت کد نویسی می خواد و همچنین در زمینه های مالتی مدیا و پردازش سیگنال استفاده میشه. فقط اینو بگم که به درد کارای معمولی نمی خوره. جایی که واقعا نیاز به پردازش های سنگین باشه، می تونی از اینها استفاده کنی که البته همش به هنر و تجربه برنامه نویس بستگی داره. پردازش هم باید نوع خاصی باشه، هر پردازشی رو نمیشه با اینها آپتیمایز کرد. اگه برنامه نویس هنر این کارو نداشته باشه، کدی می نویسه که نه تنها بهینه نشده بلکه باعث کلی از دردسرهای دیگه میشه. واسه اینه که هیچ کامپایلر هوشمندی به طور پیش فرض خودش این کارو نمی کنه و کارو سپرده دست خود برنامه نویس.

ICEMAN
یک شنبه 18 آذر 1386, 14:31 عصر
اینا مفاهیم خیلی پیشرفته در معماری پردازنده های اینتل هستند که باید به زبان اسمبلی نوشته بشن. نیاز به خیلی تجربه جهت کد نویسی می خواد و همچنین در زمینه های مالتی مدیا و پردازش سیگنال استفاده میشه. فقط اینو بگم که به درد کارای معمولی نمی خوره. جایی که واقعا نیاز به پردازش های سنگین باشه، می تونی از اینها استفاده کنی که البته همش به هنر و تجربه برنامه نویس بستگی داره. پردازش هم باید نوع خاصی باشه، هر پردازشی رو نمیشه با اینها آپتیمایز کرد. اگه برنامه نویس هنر این کارو نداشته باشه، کدی می نویسه که نه تنها بهینه نشده بلکه باعث کلی از دردسرهای دیگه میشه. واسه اینه که هیچ کامپایلر هوشمندی به طور پیش فرض خودش این کارو نمی کنه و کارو سپرده دست خود برنامه نویس.

میشه منبعی در این مورد معرفی کنید کتاب ,مقاله و ... تا بیشتر آشنا بشیم جای استفاده اش رو بدونیم و ...

Inprise
یک شنبه 18 آذر 1386, 20:13 عصر
تو Device Manager در شاخه Processors دو تا CPU با این عنوان وجود داره:
Intel(R) Pentium(R) 4 CPU 3.00GHz
خودم شک کردم که سیستمم Dual Core هست یا نه. چون تو دیالوگ Set Affinity من دو تا پردازنده CPU0, CPU1 می بینم. ولی وقتی یک برنامه رو با هر دو تا اجرا می کنم 100 میلی ثانیه طول میکشه و وقتی توسط فقط یکی از اونها هم اجرا می کنم زمان پردازش فرقی نمی کنه. به نظرتون دلیلش چیه؟

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

Hadizadeh
دوشنبه 19 آذر 1386, 07:35 صبح
دوتا Thread نوشتم که هرکدوم یک نیمه از یک تصویر رو پردازش می کنند. Priority هر دوتا هم به صورت مساوی و در ماکزیمم سطح تنظیم شده. در ضمن این دوتا هیچ نوع وابستگی هم به همدیگه ندارن. واضحه که اینجا مسئله قابلیت موازی شدن داره. ولی من هیچ نوع بهبود سرعتی مشاهده نکردم! به نظرتون دلیلش چیه؟ ممنون