PDA

View Full Version : Multi Processor



mossaferin
سه شنبه 15 بهمن 1387, 20:43 عصر
سلام دوستان

می خوام بدونم چه جوری میشه روی یه سیستمی که دوال پروسسور هست ، برنامه ای بنویسیم که مثلا کار گرفتن اطلاعات از کارت واسط توسط یه پروسسور و کار پردازش و نمایش ان توسط پروسسور دیگر انجام شود؟(انجام این دوکار به صورت پارالل و بدون gap)

متشکرم

vcldeveloper
چهارشنبه 16 بهمن 1387, 03:17 صبح
Thread یا multithreading را جستجو کنید.

mossaferin
چهارشنبه 16 بهمن 1387, 11:31 صبح
سلام
ممنون از راهنمایی شما
سایت رو خیلی گشتم راجع به multithreading چند تا مقاله پیدا کردم که توی اونها راجع به multithreading روی یه پروسسور صحبت شده بود ، ولی راجع به Multiprocessing صحبتی نشده بود




Multitasking is running multiple "heavyweight" processes (tasks) by a single OS.
Multithreading is running multiple "lightweight" processes (threads of execution) in a single process / task / program.
Multiprogramming is essentially a synonym for multitasking (though multitasking connotes sharing more resources than just the CPU, and is the more popular term).
Multiprocessing involves using multiple CPUs, either in the same (SMP) or different (MPP) host boxes, to run a program


این هم یه مقاله اندر تفاوت Multithreading وMultiprocessing

vcldeveloper
چهارشنبه 16 بهمن 1387, 16:39 عصر
راجع به multithreading چند تا مقاله پیدا کردم که توی اونها راجع به multithreading روی یه پروسسور صحبت شده بود ، ولی راجع به Multiprocessing صحبتی نشده بود
سیستم عامل زمان CPU را بین Threadهای در حال اجرا (نه برنامه های در حال اجرا) تقسیم میکنه. در سیستم های تک هسته ایی، هر Thread بعد از تمام شدن زمانی که بهش اختصاص داده شده، متوقف میشه، و Thread بعدی منتظر در لیست CPU را در اختیار میگیره. یعنی در هر لحظه فقط یک Thread در حال اجرا هست، و سایر Threadها منتظر هستند. ولی چون این کار با سرعت زیادی انجام میشه، کاربر تصور میکنه که برنامه ها بطور همزمان در حال اجرا هستند. در سیستم های چند هسته ایی، چون دو یا تعداد بیشتری هسته پردازشی وجود داره، هر هسته CPU صفی از Thread های منتظر برای اجرا داره، و در هر لحظه، بع ازاء هر هسته، یک Thread در حال اجرا خواهد بود؛ یعنی مثلا در یک سیستم Dual Core در هر لحظه دو Thread در حال اجرا هستند.
وقتی شما برنامه خودتان را Multi-Threaded می کنید، در واقع پردازش های مورد نیاز برنامه را بین چند Thread پخش می کنید. در این شرایط، سیستم عامل می تواند متناسب با باری که هر هسته تحمل می کند، تصمیم بگیرد که هر Thread را روی کدام هسته اجرا کند. اما اگر برنامه بصورت Single Thread باشد، سیستم عامل با کل برنامه به عنوان یک واحد برخورد می کند، و Thread را همیشه روی یک هسته اجرا می کند.

وضعیت سیستم های Multi-processor در این زمینه مشابه سیستم های Multi-Core هست.

mossaferin
چهارشنبه 16 بهمن 1387, 20:26 عصر
یه سوال دیگه

آیا پیاده سازی multithreading روی سیستم های تک پروسسوره با چند پروسسوره متفاوت است ؟

http://barnamenevis.org/forum/showthread.php?t=53895

این مقاله با عنوان Win32 MultiThreading Performance می باشد که درجایی گفته شده



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


اگر یه مثال توی این ضمینه وجود داشته باشه ممنون می شم

shervin farzin
چهارشنبه 16 بهمن 1387, 20:33 عصر
سلام


وضعيت سيستم هاي Multi-processor در اين زمينه مشابه سيستم هاي Multi-Core هست.

سيستم عامل هيچ تضميني براي اجراء پيوسته Thread هاي يك پروسه نميده . بنابر اين ، اين
امكان هست كه دو يا چند Thread يك پروسه با يك ترتيب نامعلوم از يك هسته پردازنده سرويس
بگيرند . حالا سوال اينجاست به چه ترتيبي ميشه تضمين كرد كه دو Thread اول يك پروسه
همزمان از هر دو هسته پردازنده سرويس بگيرند ؟
زماني كه دفترچه راهنما مربوط به يك نسل خاص از پردازنده هاي Intel رو ميخوندم به اين نكته
اشاره كرده بود و اگر درست فهميده باشم يكي از چند تفاوت نسل Quad با Duo در همين امكان
Multi-Processing كه پردازنده هاي Quad ازش پشتيباني ميكنن ( البته اگر اشتباه نكنم ) .

ممنون از توجهتون .

vcldeveloper
چهارشنبه 16 بهمن 1387, 20:45 عصر
پیاده سازی multithreading توسط شما یا برنامه شما صورت نمیگیره، بلکه سیستم عامل این پیاده سازی را انجام میده، و به سیستم عامل مربوط هست که برای سیستم های تک هسته ایی یا چند هسته ایی یا چند پردازنده چه پیاده سازی هایی را استفاده کنه.

من اون مقاله را کامل نخوندم، ولی مطلبی که درباره پردازش های CPU-Bound گفته را من متوجه نشدم؛ چون اونجا گفته شده همچین پردازش هایی اگر به چند بخش تقسیم بشند، باز سرعت بیشتری در محاسبه بدست نمیاد! در حالی که در اینگونه پردازش ها، باید از الگوریتم های موازی مناسب استفاده کرد، و پردازش را به بخش های کوچکتر مستقل تقسیم کرد، تا سرعت پردازش بر روی سیستم های چند هسته ایی یا چند پردازنده افزایش پیدا بکنه. ممکن هست در اون مقاله فقط به نکاتی اشاره شده باشه که روی سیستم های تک هسته ایی صادق هستند، و دیگه اون نکات در سیستم های چند پردازنده وجود ندارند. مثلا در یک سیستم تک هسته ایی شما می تونید فرض بگیرید که همیشه فقط یک Thread در حال اجرا هست، ولی در سیستم های چند پردازنده، این پیش فرض غلط هست.

در هر حال، بهتر هست شما توضیح بدید که دقیقا می خواید چکار کنید.

بطور کلی، برای کار شما

mossaferin
چهارشنبه 16 بهمن 1387, 21:28 عصر
ممنون از توجهتون

خوب اینطوری شروع کنم که من یه کارت واسط a/d با سرعت 100ksps دارم و باید به طور پیوسته شروع به نمونه برداری کنم و هر یک ثانیه نتیجه را نمایش بدم

نمونه برداری هم به این صورت است که 25 بار در ثانیه ودر هر کدام (که میشه 40 میلی ثانیه) 4000 نمونه برداری صورت میگیره که پس از اعمال فیلتر بایستی نمایش داده شود در واقع با سرعت (kilo sample per second) ،100ksps نمونه برداری میشه

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

vcldeveloper
پنج شنبه 17 بهمن 1387, 00:54 صبح
خب، اون بخشی که با کارت سخت افزاری شما در ارتباط هست، میتونه در یک Thread جداگانه قرار بگیره، چون همیشه منتظر دریافت داده از I/O هست. اگر سرعت دریافت داده زیاده، یا احتمال میره که با افزایش بار سیستم، Thread فرصت نکنه همه داده ها را دریافت کنه، می تونید Priority اون Thread را بالا ببرید، تا سیستم عامل اولویتش را بالاتر در نظر بگیره. وقتی هم که داده را دریافت کرد، برای اینکه وقتش تلف نشه، باید آن را بصورت به Threadایی که مسئول پردازش یا فیلتر هست ارسال کنه. این Thread دوم میتونه Thread اصلی برنامه شما باشه، یا - اگر پردازش زیاد هست - یک Thread مستقل. نحوه انتقال داده هم مهم هست؛ Thread اول یا باید داده های ارسالی را بلافاصله با استفاده از Message به Thread دوم ارسال کنه، و Thread دوم هم یک Message Queue داشته باشه، که پیام های دریافتی در آن صف بشند، و یکی یکی پردازش بشند، یا اینکه یک صف بین دو Thread به اشتراک گذاشته بشه که Thread اول در آن داده وارد کند، و Thread دوم در فواصل زمانی معین صف را چک کند، و اگر داده ایی موجود بود، آنها را یکی یکی پردازش کند.

mossaferin
شنبه 19 بهمن 1387, 12:54 عصر
ممنون از شما

خب استراتژی کار مشخص شد ، حالا میمونه اجراش که باید بگم توی این ضمینه تجربه زیادی ندارم
پیشنهاد میکنید همین جا ادامه بدیم یا یه تاپیک جدید ؟

از کجا شروع کنیم تا دوستان دیگه هم از این تجربیات استفاده کنن؟

vcldeveloper
شنبه 19 بهمن 1387, 17:56 عصر
همین جا ادامه بدیم یا یه تاپیک جدید ؟
همین تاپیک مناسب هست، به شرطی که بحث هایی که مطرح می کنید حول همین موضوع باشد، نه اینکه تمام مشکلاتی که در انجام این پروژه با آنها روبرو می شوید را در یک تاپیک مطرح کنید.

موفق باشید

mossaferin
پنج شنبه 15 اسفند 1387, 18:41 عصر
این چند روز مشغول تحقیق بر روی روشهای پیاده سازی بودم ...

با مشکلی که روبرو شدم اینه ، نیاز دارم تادرون روال execut از ترد مورد نظر وقفه ایجاد بشه ، که وقتی توسط کد زیر اینکار و انجام می دم ، باعث مشغول شدن cpu میشه



procedure MYDelay(Dus:cardinal);
var
hrRes, hrT1, hrT2: Int64;
dif:extended;
begin
if QueryPerformanceFrequency(hrRes) then
begin
QueryPerformanceCounter(hrT1);
repeat
QueryPerformanceCounter(hrT2);
dif := (hrT2 - hrT1) * 1000000 / hrRes;
until dif > Dus;
end;
end;



به نظر شما چطور میشه وفقه ای ایجاد کرد که باعث مشغول شدن cpu نشه


با تشکر

vcldeveloper
پنج شنبه 15 اسفند 1387, 23:01 عصر
به نظر شما چطور میشه وفقه ای ایجاد کرد که باعث مشغول شدن cpu نشه
با استفاده از تابع Sleep.

MFiRE
شنبه 17 اسفند 1387, 01:36 صبح
if (Scan.Pause) then
begin
repeat
Sleep(2);
Application.ProcessMessages;
until Scan.Pause = False;
end;



به اين صورت بايد استفاده كرد.

vcldeveloper
شنبه 17 اسفند 1387, 05:39 صبح
به اين صورت بايد استفاده كرد.
Thread نیازی به Application.ProcessMessages نداره، غیر از اینکه یا Thread اصلی برنامه باشه، یا خودش یک Message Loop داشته باشه، که در اون صورت هم نیازی به Message Loop شی Application نداره.

فراخوانی Sleep به تنهایی کفایت میکنه، یا اینکه اگر Thread باید منتظر یک Thread دیگه باشه، از یکی از توابع Wait مربوط به Thread Synchronization مثل WaitForSingleObject می تونید استفاده کنید.

mossaferin
شنبه 17 اسفند 1387, 10:10 صبح
در مورد sleep حق با شماست ، ولی دلیل استفاده من از اون تابع نیاز به داشتن وقفه های زیر میلی ثانیه است.

میشه sleep رو برای وقفه های کمتر از میلی ثانیه (حدود 10 تا 200 میکرو ثانیه) شبیه سازی کرد؟

xxxxx_xxxxx
جمعه 21 فروردین 1388, 10:55 صبح
سلام


میشه sleep رو برای وقفه های کمتر از میلی ثانیه (حدود 10 تا 200 میکرو ثانیه) شبیه سازی کرد؟



I have used the following code across several Intel platforms and it seems to be very accurate, even though the ancient DOS programmers reference that I use (DOS Programmers Reference 2nd Edition) claims it to be accurate only to within 976 microseconds.

I use the function below to time step pulses in an open loop stepper system, and if it were truly that inaccurate I do not believe my code would work as accurately as it does.

A question for the code gurus out there: The reference I have in this regard is written for the 8086, and up to DOS ver. 4.0. Is it possible that overall improvements in system speed have made this call more accurate?:

At any rate, here it is:



// (1,000,000 Microseconds = 1 second)

void MicroDelay (long MicroSecs)
{
_asm {
mov cx, word ptr [MicroSecs+2]
mov dx, word ptr [MicroSecs]
mov ah, 0x86
int 0x15
}
}

// For delay in Milliseconds (1000 Milliseconds = 1 second)

void MilliDelay (long MilliSecs)
{
MicroDelay (MilliSecs * 1000);
}
من امتحانش نكردم.
منبع (http://www.programmersheaven.com/mb/CandCPP/277075/277078/re-pausing-execution-for-a-set-number-of-microseconds/)

Delphi Coder
دوشنبه 07 اردیبهشت 1388, 17:28 عصر
من هم مثل بعضی از دوستان فکر میکردم برنامه نمیتونه در انتخاب هسته پرسسور دخالت کنه و این کار فقط توسط OS مدیریت میشه ولی دو روز پیش یه API تو MSDN دیدم که منصفانه نیست اسمی از اون تو این تاپیک برده نشه.
SetThreadIdealProcessor
توضیح شو از http://msdn.microsoft.com/en-us/library/ms686253(VS.85).aspx (http://msdn.microsoft.com/en-us/library/ms686253%28VS.85%29.aspx) بخوانید. (http://msdn.microsoft.com/en-us/library/ms686253%28VS.85%29.aspx)