نقل قول نوشته شده توسط SajjadKhati مشاهده تاپیک
خیلی ممنون استاد .
پس این طور که شما میگید ، در آنِ واحد (و در یک لحظه) ، تهش فقط دو هسته (ی منطقی یا فیزیکی) باید درگیر باشن . در همون لحظه ، حداقل کارکرد بقیه ی هسته ها ، حداقل اینکه باید پایین بیاد .
وقتی دو هسته درگیر اجرای برنامه شدن، طبعا باری که روی دوش سایر هسته ها می افته افزایش پیدا میکنه، برنامه ها برای اجرا از سیستم عامل سرویس و منبع نمیخوان؟ مدیریت حافظه و پروسه ها و ... در سیستم عامل پردازنده لازم نداره؟
سخت افزار هایی که سیستم عامل باهاشون ارتباط داره وقتی برنامه شما در حال اجرا است خاموش که نشدن. مدیریت وقفه هایی که هر لحظه رخ میده پردازنده لازم نداره؟ هسته های دیگه بیشتر از قبل درگیر میشن چون سیستم عامل برای اجرای هر درخواست پردازش باید بگرده دنبال یک هسته که نخ های شما بهشون مجال دادید. شما ترافیک کاری رو افزایش دادید. طبعا فشار کاری رو همه هسته ها افزایش پیدا می کنه.


بالاخره با این توضیحات تون ، نمیتونم قبول کنم که در یک لحظه ، بیش از دو هسته درگیر پروسه ام باشه . درصورتی که کد اول در پست اول را اگه در 4 نخ درون پردازنده ی من اجرا کنم ، پروسه ام ، حداقل بیش از 85 درصد پردازنده را اشغال میکنه (یعنی حداقل 3 هسته بصورت همزمان) و گاها تا 100 درصد هم میره که باعث میشه به مدت مدیدی حتی پردازنده ، به نخ مربوط به موس ام هم پاسخگو نباشه و رسم موس خیلی کند صورت بگیره .


نقل قول نوشته شده توسط SajjadKhati مشاهده تاپیک
یا همون کد (اول در پست اول) را در پردازنده تون وقتی که 8 نخ کردید اجرا کنید ، باز هم باید آمار اشغال پردازنده تون بیش از 85 درصد (و شاید هم مثل من گاها تا 100 درصد) بره . وگرنه طبق گفته ی شما ، پروسه ی برنامه ، همزمان باید 2 هسته ی منطقی از پردازنده تون یعنی 25 درصد از پردازنده تون (یا تهش دیگه 2 هسته ی فیزیکی که میشه 4 هسته ی منطقی از پردازنده تون یعنی 50 درصد از پردازنده تون) را اشغال کنه .
این موارد رو بررسی کنید.
اگر دو نسخه فایل اجرایی اون برنامه ProcessThreads رو اجرا کنید و در هر کدوم یک نخ بسازید و بدون محدودیت در CPU ها همزمان اجرا بشن، Total usage و CPU usage شون نسبت به وقتی که تنهایی اجراشون می کردید کاهش پیدا می کنه یا نه؟
هر دو حالت رو امتحان کنید. حتی بعدش CPU ها رو نصف کنید و نیمی رو در این یکی برنامه تیک بزنید و نیمی در اون یکی برنامه و مجددا یک نخ در هر کدوم اضافه کنید تا همزمان اجرا بشن.
آمار همچنان نسبت به اجرای تنهایی یک نخ در یک برنامه کمتره.
دو تا برنامه جدا هستند، پروسه هاشون مجزا است و میگید نمی تونم بپذیرم که بیش از دو هسته برای هر کدوم درگیر باشن. پس چه توضیحی دارید برای اینکه کارکرد شون کاهش پیدا کرد؟


نقل قول نوشته شده توسط SajjadKhati مشاهده تاپیک
بعد اینکه اگه وقتی از کلاس Thread کدمون را اجرا میکنیم ، کدمون فقط درون یک هسته (بصورت همزمان) اجرا میشه ، پس نباید وقتی که درون Task Manager روی پروسه مون کلیک راست و Set Affinity را روی یک هسته فقط ست میکنیم ، کارایی هر تعداد نخ ای که میسازیم ، متفاوت باشه . درسته؟
نه. درست نیست. مثل اینه که برید توی بانک و نوبت بگیرید و بعد بگن آقا شماره تون رو صدا کردن برید باجه شماره 3، بعد بگید نخیر من فقط باجه شماره 5 میرم، صبر میکنم تا سرش خلوت بشه.
وقتی تعداد انتخاب ها بیشتر باشه دست سیستم عامل باز تر خواهد بود. فقط زمانی این انتخاب انحصاری میتونست مفید باشه که به هر دلیلی سیستم عامل اون هسته رو همیشه بیکار نگه داشته بود که بصورت عادی همچین کاری رو با منابع با ارزشش نمی کنه.

نقل قول نوشته شده توسط SajjadKhati مشاهده تاپیک
اما وقتی این کار را کنید و کد اول در پست اول را که دادم اجرا کنید ، میبینید زمان اجراش 2 برابر بیشتر طول میکشه .
این دلیل هم کافی نیست که وقتی از کلاس Thread استفاده میکنیم ، به همون تعدادِ نخ مون ، توی چند هسته ی منطقی (و فیزیکی) بصورت همزمان اجرا میشن؟
من هیچ مشکلی در اینکه دو هسته منطقی داخل یک هسته فیزیکی بتوانند دو نخ رو همزمان با هم اجرا کنند ندارم. این رو قبلا هم بارها گفتم و خودتون هم میدونید.
ادعای شما وقتی میتونه قابل قبول باشه که شواهدی بر نقض اش نباشه.

نقل قول نوشته شده توسط SajjadKhati مشاهده تاپیک
قضیه ی بعدی اینکه من وقتی توی پردازنده ام 4 نخ ایجاد میکنم (مثلا کد اول در پست اول را در 4 نخ اجرا میکنم) ، چون کارکرد پردازنده گاها تا 100 درصد میرسه (نمیدونم چرا گاها تا 85 و گاها تا 95 و گاها تا 99 و حتی گاها تا 100 درصد کارکرد پردازنده میره) ، یعنی در واقع اون مواقعی که کارکردش تا 100 درصد میرسه ، سیستم ام کم میاره و حتی موس رو هم بخوبی نمیتونم حرکت بدم و بصورت واضح موسم بسیار کند حرکت میکنه . خوب اگه توی یه هسته کدم بصورت همزمان اجرا میشد ، پس 3 هسته ی دیگه ام آزاد میبود و دیگه پردازش نخ مربوط به عملیات موس که نباید با مشکل کندی شدید رو به رو میشد .
این همچنان ادامه همون فرض اولیه است که دارید که پردازنده یا داره کد نخ من رو اجرا میکنه یا اگه نمی کنه پس بیکار ئه.

نقل قول نوشته شده توسط SajjadKhati مشاهده تاپیک
وقتی یه هسته ی فیزیکی را 100 درصد بگیم که کارایی داره ، حالا وقتی که یه کدی که همزمان از 2 هسته ی فیزیکی استفاده میکنه و در صورتی که بهینه باشه و مناطق بحرانی نداشته باشه (یعنی همزمان چند هسته نخوان از حافظه ی مشترکی بخونن یا بنویسن) ، در این شرایط ، از اون 100 درصدِ کارایی هر هسته (ی فیزیکی) ، حداقل 30 درصد بازدهی داره که (یه چیزهای سطحی خوندم و فکر کنم قانونی بنام amdh نمیدونم چی چی اینو میگه) . اگه کد ، نقاط بحرانی نداشته باشه و یا خیلی کم داشته باشه ، و هر هسته بخواد 30 درصد از کاراییِ 100 درصدش را هم نداشته باشه که اصلا پردازنده ی چند هسته ای واسه چی بسازن؟
در این صورت حتی با 4 برابر شدن هسته ، پردازش و کارایی ، به کمتر از 2 برابر میرسه . (قبول دارم کد بهینه نباشه ، کارایی بصورت همزمان و در چند هسته ، حتی کم هم ممکنه بشه . منظورم روی کد کاملا بهینه هست) .

بله میدونم در کلاس Parallel ، ممکنه در چند هسته بصورت همزمان اجرا بشه . ممکنه هم نشه .
خیلی ممنون استاد .
از دوست مون هم بابت مطلبش متشکرم .
به اون آزمایش 10 ثانیه اول برنامه توجه کردید؟ اونکه دیگه بر اساس بازدهی 100 درصد هسته که نیست، معیار شهودی و تجربی ارائه میده از اینکه یک نخ در شرایطی که محدودیتی در انتخاب هسته نباشه چه قدر میتونه پاسخگویی بگیره و اون رو معیار 100 درصد میگیره.
اون موارد سربار سخت افزاری و نرم افزاری که در اجرا پیش میومده در این معیار خود به خود کسر شدن تا به 100 درصد بازدهی واقعی رسیدیم. شما که نمی توانید همچین معیار شهودی رو با هر قانون تئوریکی ترکیب کنید.