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


private void TransparentControl4_Click(object sender, EventArgs e)
{
Thread[] thread = new Thread[16];


for (int i = 0; i < thread.Length; i++)
{
thread[i] = new Thread(new ThreadStart(this.NewThreadMethod_1));
}


for (int i = 0; i < thread.Length; i++)
{
thread[i].Start();
}



}


private void NewThreadMethod_1()
{
Stopwatch stopwatch = new Stopwatch();
stopwatch.Start();


for (long counter = 0; counter < 10000000000; counter++)
{
}


stopwatch.Stop();
long elapsed = stopwatch.ElapsedMilliseconds;
MessageBox.Show("elspsed : " + elapsed.ToString() + " ms", "New Thread");
}


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

نقل قول نوشته شده توسط SajjadKhati مشاهده تاپیک
وقتی در پردازنده ی خودم (که 4 هسته ی فیزیکی داره) ، تعداد آرایه ی thread را اگه 1 یا 2 یا 3 یا 4 عضو بگیرم (یعنی 1 یا 2 یا 3 یا 4 نخ میسازم و اجرا میکنم) ، تقریبا زمان شون با هم یکی هست (با اختلاف 2 تا 3 ثانیه) و تقریبا همه شون بین 23 تا 26 ثانیه ، کدش اجرا میشه اما تعداد این آرایه را از 4 تا که بیشتر میکنم (5 و بالاتر) ، هر بار 7 ثانیه به اجراش اضافه تر میشه و دیرتر تموم میشه؟
تقریبا زمان شون یکی هست؟ مگه نمی گید تقریبا برابر هستند با اختلاف 2 الی 3 ثانیه، چرا پس نمی گید وقتی تعداد نخ ها رو بیشتر می کنم تقریبا برابر هستند با اختلاف 7 ثانیه؟ چه معیاری گذاشتید برای اینکه 2 الی 3 ثانیه اختلاف ناچیزی است و 7 ثانیه هست؟
اسناد شما میگه وقتی شما تعداد نخ بیشتری ساختید که بنا به گفته خودتون هر کدوم در هسته فیزیکی مستقل اجرا شدن کارکرد اومد پایینتر. مستقل اجرا شدن و اجراشون کندتر شد؟ اون اختلاف 2 الی 3 ثانیه رو ضرب کنید در فرکانس پردازنده تون ببینید چند سیکل میشه؟
اون 10000000000 بار تکرار حلقه تون رو 5.68 درصدش رو حساب کنید ببینید چند بار تکرار حلقه تون میشه. مقداری نیست؟ شما که میگید پردازنده تون داره هر نخ رو در هسته مجزا اجرا میکنه چطور اینقدر سیکل ساعت و اونقدر تعداد بار تکرار حلقه تون رو از دست دادید؟

نقل قول نوشته شده توسط SajjadKhati مشاهده تاپیک
یعنی وقتی 5 نخ (5 عضو برای اون آرایه ی thread) میسازم ، 32 ثانیه طول میکشه ، 6 نخ ، 40 ثانیه طول میکشه ، 7 نخ ، 45 ثانیه طول میکشه ، 8 نخ ، 51 ثانیه طول میکشه ، 10 نخ ، 63 ثانیه طول میکشه ، 12 نخ ، 75 ثانیه طول میکشه و 16 نخ ، 100 ثانیه طول میکشه؟
خوب که این خیلی طبیعیه، وقتی تعداد نخ ها زیاد میشه، هسته دائم در حال سوئیچ شدن بین نخ ها میشه و سربار اجرای سوئیچ هم فشار روی اون هسته ایجاد میکنه و هم سایر هسته ها و هم فعالیت بیشتر نخ های مدیریتی سیستم و در نتیجه کارایی بخاطر تعدد و ترافیک درخواست ها میاد پایین. وقی از یک در یک صف آدم به نوبت رد میشن نرخ عبور (آدم بر ثانیه) از در بیشتره یا وقتی 16 نفر آدم حمله میکنن سمت در و ترافیک ایجاد میشه؟
اتفاقا این سوال رو شما باید توضیح بدید، مگه شما نمی گید که نخ های من روی چهار هسته فیزیکی همزمان اجرا میشن؟
مرحله 1 - سه یا چهار نخ هر کدوم روی یک هسته شروع به اجرا می کنند. حالا بین شون سوئیچ هم ممکنه بشه، مهم نیست.
مرحله دوم - چند نخ در اجرای مرحله اول کارشون تموم شده و سیستم عامل پرونده اون سه یا چهار نخ رو میبنده میذاره کنار و هسته ها می توانند نخ های دیگری از برنامه تون رو که در صف باقی موندن اجرا کنند.
با فرض شما وقتی به مرحله دوم میرسیم همه اون هسته ها با اختلاف زمانی کم کارشون با یک نخ برنامه تموم شده.
حالا چطوری بین 5 نخی و 6 نخی اختلاف زمانی زیاد دارید؟ چه فرقی می کنه 5 نخی و 6 نخی؟ مرحله دوم شون رو تصور کنید. در هر دو وضعیت 5 نخی و 6 نخی وقتی به مرحله دوم رسیدیم به تعداد نیاز نخ های باقی مونده هسته بیکار هست.
مستندات شما میگه بین اجرای 5 نخی و 6 نخی پردازنده 8 ثانیه سکته کرده که اینقدر اختلاف زمانی دارن؟

نقل قول نوشته شده توسط SajjadKhati مشاهده تاپیک
چرا تا تعداد نخ هام ، هنوز برابر با تعداد هسته هام نشد ، اجرای همه شون تقریبا 25 ثانیه زمان میبرد ولی تعداد نخ هام که بیشتر از تعداد هسته هام شد ، به همون اندازه ، اجراشون بیشتر طول کشید؟
با توصیفی که شما از اجرای نخ هاتون دارید، هیچ توضیحی نمیشه داد، شما با فرض اشتباه یک سوالی طرح می کنید که چون فرض مساله غلطه نه من و نه خودتون نمی تونید با فرمول ریاضی توضیحش بدید.
وقتی فرض رو بر این گرفتید که هر نخ میتونه مستقل روی هسته ای مجزا همزمان با نخ دیگری از برنامه تون اجرا بشه، باید به این نتیجه برسید که در پردازنده 4 هسته ای که بار کاری عادی اش در حد 25 درصد نیست و کمتره،
سه هسته همواره اونقدر آزاد و بیکار هستند که بتوانند سه نخ برنامه شما رو در زمان n ثانیه تموم کنند و بعد سه نخ دیگه رو و عملا در بدترین شرایط زمان اجرای کامل 6 نخ تون با 5 نخ تون باید برابر باشه و نباید بیشتر طول بکشه.
چون وقتی سه هسته سرش خلوت ئه، اجرا کردن یک نخ و دو نخ و سه نخ باقی مونده زمان متفاوتی میخواد؟ مستنداتون این مساله رو تایید می کنه؟ نمیکنه.

نقل قول نوشته شده توسط SajjadKhati مشاهده تاپیک
چرا زمانی که 8 نخ ساختم ، تقریبا 2 برابر بیشتر از زمانی که 1 نخ یا 2 نخ یا 3 نخ یا 4 نخ ساختم ، طول کشید؟
چرا زمانی که 16 نخ ساختم ، تقریبا 4 برابر بیشتر از زمانی که 1 نخ یا 2 نخ یا 3 نخ یا 4 نخ ساختم ، طول کشید؟

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

نقل قول نوشته شده توسط SajjadKhati مشاهده تاپیک
همون عکسی که دادین ، 3 سئوال مونده به آخری را دقت کنین :


how can i see the highest turbo boost frequency for my processor?
if you set the number of cores to one in the BIOS and run the intel proccessor identification utility , it shows the highest turbo boost frequency .

اگه اشتباه نکنم ترجمه اش اینه :
"اگر تعداد هسته را به (مقدار) 1 در بایوس تنظیم کنید ، و برنامه ی intel proccessor identification را اجرا کنید ، بیشترین فرکانس turbo boost را نمایش میده ."

اگه ترجمه را تایید میکنید پس بگید چرا گفته وقتی میتونید متوجه ی بیشترین فرکانس turbo boost بشید که تعداد هسته را در بایوس تون به 1 تنظیم کنید (و موقتا بقیه ی هسته ها را نادیده بگیرید) ؟
چون طبق مستندات Intel Turbo Boost سقف فرکانسی که به پردازنده اختصاص داده میشه و طبعا متغیر ئه به اینها وابستگی داره، در همون صفحه ای نوشته شده که ازش نقل قول کرده بودم :
Type of workload
Number of active cores
Estimated current consumption
Estimated power consumption
Processor temperature
اینطوری که پردازنده بر اساس اینکه چند هسته فعال و غیر فعال هست، حرارت پردازنده چقدر ئه، چقدر برق مصرف میکنه و چقدر جریان میکشه و چقدر درخواست پردازش روی پردازنده هست فرکانس رو تغییر میده.
وقتی فقط یک هسته رو فعال کنید، هسته های دیگه از مدار خارج میشن و مصرف انرژی پردازنده به میزان متناسب کم میشه، جریانی که پردازنده میکشه به میزان متناسب کم میشه، حرارت پردازنده هم که موثر از اینها است کم میشه.
در نتیجه همه اون موارد که سقفی پایین تر از حداکثر میزان فرکانس ایجاد میکردن از بین میرن، خود بار کاری الان تعیین کننده فرکانس میشه که اونم یک پارامتر جدا است، سقف نیست.
شما در Intel proccessor identification utility میخواهید سقف فرکانس پردازنده رو بخونید، نه فرکانس متغیری که در این لحظه توسط Turbo Boostبرای CPU تعیین شده.
اگر همه هسته ها فعال باشند، احتمال داره با توجه به مشخصات پردازنده یا مادربورد و سیستم خنک کننده سقف های مضاعف تحمیل بشن و سقف فرکانسی که Intel proccessor identification utility اعلام میکنه کمتر از چیزی باشه که در بهترین شرایط سخت افزاری و به عنوان حداکثر فرکانس Turbo Boost برای پردازنده بدست میاد. دقت کنید که صحبت از حداکثر فرکانس پردازنده با Turbo Boost ئه، نه حداکثر فرکانس وقتی همه هسته ها رو فعال کردید و بصورت عادی از سیستم استفاده می کنید.
ممکنه بخاطر محدودیت های سخت افزاری سایر پارامتر ها هیچوفت نتوانید در عمل از اون سقف فرکانس استفاده کنید، مگر در همون حالتی که سیستم تک هسته ای یا حتی دو هسته ای شده.
میتوانید امتحان کنید، ممکنه با هر چهار هسته فعال هم به اون حداکثر فرکانس در عمل برسید، اما تا وقتی که پردازنده زیادی داغ نشده.