چرا نرم افزارهای 2 بعدی (و نرم افزارهای 3 بعدی در زمان طراحی _زمان غیر رندر) ، نمیتونن از پردازنده های بالای 8 هسته ای استفاده کنند؟
همونطور که متوجه شدید و گفته شد ، تعداد نخ های فعال (نخ هایی که در حال اجرای کدشون هستند) در یک لحظه ، تعداد استفاده از هسته های پردازنده را مشخص میکنه . و همونطور هم که گفته شد ، نرم افزارهای 2 بعدی ، در هر حالتی (چه زمان طراحی چه زمان رندر) و همچنین نرم افزارهای 3 بعدی در زمان طراحی ، در یک لحظه ، بصورت متوسط 4 تا 6 نخ فعال دارند .
چرا نرم افزارهای 2 بعدی (و همچنین نرم افزارهای 3 بعدی در زمان طراحی _زمان غیر رندر) ، بیشتر از 8 نخ در یک لحظه ایجاد نمیکنند تا بتونن از تمام هسته های پردازند هایی که از 8 هسته بیشتر دارند ، استفاده کنند؟
این به ماهیت نخ ها برمیگرده . اول اینکه ، این نکته را یادآوری کنم که یک نخ ، فقط در یک هسته (در یک لحظه) اجرا میشه .
نخ ها ، مثل کارها (کارهایی که باید در دنیای واقعی انجام بشن) شبیه هستند .
وقتی نخ ای ساخته میشه که ، یک کار جدید وجود داشته باشه که هیچ ارتباطی با کار قبلی که در نخ قبلی انجام میشه ، نداشته باشه یا کمترین ارتباط را داشته باشه . وگرنه تداخل کارها ، باعث میشه کارایی ، پایین بیاد .
اول بذارید مثالی زده شه :
فرض کنید یک کاری وجود داره با عنوان "خالی کردنِ سیمان از درون یک کیسه ی سیمان در ظرف جدید توسط بیل" که برای این کار ، 2 کارگر با 2 تا بیل میخوان این کار را انجام بدن .
هیچ وقت همزمان 2 تا بیل ، توی یک کیسه نمیره . بنابراین یک کارگر همیشه باید منتظر بمونه تا بیلِ قبلیِ ای که کارگر قبلی توی کیسه وارد کرد را بیرون بیاره تا (کارگرِ دومی) بتونه بیل خودش را وارد همون کیسه کنه . بنابراین در واقع در اینجا ، فقط یک کارگر عملا داره روی یک کیسه کار میکنه و وجود 2 کارگر ، نه تنها سودی نداره ، گاها ممکنه نتیجه ی عکس بده .
بجای این کار ، بهتر هه که یک کارگر ، یک کیسه ی سیمان را خالی کنه و کارگرِ دیگه ، سراغ کیسه ی سیمانِ جدیدی بره . این جوری ، کارایی افزایش پیدا میکنه . یعنی ، کار در صورتی زودتر انجام میشه که به هر کدوم از کارگرها ، یک کارِ مجزا (مستقل) و جدیدی بدهند .
در مثال بالا ، کار (خالی کردن کیسه ی سیمان) را جای نخ ها بذارید و کارگرها را جای هسته های پردازنده .
بنابراین ، نمیشه بی محابا ، سازنده ی نرم افزار هر تعدادی خواست ، نخ درست کنه . چه بسا کارها تداخل پیدا کنن و سرعت پردازش ، کمتر بشن (مثل قضیه ی خالی کردن یک کیسه ی سیمان توسط دو کارگر) .
بنابراین کارهای مختلف ، باید جوری باشند که به ترتیب همدیگه کاری نداشته باشند تا بشه در نخ های دیگه اجرا بشن (مثل خالی کردن دو کیسه ی سیمان مجزا که دو کارگر ، هر چقدر خواستن ، میتونن برای خودشون کار کنن . مثلا یکی 10 درصد از کیسه ی اولی را خالی میکنه و اون یکی کارگر 60 درصد را خالی میکنه که دو کیسه و دو کارگر ، میزان و ترتیب کارشون به هم مرتبط نمیشه یا کمترین ارتباطی را با هم دارن) .
اما هر پلاگین و هر افکت ای که در نرم افزارهای 2 بعدی بکار میبریم ، عملیاتی و کدهای مجزا و مستقل دارند بنابراین میشه هر کدوم شون را در یک لحظه توی نخ جدیدی اجرا کرد تا در نتیجه در هسته های مختلف درون پردازنده اجرا بشن و کارایی و سرعت پردازش بالاتر بره . همینطور خیلی از کارهای دیگه هم همینطورند و میشه در نخ های جدیدی اجرا بشن . مثلا وقتی 40 تا افکت و پلاگین برای یه لایه اِعمال میکنیم ، چون هر افکت و پلاگین ، کدی مستقل و مجزا دارن ، بنابراین میشه در یک لحظه ، در 40 نخ جدید اجراشون کرد تا در 40 هسته از یک پردازنده (فرض کنید پردازنده ی 64 هسته ای داریم) بصورت همزمان اجرا بشن و بنابراین سرعت رندر ، خیلی بالاتر بره اما این کار را نمیکنن (جواب در سئوال پست زیر)






پاسخ با نقل قول
Bookmarks