PDA

View Full Version : سوال: کدی که CPU درگیر کنه



Sal_64
یک شنبه 28 دی 1393, 19:59 عصر
سلام وقت بخیر
برای مقایسه توان دو تا سیستم نیاز به قطعه کد و یا محساباتی دارم که کاملا CPU ها درگیر کنه
مهندسین گرامی چه چزی توصیه میکنن
ترجیحا کاری بر روی فایل ها نباشه (نوشتن ، کپی و ....)


تشکر

Saman_12
یک شنبه 28 دی 1393, 21:13 عصر
این چطوره :

using System;
using System.Diagnostics;
using System.Threading;


public class ForceWrok
{


public bool Finish { get; set; }
public event WorkFinishedEventHandler WorkFinished;
public delegate void WorkFinishedEventHandler(TimeSpan ts, Stopwatch sw);


private Int32 _livetime;
private Int32 _count;
private ThreadPriority _wrokerpriority;
private ThreadPriority _timerpriority;


public ForceWrok(Int32 livetime, Int32 count, ThreadPriority workerpriority, ThreadPriority timerpriority)
{
_livetime = livetime;
_count = count;
_wrokerpriority = workerpriority;
_timerpriority = timerpriority;
}




public void DoWork()
{
Thread t_timer = new Thread(_timer);
t_timer.IsBackground = true;
t_timer.Priority = _timerpriority;
t_timer.Start();


for (Int32 i = 1; i <= _count; i++)
{
Thread t_worker = new Thread(_worker);
t_worker.Priority = _wrokerpriority;
t_worker.IsBackground = true;
t_worker.Start();
}
}




private void _timer()
{
AutoResetEvent re = new AutoResetEvent(false);
Stopwatch sw = new Stopwatch();
TimeSpan ts = default(TimeSpan);
System.DateTime dn = default(System.DateTime);

dn = System.DateTime.Now;


sw.Start();
re.WaitOne(_livetime);
sw.Stop();


ts = System.DateTime.Now - dn;


Finish = true;


if (WorkFinished != null)
{
WorkFinished(ts, sw);
}
}




private void _worker()
{
while (!(Finish))
{
}
}
}





private void Form_Load(object sender, EventArgs e)
{
ForceWrok fw = new ForceWrok(10000, 100, ThreadPriority.Lowest, ThreadPriority.Highest);


fw.WorkFinished += WF;
fw.DoWork();
}




private void WF(TimeSpan ts, Stopwatch sw)
{
string realtime = "Real (ms) : " + ts.TotalMilliseconds.ToString();
string elapsedtime = "Elapsed (ms) : " + sw.Elapsed.TotalMilliseconds.ToString();


MessageBox.Show(realtime + "\n" + elapsedtime);
}


اگر تو شرایط یکسان بدون دیباگ اجراش کنی نتایج تقریبا مشابهی رو هم بدست میاری!(البته احتمالا)

Sal_64
چهارشنبه 01 بهمن 1393, 16:38 عصر
سلام
تشكر بابت وقتي كه گذاشتين
اما خب كدي نياز دارم كه از ترد استفاده نكرده باشه
در واقع قطعه كدي كه واقعا محسباتي باشه
بازم ممنونم

Saman_12
چهارشنبه 01 بهمن 1393, 18:49 عصر
كدي نياز دارم كه از ترد استفاده نكرده باشه

به نظر میرسه شما چند مورد رو فراموش کردین :
1.پروسس ها به طور عمومی حداقل یک ترد دارند که ترد اولیه نامیده میشه این پروسس دارای حافظه و منابع اختصاصی هست که موقع ایجاد به اون اختصاص داده میشه.
2.ترد های موجود درون پروسس به طور عمومی عاملان اجرای کد های شما هستند به عبارت دیگه برای اجرای یک فرایند شما حداقل به یک عامل اجرایی نیاز دارین.


پس اگر شما فرامینی رو درون برنامه خودتون دارید (حداقل) این ترد اصلی یا اولیه ی پروسس هست که مجری فرامین شماست.


3.پروسسور ها به طور عمومی دارای واحد های تکی به نام هسته هستند که میتوانند ترد ها رو مدیریت کرده و روی اونها کار کنند.
4.هر هسته در یک زمان تنها قادر به مدیریت یک ترد میباشد -تکنولوژی به نام هایپرتردینگ قابلیت هندل کردن دو ترد به صورت همزمان رو به هسته ها میدهد- و در زمان های متفاوت دارای قابلیت سویچ کردن بین ترد های مختلف برا پردازش اونها هست به عبارت دیگه این که ما قادر به اجرای چند ترد روی یک هسته هستیم به قابلیت سویچ بین ترد ها اشاره دارد.
5.به طور کلی اگر شما قادر به ایجاد یک ترد با نیاز پردازشی زیاد باشین این تک ترد در یک زمان تنها یک هسته رو درگیر خواهد کرد به عبارت دیگه برای اینکه قادر به درگیر کردن دو هسته باشید حداقل دو ترد پردازشی نیاز دارید.


پس اگر پروسسور شما دارای بیش از یک هسته -هرچند مجازی- باشد و شما در کل و تنها دارای یک ترد با نیاز پردازشی بالا باشین قادر نخواهید بود به مقصود تون برسید.


همین مثالی که براتون نوشتم اگه در حالت عادی حتی یک ترد کمتر از تعداد هسته ها بسازین ظرفیت استفاده از CPU به حداکثر نخواهد رسید.


Int32 prscount = Environment.ProcessorCount;
Int32 underleastcount = (prscount - 1);
// It just make fun for CPU ,at least it must be equal to ProcessorCount
ForceWrok fw = new ForceWrok(10000, underleastcount, Threading.ThreadPriority.Highest, Threading.ThreadPriority.Highest);



دوستان اگر جایی اشتباه میکنم بگین تا ذهنیتم رو درست کنم.
جای حناب FastCode خالی اگر بودند مطمئنا کلی ایراد از تو جمله هام پیدا میکردن.

به هر حال یه سری هم به این لینک بزن :
http://www.xtremesystems.org/forums/showthread.php?197835-IntelBurnTest-The-new-stress-testing-program

Sal_64
پنج شنبه 02 بهمن 1393, 22:10 عصر
سلام
تشكر بابت اين همه زمان
ببينيد بنده در برنامه چندين ترد دارم كه در هر كدوم تابعي فراخواني ميكنن ، داخل اين تابع كدهاي محساباتي بسيار ساده اي قرار دادم
حال قصد دارم كدهاي ساده اون تابع با كدهاي محاسباتي سنگين جايگزين كنم
اميدوارم تونسته باشم كاملا سوالم شفاف سازي كرده باشم
تشكر