سلام بچه ها.همینطور که میدونید پردازنده های جدید دارای 2 یا 4 (Quad Code) هسته اند.بعضی از برنامه ها میان و کار رو بین 4 هسته پخش میکنند.مثل همین فوتوشاپ.یهنی مثلا اگر قرار است که همزمان 400 عدد با هم جمع زده شوند این کار بین 4 هسته پردازنده تقسیم میشه و هر هسته 100 عدد را جمه میزنه!در نتیجه حاصل سریع تر به دست میاد.میخواستم بدونم این تقسیم کار بین هسته های پردازنده چطور صورت میگیره؟
با تشکر!
می خواستم بگم منم نمی دونم

ولی فکر کنم ترید ها هستند که تقسیم می شن یه سری پروسه داریم که لیستشو می تونی ببینی یه مقداریشون با این هسته و بقیه با هسته دیگه انجام می شن نمی شه یه برنامه رو ۲ تا هسته اجرا کنن
معمولا انجام کارهای سنگین که نیاز به پردازش بالا داره (از روش multy threading) استفاده میشه و کار بین چند thread تقسیم میشه تو پردازندهای چند هستهای میتونین تنظیم کنین که کدام thread ها رو کدام هسته کار کنند
سلام.ممنون از جوابتون.خوب چطور ميشه كار thread ها رو در vb بين هسته ها تقسيم كرد؟
کتاب الگوریتم های موازی رو بخونید
همچیز رو متوجه میشید
یا در باره Parallell alghorithm سرچ کنید PDF
(۰۹-شهریور-۱۳۸۷, ۰۸:۴۷:۴۴)lord_viper نوشته است: [ -> ]معمولا انجام کارهای سنگین که نیاز به پردازش بالا داره (از روش multy threading) استفاده میشه و کار بین چند thread تقسیم میشه تو پردازندهای چند هستهای میتونین تنظیم کنین که کدام thread ها رو کدام هسته کار کنند
مگر وظیفه ی تقسیم کردن ترد ها روی هسته ها به عهده ی سیستم عامل نیست ؟ مثلا اگر یه هسته کاملا مشغول و یه هسته کاملا بیکار باشه بهتره که هر دو ترد در هسته ی بیکار اجرا بشن . و خوب این تصمیم گیری به عهده ی سیستم عامل خواهد بود .
مثلا الان همه ی برنامه های نرمال با هر چند ترد برای یک هسته نوشته شدن . حالا اگه این روی یه سی پی یو 2 هسته ای باشه فکر می کنین همه میرن روی یک هسته ؟ احتمالا این وظیفه رو خود سیستم عامل به عهده داره . یا حتی یک سطح پایین تر از اون .
این بحث نیاز به مقدمه داره ..... ایجاد کردن قابلیت پردازش موازی به دو حالت انجام میشه :
1- در سطح سیستم عامل یا همون Multi-Tasking هست که خودش به دو شکل انجام میشه .... یکی Multi-Processing و دومی هم Multi-Threading هست.
Multi-Processing : اینکه شما کار خودتون رو روی چند process تقسیم کنید بشکلی که هر Process قسمتی از کل کار محول شده رو انجام بده درحالیکه process ها با هم در ارتباط هستند و بین همدیگه اطلاعات رد و بدل میکنند . هر process میتونه شامل چندین thread کاری باشه .
به عنوان مثال در سیستم عامل ویندوز این امکان وجود نداره یعنی هر برنامه فقط یک process هست اما در سیتم عامل UNIX یک برنامه میتونه شامل چند Process باشه ( علتش رو توضیح میدم ... مربوط میشه به زیرساخت Kernel این سیستم عامل ها)
Multi-Threading : اکثر دوستان اینجا با Thread آشنا هستند. باید دقت کرد که از نظر ساختار سیستم عامل ها ما کلا دو مدل Thread داریم . یک مدل از Thread همین Thread هایی هستند که با API میتونیم بسازیمشون و بهشون کار محول کنیم . اینگونه Thread در سطح بالا قرار دارند و کنترل اونها در دست برنامه نویس هست . نوع دیگه از Thread ها Thread های سطح پایین هستند که در سطح Kernel معنی پیدا میکنند و فقط در کنترل سیستم عامل هستند. در واقع در سطح Kernel هر Thread سطح بالا میتونه شامل چندین Thread سطح پایین باشه !! سیستم عامل ویندوز به ازای هر Thread سطح بالا فقط یک Thread سطح پایین ایجاد میکنه پس در نتیجه به ظاهر فرقی بین Thread سطح بالا و سطح پایین نیست اگرچه در سیستم عامل لینوکس هر Thread سطح بالا میتونه به چندین Thread سطح پایین تبدیل بشه . این همون علتیه که باعث میشه ویندوز تک Process بشه و لینوکس میتونه چند process عمل کنه.
2- در سطح برنامه : همه میدونن برنامه های کامپیوتری از گذشته ترتیبی یا Sequential بودن یعنی دستورات برنامه خط به خط از بالا به پایین اجرا میشدن . با وجود اینکه امکان اجرای همزمان در سیستم عامل ها وجود داشت اما هنوز کافی و پر سرعت نبود. حالا سوالی پیش اومد که آیا میشه الگوریتم برنامه رو جوری تغییر داد که بتونیم همون برنامه ترتیبی رو به شکل چندین قسمت مجزا دربیاریم و بصورت موازی اجرا کنیم ؟؟ اینجا بود که برنامه نویس و ساخت برنامه های Parallel مطرح شد بشکلی که بیایم و در ماهیت برنامه ها موازی کنیم و با وجود امکان در سطح سیستم عامل سرعت پردازش رو چند برابر کنیم.مشکل در این زمینه زیاده .... تبدیل الگوریتم معمولی به موازی ساده نیست ، محدودیت داره و نیاز به دانش بالایی داره اما خب کتابخونه های معروفی مثل OpenMP هستند که اینکار رو برای برنامه نویس آسون تر کردند.همین OpenMP به شما کمک میکنه به راحتی Thread های کاری بسازید ، اجرای کد های خودتون رو به اونها محول کنید و همچنین بین اونها رابطه برقرار کنید.
حالا به سوالمون برمیگردیم که چطور تقسیم کار بین پردازنده ها / هسته های پردازنده انجام میشه ؟؟؟ این عمل توسط سیستم عامل انجام میشه .برای مثال ویندوز ها از گذشته و از زمان NT قابلیت استفاده از چندین CPU ( تک هسته یا چند هسته) رو داشتند . البته سازنده های مادربرد ها هم Driver های مخصوصی برای مادربرد هاشون ارائه میکنن که بتونه به سیستم عامل در بکار گیری بهینه سخت افزار کمک کنه.
شما فقط میتونین برنامه های Multi-Thread بنویسید و این سیستم عامل هست که تشخیص میده چطور و از کدوم هسته یا پروسسور استفاده کنه اما خب بعضی اوقات سیستم عامل قدرت کنترل محدودی رو هم به دست برنامه نویس میده . به عنوان مثال برای اینکه از سیستم عامل ویندوز بخوایید که هر Thread رو روی هسته یا پروسسور مجزا اجرا کنه (معمولا اینکار برای برنامه های Multi-Thread مثل اونهایی که با OpenMP نوشته میشن پیشنهاد شده) باید برای هر Thread که میسازید Affinity mask رو فعال کنید . اینکار از طریق تابع API با نام SetThreadAffinityMask انجام میشه.

سلام.من متن شما رو کامل خوندم و حالا یه سوالی برام پیش اومد و اون اینکه :
من خودم شاهد این بودم که بازی هایی که برای دو هسته بهینه شدند روی یک پردازنده دو هسته ای با فرکانس بالا مثلا 3 گیگاهرتز بهتر عمل کردند تا روی پردازنده با 4 هسته اما فرکانس کمتر مثلا 2.4 گیگاهرتز.پس نتیجه میگیریم که سیستم عامل ویندوز نمیتونه به حد کافی تقسیم کار رو انجام بده.اگر در زمینه اور کلاکینگ کمی اطلاعات داشته باشید حتما با نرم افزار اردوس Orthos که برای تست پایداری سخت افزار هست آشنایی دارید.وقتی این نرم افزار را ران میکنم از هسته های 1 و 3 در حد 100 درصد استفاده میکنه و هسته های 2 و 4 0 درصد میمونه.من یه احتمال میدم که سیستم عامل کار رو بین هسته ها تقسیم نمیکنه بلکه پروسس ها رو بین هسته ها تقسیم میکنه.مثلا اگر 4 تا نرم افزار رو ران کنیم کار نرم افزار اول به هسته اول و کار نرم افزار دوم به عهده هسته دوم و کار نرم افزار سوم به عهده هسته سوم و کار نرم افزار چهارم به عهده هسته چهارم قرار میگیره ولی اگر یک نرم افزار سنگین رو که برای چند هسته بهینه نشده رو اجرا کنیم سیستم عامل ویندوز نمیاد کار رو بین هسته ها پخش کنه و از یک هسته در حالت 100 درصد استفاده میشه.البته این نظر مبتدیانه من بود.
حالا بریم سر انجام این کار:
آیا انجام این کار در VB ممکنه؟ اگر امکانش هست بیشتر در مورد این تابع توضیح بدید.
با تشکر!
نقل قول: من خودم شاهد این بودم که بازی هایی که برای دو هسته بهینه شدند روی یک پردازنده دو هسته ای با فرکانس بالا مثلا 3 گیگاهرتز بهتر عمل کردند تا روی پردازنده با 4 هسته اما فرکانس کمتر مثلا 2.4 گیگاهرتز.پس نتیجه میگیریم که سیستم عامل ویندوز نمیتونه به حد کافی تقسیم کار رو انجام بده
فکر کنم دقیق متوجه منظور من نشدید !! برعکس تصور عامیانه ، وجود چند هسته یا چند CPU روی سیستم به معنی این نیست که سرعت اجرای
یک برنامه بالاتر میره . برنامه ای که Multi-Thread نباشه به هیچ وجه از چند هسته بودن / چند CPU بودن سیستم سودی نمیبره چون یک Thread داره و فقط روی یکی از هسته ها اجرا میشه.
نکته دوم اینکه سیستم عامل ویندوز برای اجرای Thread ها بهترین هسته یا CPU رو انتخاب میکنه اما این اجازه رو هم به برنامه نویس میده که این انتخاب رو خودش انجام بده.توابعی مثل SetThreadIdealProcessor یا SetThreadAffinityMask این امکان رو فراهم میکنند(البته اینکار معمولا توصیه نمیشه)
در کل بکارگیری یک هسته و همینطور بکارگیری هسته های زیاد نتیجه مطلوب نداره ، در اولی Thread ها به کندی اجرا میشن و در دومی مسله جابجایی و ارتباط بین Thread ها پیش میاد که کارایی رو میاره پایین، در واقع پدیده ای به نام Thread Migration وجود داره و معمولا زمانی پیش میاد که سیستم عامل بخواد یک Thread رو از هسته ای به هسته دیگه منتقل کنه.
نقل قول: من یه احتمال میدم که سیستم عامل کار رو بین هسته ها تقسیم نمیکنه بلکه پروسس ها رو بین هسته ها تقسیم میکنه
من منظور شما از کار رو نفهمیدم ! کار توی سیستم عامل همون process هست که مجموعه ایست شامل یک تا چند Thread.در واقع تقسیم Thread ها میشه همون تقسیم Process و برابر است با تقسیم کار.
نقل قول: مثلا اگر 4 تا نرم افزار رو ران کنیم کار نرم افزار اول به هسته اول و کار نرم افزار دوم به عهده هسته دوم و کار نرم افزار سوم به عهده هسته سوم و کار نرم افزار چهارم به عهده هسته چهارم قرار میگیره ولی اگر یک نرم افزار سنگین رو که برای چند هسته بهینه نشده رو اجرا کنیم سیستم عامل ویندوز نمیاد کار رو بین هسته ها پخش کنه و از یک هسته در حالت 100 درصد استفاده میشه.
در مثال اول ....اگر چهارتا برنامه رو همینطور اجرا کنی ( با فرض اینکه همهشون تک Thread باشند ) بستگی داره وقت کدوم هسته آزاد تر باشه . ممکنه هر چهارتا Thread رو به یک هسته بده تا اجرا کنه یا اینکه 3 تا رو بده به یکی چهارمی رو بده به یکی دیگه . الگوریتم های هوشمند scheduler سیستم عامل اینو تشخیص میدن.
در مثال دوم .... اگر برنامه سنگین شما تک Thread باشه میشه همونی که شما میگی ولی اگر Multi-Thread باشه بازهم سیستم عامل تشخیص میده کدوم Thread رو به کدوم هسته محول کنه.
نقل قول: آیا انجام این کار در VB ممکنه؟
متاسفانه محیط وی بی 6 برای نوشتن برنامه های Multi-Threaded ساخته نشده و از اون ساپورت نمیکنه البته راههای مختلفی وجود داره که باهاش میشه این امکان رو توی برنامه های وی بی بوجود آورد . مثلا با استفاده از ساخت ActiveX EXE یا شبیه سازی. اطلاعات بیشتر :
http://www.freevbcode.com/ShowCode.Asp?ID=1287
(۱۱-شهریور-۱۳۸۷, ۱۲:۴۳:۵۳)Mamad2003 نوشته است: [ -> ]نقل قول: من یه احتمال میدم که سیستم عامل کار رو بین هسته ها تقسیم نمیکنه بلکه پروسس ها رو بین هسته ها تقسیم میکنه
من منظور شما از کار رو نفهمیدم ! کار توی سیستم عامل همون process هست که مجموعه ایست شامل یک تا چند Thread.در واقع تقسیم Thread ها میشه همون تقسیم Process و برابر است با تقسیم کار.
سلام.منظورمو بهتر میگم: ویندوز نمیاد Thread های یک نرم افزار رو بین هسته ها پخش کنه بلکه میاد نرم افزار ها رو بین هسته ها پخش میکنه نه تردهاشو. مثلا نمیاد بار یک نرم افزار رو بین هسته ها پخش کنه!البته این نظر منه!
نقل قول: ویندوز نمیاد Thread های یک نرم افزار رو بین هسته ها پخش کنه بلکه میاد نرم افزار ها رو بین هسته ها پخش میکنه نه تردهاشو. مثلا نمیاد بار یک نرم افزار رو بین هسته ها پخش کنه
این تفکر شما اشتباه هست .به طور کل اون چیزی که مسئولیت اجرای کدهای داخل یک Process ( نرم افزار ، کار و .... ) رو داره Thread نام داره. فکر کنم باید این مسله ایجاد Process و Thread رو در یک برنامه توضیح بدم.
بطو ساده هر برنامه یا نرم افزار یک فایل اجرایی هست که توی اون اطلاعات و کدهای اجرایی برنامه قرار داده شده.
1-وقتی که شما یک برنامه رو اجرا میکنید Loader مربوط به سیستم عامل اونو توی حافظه قرار میده
2-سپس سیستم عامل یک Process برای اون میسازه . Process یک ساختمان داده هست و نه چیز دیگه ... که توی حافظه اصلی قرار میگیره و شامل قسمت های مختلف زیر هست :
1- شماره Process یا همون PID
2-حافظه مورد نیاز اون process
3-اطلاعات رجیسترهای CPU ، فلگ های امنیتی ، تعداد Thread ها و....
4-
تصویری از کد اجرایی برنامه
3-تا اینجا هنوز نه کدی اجرا شده نه برنامه ای نه از CPU استفاده شده !!! در ایجاست که سیستم عامل برای Process موجود اولین Thread رو میسازه که به Master Thread معروفه و تصویر کد اجرایی برنامه رو در اون قرار میده .سپس این Thread با در نظر گرفتن تقدم اون در صف scheduler سیستم عامل قرار میگیره تا فرصتی برای اجرا پیدا کنه . اینجاست که سیستم عامل یک هسته پروسسور رو که مناسب میدونه پیدا میکنه و کار اون Thread رو به هسته مورد نظر محول میکنه.اینجاست که تازه برنامه شما اجرا میشه !!!! پس نتیجه اینه که هر برنامه برای اجرا نیاز به حداقل یک Thread داره .
4-بعد از این برنامه ای که در حال اجراست از Master Thread درخواست میکنه که Thread دومی بسازه و کار خاصی رو ( مثلا اجرای یک تابع ) رو به Thread دوم بسپاره (حالا مرحله 3 تکرار میشه ) اینجاست که برنامه Multi-Thread میشه و حالا میتونه Thread دوم به بعد خودش رو به CPU یا به هسته های دیگه بسپاره !
نکات قابل توجه :
1- اون چیزی که اجرا میشه Thread هست پس هر برنامه برای اجرا نیاز به حداقل یک Thread داره.
2- Process ، کار ، نرم افزار و .... مفهوم اجرایی ندارند و فقط Thread هست که کد یک نرم افزار رو اجرا میکنه.
3 - وظیفه اختصاص دادن Thread به کدوم هسته یا پروسسور کار scheduler سیستم عامل هست ( اگرچه برنامه نویس میتونه اونو محدود یا مشخص کنه)
4 - کد ما فقط و فقط و اونم به شرطی میتونه از چند هسته بودن / چند CPU بودن سیستم بهره ببره که Multi-Thread باشه.