خیلی ممنون استاد .
پس این طور که شما میگید ، در آنِ واحد (و در یک لحظه) ، تهش فقط دو هسته (ی منطقی یا فیزیکی) باید درگیر باشن . در همون لحظه ، حداقل کارکرد بقیه ی هسته ها ، حداقل اینکه باید پایین بیاد .
بالاخره با این توضیحات تون ، نمیتونم قبول کنم که در یک لحظه ، بیش از دو هسته درگیر پروسه ام باشه . درصورتی که کد اول در پست اول را اگه در 4 نخ درون پردازنده ی من اجرا کنم ، پروسه ام ، حداقل بیش از 85 درصد پردازنده را اشغال میکنه (یعنی حداقل 3 هسته بصورت همزمان) و گاها تا 100 درصد هم میره که باعث میشه به مدت مدیدی حتی پردازنده ، به نخ مربوط به موس ام هم پاسخگو نباشه و رسم موس خیلی کند صورت بگیره .
یا همون کد (اول در پست اول) را در پردازنده تون وقتی که 8 نخ کردید اجرا کنید ، باز هم باید آمار اشغال پردازنده تون بیش از 85 درصد (و شاید هم مثل من گاها تا 100 درصد) بره . وگرنه طبق گفته ی شما ، پروسه ی برنامه ، همزمان باید 2 هسته ی منطقی از پردازنده تون یعنی 25 درصد از پردازنده تون (یا تهش دیگه 2 هسته ی فیزیکی که میشه 4 هسته ی منطقی از پردازنده تون یعنی 50 درصد از پردازنده تون) را اشغال کنه .
بعد اینکه اگه وقتی از کلاس Thread کدمون را اجرا میکنیم ، کدمون فقط درون یک هسته (بصورت همزمان) اجرا میشه ، پس نباید وقتی که درون Task Manager روی پروسه مون کلیک راست و Set Affinity را روی یک هسته فقط ست میکنیم ، کارایی هر تعداد نخ ای که میسازیم ، متفاوت باشه . درسته؟
اما وقتی این کار را کنید و کد اول در پست اول را که دادم اجرا کنید ، میبینید زمان اجراش 2 برابر بیشتر طول میکشه .
این دلیل هم کافی نیست که وقتی از کلاس Thread استفاده میکنیم ، به همون تعدادِ نخ مون ، توی چند هسته ی منطقی (و فیزیکی) بصورت همزمان اجرا میشن؟
در آخر پست 20 هم یه قضیه ی دیگه را هم اضافه کرده بودم :
"
قضیه ی بعدی اینکه من وقتی توی پردازنده ام 4 نخ ایجاد میکنم (مثلا کد اول در پست اول را در 4 نخ اجرا میکنم) ، چون کارکرد پردازنده گاها تا 100 درصد میرسه (نمیدونم چرا گاها تا 85 و گاها تا 95 و گاها تا 99 و حتی گاها تا 100 درصد کارکرد پردازنده میره) ، یعنی در واقع اون مواقعی که کارکردش تا 100 درصد میرسه ، سیستم ام کم میاره و حتی موس رو هم بخوبی نمیتونم حرکت بدم و بصورت واضح موسم بسیار کند حرکت میکنه . خوب اگه توی یه هسته کدم بصورت همزمان اجرا میشد ، پس 3 هسته ی دیگه ام آزاد میبود و دیگه پردازش نخ مربوط به عملیات موس که نباید با مشکل کندی شدید رو به رو میشد .
"
وقتی یه هسته ی فیزیکی را 100 درصد بگیم که کارایی داره ، حالا وقتی که یه کدی که همزمان از 2 هسته ی فیزیکی استفاده میکنه و در صورتی که بهینه باشه و مناطق بحرانی نداشته باشه (یعنی همزمان چند هسته نخوان از حافظه ی مشترکی بخونن یا بنویسن) ، در این شرایط ، از اون 100 درصدِ کارایی هر هسته (ی فیزیکی) ، حداقل 30 درصد بازدهی داره که (یه چیزهای سطحی خوندم و فکر کنم قانونی بنام amdh نمیدونم چی چیاینو میگه) . اگه کد ، نقاط بحرانی نداشته باشه و یا خیلی کم داشته باشه ، و هر هسته بخواد 30 درصد از کاراییِ 100 درصدش را هم نداشته باشه که اصلا پردازنده ی چند هسته ای واسه چی بسازن؟
در این صورت حتی با 4 برابر شدن هسته ، پردازش و کارایی ، به کمتر از 2 برابر میرسه . (قبول دارم کد بهینه نباشه ، کارایی بصورت همزمان و در چند هسته ، حتی کم هم ممکنه بشه . منظورم روی کد کاملا بهینه هست) .
بله میدونم در کلاس Parallel ، ممکنه در چند هسته بصورت همزمان اجرا بشه . ممکنه هم نشه .
خیلی ممنون استاد .
از دوست مون هم بابت مطلبش متشکرم .