نمایش نتایج 1 تا 37 از 37

نام تاپیک: سوال درباره ی اجرای چند نخی و استفاده از چند هسته بصورت همزمان

Hybrid View

پست قبلی پست قبلی   پست بعدی پست بعدی
  1. #1

    نقل قول: سوال درباره ی اجرای چند نخی و استفاده از چند هسته بصورت همزمان

    نقل قول نوشته شده توسط 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.
    از طرف دیگه ما که نمیدونیم چقدر این نخ ها بهم وابسته هستند، نمیدونیم که چقدر به هماهنگی با هم نیاز دارند، از چیزی که در ماشین مجازی میگذره که خبر نداریم. نمیدونیم کدوم کد ها و کدوم نخ های هماهنگ کننده سربار ایجاد می کنند.
    فقط یکسری توصیه هایی اینور و اونور پیدا میشه که شاید کمک کنه برای نوشتن کد های مناسبتر.

  2. #2

    نقل قول: سوال درباره ی اجرای چند نخی و استفاده از چند هسته بصورت همزمان

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



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


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


    اولا مایکروسافت ادعا نکرده هر چی هسته روی پردازنده هست رو برای اجرا در Parallel بکار میبره، شما جایی همچین چیزی خوندین؟ در ضمن Parallel معجزه که نمیتونه بکنه، قدری از محدودیت های NET. کم می کنه، وگرنه از اساس معماری ماشین مجازی NET. رو تغییر نمیده.
    در مستنداتش هم با اجرای ساده در همون تک نخ مقایسه شده که فرضا اجراش 4 برابر سریعتر شده، با احرای چند نخی مقایسه نشده. اونم میگه متناسب با افزایش تعداد هسته (proportionately) بهبود کارایی نشون میده، نمیگه نسبت به اجرای چند نخی بهبود کارایی آنچنانی نشون میده.

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

  3. #3

    نقل قول: سوال درباره ی اجرای چند نخی و استفاده از چند هسته بصورت همزمان

    نقل قول نوشته شده توسط the king مشاهده تاپیک
    چرا نمیشه، سر همین چیزی که میگید تامل کنید، وقتی یک هسته در حال سوئیچ کردن به نخ شما است، یا در حال انتقال وضعیت اجرایی برنامه شما به هسته دیگری است داره کد نخ شما رو اجرا می کنه؟ نه.
    چه هسته ای که داره وضعیت اجرایی بهش منتقل میشه و چه هسته ای که داره وضعیت اجرایی ازش منتقل میشه درگیر برنامه شما هستند، طبیعیه که چون وقتشون رو برنامه شما گرفته busy بودن شون رو پای برنامه شما بنویسند ولی این مواقع که کدی از نخ شما رو اجرا نمی کنند، فقط درگیر برنامه شما هستند. وقت و توان شون رو میگیره ولی یک عدد کد هم از نخ تون اجرا نمیشه. حالا این تعداد سوئیچ ها چقدر ئه؟ خیلی زیاد.
    هسته پردازنده که فقط دو حالت براش پیش نمیاد که یا نخ شما رو اجرا بکنه یا اصلا کاری به برنامه شما نداشته باشه، کاری که در مورد برنامه شما داره انجام میده که فقط اجرای نخ نیست.
    شما میخواهید از یک خونه به خونه دیگه اسباب کشی کنین با یک بشکن که وسایل خونه از این خونه نمیپرن وسط اتاق اون یکی خونه. پردازنده برای اینکار ها هم باید زمان صرف کنه.
    خیلی ممنون استاد .
    پس این طور که شما میگید ، در آنِ واحد (و در یک لحظه) ، تهش فقط دو هسته (ی منطقی یا فیزیکی) باید درگیر باشن . در همون لحظه ، حداقل کارکرد بقیه ی هسته ها ، حداقل اینکه باید پایین بیاد .
    بالاخره با این توضیحات تون ، نمیتونم قبول کنم که در یک لحظه ، بیش از دو هسته درگیر پروسه ام باشه . درصورتی که کد اول در پست اول را اگه در 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 هسته ی دیگه ام آزاد میبود و دیگه پردازش نخ مربوط به عملیات موس که نباید با مشکل کندی شدید رو به رو میشد .
    "


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


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


    اولا مایکروسافت ادعا نکرده هر چی هسته روی پردازنده هست رو برای اجرا در Parallel بکار میبره، شما جایی همچین چیزی خوندین؟ در ضمن Parallel معجزه که نمیتونه بکنه، قدری از محدودیت های NET. کم می کنه، وگرنه از اساس معماری ماشین مجازی NET. رو تغییر نمیده.
    در مستنداتش هم با اجرای ساده در همون تک نخ مقایسه شده که فرضا اجراش 4 برابر سریعتر شده، با احرای چند نخی مقایسه نشده. اونم میگه متناسب با افزایش تعداد هسته (proportionately) بهبود کارایی نشون میده، نمیگه نسبت به اجرای چند نخی بهبود کارایی آنچنانی نشون میده.

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

    بله میدونم در کلاس Parallel ، ممکنه در چند هسته بصورت همزمان اجرا بشه . ممکنه هم نشه .
    خیلی ممنون استاد .
    از دوست مون هم بابت مطلبش متشکرم .
    آخرین ویرایش به وسیله SajjadKhati : چهارشنبه 06 آذر 1398 در 09:00 صبح

  4. #4

    نقل قول: سوال درباره ی اجرای چند نخی و استفاده از چند هسته بصورت همزمان

    نقل قول نوشته شده توسط 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 درصد بازدهی واقعی رسیدیم. شما که نمی توانید همچین معیار شهودی رو با هر قانون تئوریکی ترکیب کنید.

  5. #5

    نقل قول: سوال درباره ی اجرای چند نخی و استفاده از چند هسته بصورت همزمان

    نقل قول نوشته شده توسط the king مشاهده تاپیک
    وقتی دو هسته درگیر اجرای برنامه شدن، طبعا باری که روی دوش سایر هسته ها می افته افزایش پیدا میکنه،
    سلامی مجدد
    خیلی ممنون استاد
    خوب ، منم همین رو میگم دیگه . بنابراین سایر پروسه ها و نخ ها (بجز پروسه ی من) رو سیستم عامل میندازه روی دوش 3 هسته ی دیگه که بار کاری شون خیلی کمتر هه .
    دقت کنید که من فقط همین برنامه ام را که بار کاری زیادی روی پردازنده محول میکنه را اجرا میکنم . درسته سیستم عامل و پروسه ها و نخ های مربوط به برنامه های دیگه هم وجود دارن و میخوان پردازش بشن اما :
    اولا بار کاری معمولی دارن (3 هسته ی دیگه ی من ، وقتی که برنامه ام را اجرا میکنم ، بار کاریِ هر هسته شون به 20 درصد از هر هسته هم نمیرسه) و
    دوما 3 هسته ی بیکارِ دیگه برای پردازشِ پروسه های دیگه و نخ های مربوط بهشون وجود داره و همونطور که قبلا گفته بودید که سیستم عامل و پردازنده سعی میکنن تا جایی که ممکنه ، روی همون هسته (ی فیزیکی) ، کد پروسه ی خاص را اجرا کنن و به هسته (ی فیزیکی) دیگه ، منتقل نکنن مگر اینکه بدونن به سربارش میارزه یا گرمای اون هسته زیاد شده باشه بنابراین چیزی که در زیر گفتید ، نیاز به توضیح داره که بگم :


    نقل قول نوشته شده توسط the king مشاهده تاپیک
    نه. درست نیست. مثل اینه که برید توی بانک و نوبت بگیرید و بعد بگن آقا شماره تون رو صدا کردن برید باجه شماره 3، بعد بگید نخیر من فقط باجه شماره 5 میرم، صبر میکنم تا سرش خلوت بشه.
    وقتی تعداد انتخاب ها بیشتر باشه دست سیستم عامل باز تر خواهد بود. فقط زمانی این انتخاب انحصاری میتونست مفید باشه که به هر دلیلی سیستم عامل اون هسته رو همیشه بیکار نگه داشته بود که بصورت عادی همچین کاری رو با منابع با ارزشش نمی کنه.


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

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

    علاوه بر این نکات ، نکته ی مهم اینه که حتی هم اگه سوئیچ روی نخ های پروسه های دیگه رو در این هسته ی فیزیکی ای که داره پروسه ی من را پردازش میکنه ، اصلا کم نکنه . خوب بصورت عادی ، گفتم که بار کار خاصی روی هسته ها نیست . در حد 20 درصد هم نمیشه . پس بنابراین وقتی اون برنامه ام را که اجرا میکنم (و Set Affinity را روی یه هسته برای پروسه ام متمرکز میکنم) ، اولا که اون هسته تا 100 درصد زمانش در حال کارکرد هست (منظورم این نیست که 100 درصد پردازنده داره کار انجام میده . سربار انتظار و سوئیچ اش را میدونم . بالاخره این سربارها هم از دید سیستم عامل و task manager ، اشغال هسته محسوب میشه . چه حالا میخواد پردازنده کاری انجام بده یا نه . مهم اینه که سیستم عامل نمیتونه در اون لحظه ، نخی را بهش بسپاره تا پردازش کنه) و دوما اگه سوئیچ به پروسه های دیگه رو هم در نظر بگیریم ، فقط 20 درصد از زمانش را برای پروسه های دیگه و نخ های مربوط به اون داره صرف میکنه .
    پس بنابراین اگه موضوع کاهش کارایی کد باشه ، اون هسته (که برنامه ام رو روی اون هسته Set Affinity کردم) ، باید تهش 20 درصد ، کدهای (کد اول در پست اول) پروسه ام را دیرتر اجرا کنه نه 2 برابر دیرتر.
    نمیدونم متوجه ی منظورم شدید یا نه .

    برای من که ظاهر قضیه نشون میده که کدهای کلاس Thread هم در چند هسته ی فیزیکی بصورت همزمان انجام میشه (البته ویندوز من ویندوز 10 64 بیت 1903 هست) .
    چه قضیه ی Set Affinity و چه قضیه ی قیاس کدهای کلاس Thread و کلاس Parallel (و نتیجه ی کاهش و افزایش کارایی شون را که گفتم) و بقیه ی مدارکی که اینجا گذاشتم .

  6. #6

    نقل قول: سوال درباره ی اجرای چند نخی و استفاده از چند هسته بصورت همزمان

    نقل قول نوشته شده توسط the king مشاهده تاپیک
    این موارد رو بررسی کنید.
    اگر دو نسخه فایل اجرایی اون برنامه ProcessThreads رو اجرا کنید و در هر کدوم یک نخ بسازید و بدون محدودیت در CPU ها همزمان اجرا بشن، Total usage و CPU usage شون نسبت به وقتی که تنهایی اجراشون می کردید کاهش پیدا می کنه یا نه؟
    هر دو حالت رو امتحان کنید. حتی بعدش CPU ها رو نصف کنید و نیمی رو در این یکی برنامه تیک بزنید و نیمی در اون یکی برنامه و مجددا یک نخ در هر کدوم اضافه کنید تا همزمان اجرا بشن.
    آمار همچنان نسبت به اجرای تنهایی یک نخ در یک برنامه کمتره.
    دو تا برنامه جدا هستند، پروسه هاشون مجزا است و میگید نمی تونم بپذیرم که بیش از دو هسته برای هر کدوم درگیر باشن. پس چه توضیحی دارید برای اینکه کارکرد شون کاهش پیدا کرد؟
    من دقیق متوجه نشدم هدف تون از این کار چیه .
    به هر حال تست کردم :

    1) دو برنامه ی ProcessThreads را همزمان اجرا کردم و در هر دو برنامه ، همه ی cpu ها تیک دارن .در هر کدوم از برنامه ها ، فقط یک نخ اجرا کردم (یکبار دکمه ی New Thread را کلیک کردم) .
    در یکی شون ، cpu usage و total usage مقدار 94 درصد و در برنامه ی دیگری ، این موارد مقدار 92 درصد شدن . مقدار اشغال پردازنده هم 25 درصد برای هر برنامه بود .

    2) دو برنامه ی ProcessThreads را همزمان اجرا کردم و در یکی شون فقط cpu 0 و cpu 1 را تیک زدم و در برنامه ی دیگری ، فقط cpu 2 و cpu 3 را تیک زدم . در هر کدوم از برنامه ها ، فقط یک نخ اجرا کردم (یکبار دکمه ی New Thread را کلیک کردم) .
    در یکی شون cpu usage و total usage مقدار 85 درصد و در برنامه ی دیگری ، این موارد مقدار 93 درصد شدن . مقدار اشغال پردازنده هم 25 درصد برای هر برنامه بود .


    به هر حال ، دو برنامه (و بنابراین دو پروسه ی متفاوت) ، در دو هسته ی متفاوت اجرا میشن که هر کدوم 25 درصد از پردازنده ی من را (که 4 هسته ای هست) ، اشغال میکنن (که کلا میشه 50 درصد) .
    وقتی هم که در یک پروسه ، دو نخ اجرا میکنیم ، باز هم 50 درصد را اشغال میکنن .


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

  7. #7

    نقل قول: سوال درباره ی اجرای چند نخی و استفاده از چند هسته بصورت همزمان

    نقل قول نوشته شده توسط SajjadKhati مشاهده تاپیک
    من دقیق متوجه نشدم هدف تون از این کار چیه .
    به هر حال تست کردم :

    1) دو برنامه ی ProcessThreads را همزمان اجرا کردم و در هر دو برنامه ، همه ی cpu ها تیک دارن .در هر کدوم از برنامه ها ، فقط یک نخ اجرا کردم (یکبار دکمه ی New Thread را کلیک کردم) .
    در یکی شون ، cpu usage و total usage مقدار 94 درصد و در برنامه ی دیگری ، این موارد مقدار 92 درصد شدن . مقدار اشغال پردازنده هم 25 درصد برای هر برنامه بود .
    شما وقتی در یک برنامه یک نخ رو آزادانه برای اجرا روی هر هسته ای انتخاب می کردید بهتون cpu usage و total usage بین 98 الی 100 درصد میده. درسته؟ حالا در دو برنامه رسیده به 94 و 92 درصد.
    طبق ادعای شما برای اجرای این دو برنامه فقط دو هسته درگیر شدن، هر هسته برای یک نخ در یک برنامه و اون دو هسته دیگه پردازنده تون الان بیکار ئه و 25 + 25 درصد توان پردازنده مشغول ئه و 25 + 25 درصد بیکار ئه.
    پس چطور این مساله رو توضیح میدید که یک هسته که 25 درصد توان پردازنده بود تونسته بود 98 الی 100 درصد کارایی بده ولی حالا که دو تا هسته شد با 50 درصد توان پردازنده کارایی شون شده 94 + 92 درصد؟
    مگه شما مدعی نیستید که اون دو تا هسته دیگه الان بیکار هستند و کاری به اون دو تا نخ ندارند برای سایر کارهای سیستم عامل آزادند هر کاری لازمه بکنند؟ چطور توان دو هسته ای موازی تون اومد پایین؟
    این چطور پردازش موازی ای در دو هسته فیزیکی مستقل ئه که دو تا پروسه جدا دارن ولی اجرای همزمان شون نتونسته کارایی اجرای تکی رو ارائه کنه؟

    نقل قول نوشته شده توسط SajjadKhati مشاهده تاپیک
    2) دو برنامه ی ProcessThreads را همزمان اجرا کردم و در یکی شون فقط cpu 0 و cpu 1 را تیک زدم و در برنامه ی دیگری ، فقط cpu 2 و cpu 3 را تیک زدم . در هر کدوم از برنامه ها ، فقط یک نخ اجرا کردم (یکبار دکمه ی New Thread را کلیک کردم) .
    در یکی شون cpu usage و total usage مقدار 85 درصد و در برنامه ی دیگری ، این موارد مقدار 93 درصد شدن . مقدار اشغال پردازنده هم 25 درصد برای هر برنامه بود .
    این هم مثل همون یکی. با فرض شما که مدعی هستید وقتی نخ بین CPU0 و CPU1 سوئیچ میشه سایر هسته ها آزاد هستند و درگیر نیستن، چه توضیحی دارید برای اینکه نخی که آزاد بوده در یکی از دو هسته CPU0 و CPU1 اجرا بشه روی کارکرد در هسته CPU2 و CPU3 تاثیر داره؟

    نقل قول نوشته شده توسط SajjadKhati مشاهده تاپیک
    به هر حال ، دو برنامه (و بنابراین دو پروسه ی متفاوت) ، در دو هسته ی متفاوت اجرا میشن که هر کدوم 25 درصد از پردازنده ی من را (که 4 هسته ای هست) ، اشغال میکنن (که کلا میشه 50 درصد) .
    وقتی هم که در یک پروسه ، دو نخ اجرا میکنیم ، باز هم 50 درصد را اشغال میکنن .
    و حتما می توانید توضیح بدین که چطور کارکرد این 50 درصد تون پایینتر از اجرای یک نخ شده؟ اینکه چطور با این اجرای موازی از 98 الی 100 درصد رسیدین به 94 و 92 درصد. شما که میگید من نمیتونم بپذیرم که وقتی بین دو هسته سوئیچ میشه بار کاری روی سایر هسته ها ایجاد بشه چطوری این تجربه رو تفسیر می کنید که فقط 50 درصد توان پردازنده رو گرفتید و کاری به سایر هسته ها نداشتید ولی کارکرد اومد پایینتر؟ شما که میگید پردازنده هنوز 50 درصد بیکار ئه چطور کارکرد هسته اش کم شد؟

    نقل قول نوشته شده توسط SajjadKhati مشاهده تاپیک
    متوجه نشدم منظورتون دقیقا چیه
    آره، متوجه نشدین. منظور من دقیقا همون مرغی است که یه پا داره.

  8. #8

    نقل قول: سوال درباره ی اجرای چند نخی و استفاده از چند هسته بصورت همزمان

    نقل قول نوشته شده توسط the king مشاهده تاپیک
    شما وقتی در یک برنامه یک نخ رو آزادانه برای اجرا روی هر هسته ای انتخاب می کردید بهتون cpu usage و total usage بین 98 الی 100 درصد میده. درسته؟ حالا در دو برنامه رسیده به 94 و 92 درصد.
    طبق ادعای شما برای اجرای این دو برنامه فقط دو هسته درگیر شدن، هر هسته برای یک نخ در یک برنامه و اون دو هسته دیگه پردازنده تون الان بیکار ئه و 25 + 25 درصد توان پردازنده مشغول ئه و 25 + 25 درصد بیکار ئه.
    پس چطور این مساله رو توضیح میدید که یک هسته که 25 درصد توان پردازنده بود تونسته بود 98 الی 100 درصد کارایی بده ولی حالا که دو تا هسته شد با 50 درصد توان پردازنده کارایی شون شده 94 + 92 درصد؟
    مگه شما مدعی نیستید که اون دو تا هسته دیگه الان بیکار هستند و کاری به اون دو تا نخ ندارند برای سایر کارهای سیستم عامل آزادند هر کاری لازمه بکنند؟ چطور توان دو هسته ای موازی تون اومد پایین؟
    این چطور پردازش موازی ای در دو هسته فیزیکی مستقل ئه که دو تا پروسه جدا دارن ولی اجرای همزمان شون نتونسته کارایی اجرای تکی رو ارائه کنه؟
    خیلی ممنون استاد
    اگه منظورتون از اینکه من گفتم بیکار هستن ، یعنی سوئیچ پروسه هام روی اون هسته ها انجام نمیشه و اون هسته ها ، به این جهت بیکار هستن که چنین چیزی نگفتم و توضیح دادم دیگه .

    بله . کارایی یک نخ با یک پروسه (در واقع cpu usage اش) ، برای من 98 درصد بود . و وقتی دو تا پروسه که هر کدوم شون یک نخ را توشون اجرا کردم ، این مقدار ، در یک پروسه 94 و در اون یکی پروسه ، 92 شده بود .

    علت اش هم تا جایی که میدونم بخاطر قضیه ی turbo clock در پردازنده ی من هست (اگه اشتباه نکنم ها) . بعضی از پردازنده ها توربو کلاک دارن . در واقع علاوه بر کلاک پایه (که واسه ی من 3.2ghz هست) ، یه کلاک توربو (که واسه ی من 3.4ghz هست) هم دارن . فرکانس پایه ، که همیشه ثابت هست و هیچ هسته ی ای از اون پردازنده ، حق نداره از کلاک پایه ی اون پردازنده ، کلاکش کمتر بشه . یعنی اگه پردازنده ای با تمام توان اش (توان و اشغالِ 100 درصد از تمام هسته ها) کار کنه و حتی زمانی که اور کلاک میشه ، هیچ هسته ای حق نداره فرکانسش کمتر از فرکانس پایه اش بشه . اما وقتی پردازنده با توان کمتری کار کنه (مثلا وقتی با 15 درصد از توان اش کار کنه) ، پردازنده ، اتوماتیک کلاک هسته رو افزایش میده تا به کلاک توربو بوست ای که مشخص کرده بود برای اون پردازنده ، نزدیک تر بشه و هر چقدر میزان کارکرد پردازنده بیشتر بشه ، کلاک توربو بوست اش کم و کمتر میشه تا به فرکانس پایه اش نزدیک بشه .
    مثلا برای من ، وقتی پردازنده ام 15 درصد مشغول هست ، با کلاک 3.35 تا 3.37 کار میکنه . وقتی 25 درصد ازش مشغول هست ، با کلاک 3.3 تا 3.5 کار میکنه . وقتی 50 درصدش مشغول هست ، با کلاک 3.25 کار میکنه و از 50 درصد به بالاتر (تا 100 درصد) با کلاک 3.19 کار میکنه .
    تا اینجا را که مطمئنم اما حالا اینکه مثلا وقتی 25 درصد اش مشغول هست ، میانگین کلاک هسته ها بشه 3.5 (یعنی کلاک هر هسته با هم متفاوت باشه و در نتیجه میانگین شون بشه 3.5) یا اینکه همه ی هسته ها با کلاک 3.5 کار کنن را نمیدونم ولی اگه اشتباه نکنم ، میانگین کلاک هسته ها میشه 3.5 و بنابراین باز هم اگه اشتباه نکنم ، هسته ها با کلاک های متفاوتی کار میکنند و در نتیجه ، وقتی یک پروسه رو اجرا میکنیم ، مقدار cpu usage اش 98 درصد میشه اما وقتی دو تا پروسه را اجرا میکنیم این مقدار در یک پروسه ، 94 و در پروسه ی دیگه 92 میشه .
    البته اینی که کلاک هسته ها در پردازنده های دارای تکنولوژی turbo boost clock ، متفاوت خواهد بود یا نه را باید تحقیق بشه (من فعلا اینترنت بین الملل ندارم) ولی به احتمال بسیار زیاد (95 درصد) ، همینطور هست.



    نقل قول نوشته شده توسط the king مشاهده تاپیک
    این هم مثل همون یکی. با فرض شما که مدعی هستید وقتی نخ بین CPU0 و CPU1 سوئیچ میشه سایر هسته ها آزاد هستند و درگیر نیستن، چه توضیحی دارید برای اینکه نخی که آزاد بوده در یکی از دو هسته CPU0 و CPU1 اجرا بشه روی کارکرد در هسته CPU2 و CPU3 تاثیر داره؟
    من اینم بگم قشنگ متوجه ی منظورتون نشدم ، قضیه ی مرغ را پیش نمیکشید

    نقل قول نوشته شده توسط the king مشاهده تاپیک
    و حتما می توانید توضیح بدین که چطور کارکرد این 50 درصد تون پایینتر از اجرای یک نخ شده؟ اینکه چطور با این اجرای موازی از 98 الی 100 درصد رسیدین به 94 و 92 درصد. شما که میگید من نمیتونم بپذیرم که وقتی بین دو هسته سوئیچ میشه بار کاری روی سایر هسته ها ایجاد بشه چطوری این تجربه رو تفسیر می کنید که فقط 50 درصد توان پردازنده رو گرفتید و کاری به سایر هسته ها نداشتید ولی کارکرد اومد پایینتر؟ شما که میگید پردازنده هنوز 50 درصد بیکار ئه چطور کارکرد هسته اش کم شد؟


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

  9. #9

    نقل قول: سوال درباره ی اجرای چند نخی و استفاده از چند هسته بصورت همزمان

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

    بله . کارایی یک نخ با یک پروسه (در واقع cpu usage اش) ، برای من 98 درصد بود . و وقتی دو تا پروسه که هر کدوم شون یک نخ را توشون اجرا کردم ، این مقدار ، در یک پروسه 94 و در اون یکی پروسه ، 92 شده بود .

    علت اش هم تا جایی که میدونم بخاطر قضیه ی turbo clock در پردازنده ی من هست (اگه اشتباه نکنم ها) . بعضی از پردازنده ها توربو کلاک دارن . در واقع علاوه بر کلاک پایه (که واسه ی من 3.2ghz هست) ، یه کلاک توربو (که واسه ی من 3.4ghz هست) هم دارن . فرکانس پایه ، که همیشه ثابت هست و هیچ هسته ی ای از اون پردازنده ، حق نداره از کلاک پایه ی اون پردازنده ، کلاکش کمتر بشه . یعنی اگه پردازنده ای با تمام توان اش (توان و اشغالِ 100 درصد از تمام هسته ها) کار کنه و حتی زمانی که اور کلاک میشه ، هیچ هسته ای حق نداره فرکانسش کمتر از فرکانس پایه اش بشه . اما وقتی پردازنده با توان کمتری کار کنه (مثلا وقتی با 15 درصد از توان اش کار کنه) ، پردازنده ، اتوماتیک کلاک هسته رو افزایش میده تا به کلاک توربو بوست ای که مشخص کرده بود برای اون پردازنده ، نزدیک تر بشه و هر چقدر میزان کارکرد پردازنده بیشتر بشه ، کلاک توربو بوست اش کم و کمتر میشه تا به فرکانس پایه اش نزدیک بشه .
    مثلا برای من ، وقتی پردازنده ام 15 درصد مشغول هست ، با کلاک 3.35 تا 3.37 کار میکنه . وقتی 25 درصد ازش مشغول هست ، با کلاک 3.3 تا 3.5 کار میکنه . وقتی 50 درصدش مشغول هست ، با کلاک 3.25 کار میکنه و از 50 درصد به بالاتر (تا 100 درصد) با کلاک 3.19 کار میکنه .
    تا اینجا را که مطمئنم اما حالا اینکه مثلا وقتی 25 درصد اش مشغول هست ، میانگین کلاک هسته ها بشه 3.5 (یعنی کلاک هر هسته با هم متفاوت باشه و در نتیجه میانگین شون بشه 3.5) یا اینکه همه ی هسته ها با کلاک 3.5 کار کنن را نمیدونم ولی اگه اشتباه نکنم ، میانگین کلاک هسته ها میشه 3.5 و بنابراین باز هم اگه اشتباه نکنم ، هسته ها با کلاک های متفاوتی کار میکنند و در نتیجه ، وقتی یک پروسه رو اجرا میکنیم ، مقدار cpu usage اش 98 درصد میشه اما وقتی دو تا پروسه را اجرا میکنیم این مقدار در یک پروسه ، 94 و در پروسه ی دیگه 92 میشه .
    البته اینی که کلاک هسته ها در پردازنده های دارای تکنولوژی turbo boost clock ، متفاوت خواهد بود یا نه را باید تحقیق بشه (من فعلا اینترنت بین الملل ندارم) ولی به احتمال بسیار زیاد (95 درصد) ، همینطور هست.
    سوال اینه که چرا بازدهی اومد پایینتر، نه اینکه چرا رفت بالاتر. شما دارید میگید چون پردازنده Turbo Boost داره که در موقع نیاز به پردازش بیشتر، فرکانس عملیاتی پردازشگر رو موقتا میبره بالاتر و در نتیجه پردازنده سریعتر کار می کنه.
    چون باید سریعتر کار کنه پس کندتر کار کرده؟ حالتون خوبه؟
    وقتی شما یک نخ رو به تنهایی اجرا می کردید یا این Turbo Boost فعال بوده یا نبوده. اگر در حالت تک نخی فعال بوده که در حالتی که با دو نخ کار می کردید هم فعال بوده و فرکانس کاری در بدترین شرایط همون بوده و تغییری نکرده، و در شرایط بهتر میتونسته حتی فرکانس بالاتر هم رفته باشه. اگر در حالت تک نخی Turbo Boost فعال نبوده، پس اگر در حالت دو نخی فعال شده که باید کارکرد بهتر هم بشه، چرا بدتر؟ تازه شما کل توان پردازنده رو که فعال نکردید، 50 درصدش ئه. Turbo Boost تسریع کننده است، تضعیف کننده که نیست.
    شما دارید برای کاهش کارایی دلیلی میارید که کارش بهتر کردن کارایی است.

    من اینم بگم قشنگ متوجه ی منظورتون نشدم ، قضیه ی مرغ را پیش نمیکشید
    نه فعلا با قضیه Turbo Boost پیش میریم.

    این هم مثل قضیه ی بالا (توربو کلاک) که گفتم .
    البته شاید وقتی بین دو هسته میخواد سوئیچ بشه ، وقتی از حافظه ی مشترک بین تمام هسته های فیزیکی (که اگه اشتباه نکنم ، حافظه ی کش سطح l3 ، حافظه ی مشترک بین تمام هسته های فیزیکی هست . درسته؟) شاید نیاز داشته باشه که این دو هسته برای انتقال کارهاشون ازش استفاده کنن که در این صورت چون حافظه ی مشترک هست ، در یک لحظه ، فقط یک هسته قطعا میتونه ازش استفاده کنه و سایر هسته ها نمیتونن و سربار ایجاد کنه ولی غیر از این حالت ها منظورم بود .
    شما می گید یک حافظه cache level 3 در بعضی پردازنده ها هست که بین همه هسته های فیزیکی مشترک هستند و هر کدوم بخواد ازش استفاده کنه بقیه هسته ها باید صبر کنند. اصلا کاری با درستی و نادرستی اش ندارم، با قابل قبول بودنش کار دارم.
    با این فرض که دسترسی بهش بصورت همزمان میسر نیست، دارید میگید وقتی یک هسته بخواد کاری با این حافظه مشترک انجام بده، لازمه که چهار هسته دیگه صبر کنند؟
    با این تعبیر که در هر لحظه فقط یک هسته از چهار هسته داره کاری با اون حافظه انجام میده و بقیه دارن صبر می کنند، چه با کد نخ شما درگیر باشن و چه نباشن.
    به این مساله توجه دارید که پیش از دسترسی به حافظه اصلی RAM باید به این حافظه Cache رجوع بشه؟
    Cache داخل CPU برای چیه؟ برای اینکه قبل از اینکه فرضا از حافظه اصلی چیزی خونده بشه بررسی بشه که آیا در این حافظه Cache گرانقیمت سریع کم حجم اون داده درخواستی هست که اگر باشه بجای حافظه اصلی از اون خونده بشه که کارایی بره بالا.
    اون Cache اضافه شده تا سرعت رو بالاتر ببره. اگر قرار باشه هسته ها برای دسترسی شون به Cache تو صف وایستن که هم کارایی هر چهار هسته میاد پایین و هم دسترسی به حافظه کند میشه. نمیان که یک حافظه گرانقیمت و پیچیده رو قرار بدن که بجای کمک مشکل ایجاد کنه.

تاپیک های مشابه

  1. پاسخ: 1
    آخرین پست: چهارشنبه 13 بهمن 1395, 00:04 صبح
  2. پاسخ: 3
    آخرین پست: دوشنبه 27 خرداد 1392, 12:26 عصر
  3. سوال : ساخت پایگاه داده بصورت تک فایل مستقل بدون پسورد ؟!
    نوشته شده توسط mf.designing در بخش امنیت در SQL Server
    پاسخ: 2
    آخرین پست: پنج شنبه 29 فروردین 1392, 17:09 عصر

قوانین ایجاد تاپیک در تالار

  • شما نمی توانید تاپیک جدید ایجاد کنید
  • شما نمی توانید به تاپیک ها پاسخ دهید
  • شما نمی توانید ضمیمه ارسال کنید
  • شما نمی توانید پاسخ هایتان را ویرایش کنید
  •