نقل قول نوشته شده توسط SajjadKhati مشاهده تاپیک
خیلی ممنون استاد .
بذارید فعلا ، فقط این تیکه تون را جواب بدم . ممنون از بقیه ی قسمت های جوابی که دادین .

وقتی توی پردازنده ی 4 هسته ای میگه مثلا 75 درصد پردازنده داره پروسه ی تو را پردازش میکنه (با کدهای clr مربوطه که مهم نیست) ، خوب یعنی 3 هسته را درگیر کرد دیگه . اگه درگیر شدن بصورت همگام بوده باشه که دیگه 75 درصد نمیشه

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


نقل قول نوشته شده توسط SajjadKhati مشاهده تاپیک
اتفاقا خروجی 2 برابر میگیریم دیگه (همون کد اول در پست اول که 2 برابر سریعتر از خروجی کد دوم در پست دوم هه)
بعد اینکه اگه در برنامه ی خودتون هم اگه فقط یک هسته را فعال کنیم و بیش از 2 نخ را اجرا کنیم ، کارایی کمتر میشه پس این نشون میده که در این صورت 2 نخ در یک هسته اجرا میشن (اگه فقط یک هسته را فعال کنیم و تیک بزنیم) (چون گفتید این افزایش کارایی بخاطر اینه که وقتی یک نخ اجرا میکنیم ، کل یک هسته تمام توانش را برای کد ما نمیذاره اما با ایجاد چند نخ و سوئیچ اون (تک) هسته روی نخ هامون ، به این دلیل هست که کارایی اش افزایش پیدا میکنه .
متوجه نشدم مشکلتون با حرفی که زدم چیه.
وقتی شما بیش از یک نخ دارید سهم تون از درخواست های پردازش بیشتر میشه، سیستم عامل یک صف درخواست ها داره که باید بهشون پاسخ بده، شما که دو تا نخ در این صف میذارید طبعا سیستم عامل رو در مجموع بیشتر پاسخگو کردید، مثل همون مثال نانوایی.

نقل قول نوشته شده توسط SajjadKhati مشاهده تاپیک
در این صورت گفتم کارایی ، حداقل باید 90 درصد افزایش پیدا کنه (یعنی حداقل نزدیک به دو برابر بیشتر بشه) که اولا نقاط بحرانی در نخ هامون وجود نداشته باشه ( که همونطور که میدونید ، مثلا به متغییر مشترکی در چند نخ نخوایم مشترکا دسترسی پیدا کنیم و بخونیم یا توش بنویسیم) و همچنین یه برنامه ای رو در تک هسته و تک نخ در قیاس با یه برنامه ای رو که در چهار هسته (و چهار نخ) اجرا کنیم ، گفتم . یعنی هر هسته ، تقریبا 30 درصد افزایش کارایی داشته باشه که در یه پردازنده ی 4 هسته ای (به نسبت تک هسته ای تک نخ) میشه 3*30 که میشه 90 درصد . یعنی یه برنامه ی 4 نخ هه (که در 4 هسته اجرا میشه و نقاط بحرانی نداره) حداقل باید 90 درصد یعنی 2 برابر سریعتر از حالت تک هسته ای باشه . مثل کد اول در پست اول که دادم .
90 رو گفتید از 30 * 3 بدست آوردید، این 30 درصد رو از روی چی حساب کردید؟
به این موارد توجه نمی کنید. سیستم عامل داره پاسخگوی نیاز یک عالمه برنامه میشه که برنامه شما صرفا یکی از اونها است. برای اینکه بتونه پاسخگوی نیاز سایر پروسه ها باشه ناچاره نخ های شما رو متوقف کنه. هر چقدر تلاش کنید بیشتر ازش پاسخگویی بگیرید همونقدر سربار بیشتری تحمیل میشه، شما که نمیتوانید 4 هسته رو تخصیص بدید به پروسه برنامه خودتون و بقیه پروسه ها رو در نظر نگیرید. وقتی شما تعداد نخ ها رو افزایش میدید سیستم عامل برای اینکه بتونه هسته آزاد پیدا کنه مجبور میشه دائم نخ ها رو به حالت تعلیق ببره و هی سوئیچ بین هسته ای انجام بده.

نقل قول نوشته شده توسط SajjadKhati مشاهده تاپیک
و منظورم این بود که اگه کلاس Thread ها فقط از یک هسته (بصورت همزمان) استفاده میکنن اما در عوض کلاس Parallel ها از چند هسته (بصورت همزمان) میتونن استفاده کنن ، پس توی الگوریتمی که در پست 5 دادید یا کد اول که در پست اول دادم (که نقاط بحرانی هم ندارن) رو وقتی در پردازنده ی 4 هسته (ی فیزیکی) اجرا میکنیم ، پس حداقل باید تفاوت 2 برابر اجرای سریعتر در کلاس Parallel ببینیم (چون همزمان در 4 هسته اجرا میشه) اما این اختلاف در بیشترین حد خودش به 10 درصد هم نمیرسه . گاها با هم برابر و گاها هم کلاس Thread بهتر عمل میکنه .
اولا مایکروسافت ادعا نکرده هر چی هسته روی پردازنده هست رو برای اجرا در Parallel بکار میبره، شما جایی همچین چیزی خوندین؟ در ضمن Parallel معجزه که نمیتونه بکنه، قدری از محدودیت های NET. کم می کنه، وگرنه از اساس معماری ماشین مجازی NET. رو تغییر نمیده.
در مستنداتش هم با اجرای ساده در همون تک نخ مقایسه شده که فرضا اجراش 4 برابر سریعتر شده، با احرای چند نخی مقایسه نشده. اونم میگه متناسب با افزایش تعداد هسته (proportionately) بهبود کارایی نشون میده، نمیگه نسبت به اجرای چند نخی بهبود کارایی آنچنانی نشون میده.
For parallel loops, the degree of parallelism doesn't need to be specified by your code. Instead, the run-time environment executes the steps of the loop at the same time on as many cores as it can. The loop works correctly no matter how many cores are available. If there is only one core, the performance is close to (perhaps within a few percentage points of) the sequential equivalent. If there are multiple cores, performance improves; in many cases, performance improves proportionately with the number of cores.
از طرف دیگه ما که نمیدونیم چقدر این نخ ها بهم وابسته هستند، نمیدونیم که چقدر به هماهنگی با هم نیاز دارند، از چیزی که در ماشین مجازی میگذره که خبر نداریم. نمیدونیم کدوم کد ها و کدوم نخ های هماهنگ کننده سربار ایجاد می کنند.
فقط یکسری توصیه هایی اینور و اونور پیدا میشه که شاید کمک کنه برای نوشتن کد های مناسبتر.