در زبان سی برای تخصیص حافظه پویا یعنی در زمان اجرا از تابع malloc استفاده می شود پس از خروج از یک تابع لازم است حافظه ای را که با استفاده از تابع malloc تخصیص داده اید را با استفاده از تابع free به سیستم باز گردانید،متغیرهایی که در یک تابع تعریف می شود در هنگام خروج از یک تابع به سیستم بازگردانده می شودولی حافظه ای را که با استفاده از تابع malloc تخصیص می دهیم در انتها آزاد نمی شود،بوسیله تابع free حافظه تخصیص داده شده با malloc را آزاد می نماییم.اگر حافظه آزاد نشود سبب نشتی حافظه (memory leak)می شود.
الگوی تابع:
Void * malloc(size_t size)
در صورت موفقیت اشاره گری به ابتدای بلوکی از حافظه تخصیص می یابد ، نوع خروجی از جنس void* است که میبایستی بر اساس نوع مورد نظر casting صورت پذیرد.در غیر اینصورت خطای compile گزارش داده می شود که در صورت عدم موفقیت صفر و یا null را باز می گرداند.
در زبان سی پلاس پلاس برای تخصیص حافظه پویا (در زمان اجرا) از تابع new استفاده می شود.پس از خروج از یک تابع لازم است حافظه ای را که تخصیص داده اید به سیستم بازگردانید.متغیرهایی که در یک تابع تعریف می شود در هنگام خروج از تابع به سیستم بازگردانده می شود ولی حافظه ای را که با استفاده از تخصیص حافظه پویا در نظر گرفته می شود در انتها آزاد نمی شود.
بوسیله تابع delete حافظه تخصیص داده شده را آزاد می نماییم اگر حافظه آزاد نشود نشتی حافظه و یا memory leak اتفاق خواهد افتاد.
اشاره گر= new < <نوع
delete اشاره گر
int*pn=new int;
delete pn;
اشاره گر= new <نوع>[طول آرایه]
delete [ ] اشاره گر
int*p=new int[20];
delete [ ] p;
Stack Memory یک رنج مشخص شده از حافظه است که از طریق رجیستر کردن در cpu قابل دسترسی است ،پشته در زبان اسمبلی بعنوان راهی برای پیاده سازی پرش به کد زیر مجموعه و برگشت استفاده می شد و در جای دیگر برای رسیدگی به وقفه های سخت افزاری
برای مثال در طول یک وقفه استک برای ذخیره سازی چند نوع رجیستر سی پی یو استفاده می شد، شامل status (که هر کدام نتیجه عملگر را نشان می داد)و شمارنده برنامه(هنگام رخداد وقفه)،حافظه استک در طراحی سی پی یو معمولا بسیار بزرگ است و سرعت Alloc و DeAlloc آنها خیلی بالاست چون موکدا از طراحی LIFO استفاده می کنند که یک مثال ساده از ان عملگر های move و inc و dec است
Heap Memory یک حافظه بسیار ساده است که پس از اینکه برنامه بارگذاری و حافظه پشته اختصاص داده شد هنوز باقی مانده و احتمالا هنوز متغیر های عمومی داخل آن باشد
در C++ حافظه پشته جایی است که متغیرهای محلی ذخیره و یا ساخته می شوند و همچنین جایی است که پارامترهای ارسال شده به توابع را نگه می دارد و در کلاس std::stack است که پارامترها را در ان ریخته و تابعی را صدا می زند و تابع می داند که پارامتر مد نظر در انتهای پشته می تواند پیدا شود و همچنین تابع می تواند متغیرهای محلی را در پشته بریزد و قبل از برگشت از تابع انها را خارج نماید.
یکی از دلایلی که ما از پردازش موازی روی GPU استفاده می کنیم زمان اجرای کم پردازش در آن نسبت به CPU است پس این تناسب زمان برای ما حائز اهمیت است ، پس بنابراین از دستورات زیر به منظور محاسبه زمان اجرای برنامه در دو روش معمولی و موازی استفاده می کنیم و سپس به مقایسه انها می پردازیم ، که در پستهای بعدی با دیدن مثالهای کاربردی تفاوت زمان اجرای روشهای معمولی و موازی به طور چشم گیر قابل رویت است.
در ابتدای اجرای دستورات کلاک CPU را فعال نموده و زمان لحظه ای را در متغیری نگه می داریم ، سپس در پایان دستورات برنامه دوباره کلاک را زده و زمان شروع را از آن کم کرده و مدت زمان اجرای برنامه را بدست می آوریم.
Void RunProgress(void)
}
;Using namespace std::chrono
;()Auto starttime=steady_clock::now
;double x=0
}For(double i=0;i<20000;i++)
;X+=i
}
;()Auto durationtime=std::chrono::duration_cast<std::chrono::microsecond>(steady_clock::now() – StartTime
;std::cout << "sum: " << DurationTime.count() << " NanoS \n”
}
;()Int main
}
for (int i = 0; i < 30; i++)
}
;() RunProgres
{
;()Getchar
که توابع زمان در کتابخانه chrono می باشد.و در اینجا چون از جنس microsecond تعریف کردیم میکرو ثانیه را برمی گرداند و می توان از گزینه های millisecond و یا nanosecond هم استفاده نمود.
به عنوان یک تجربه ای ارزنده که در مسیر یادگیری کودا بدست آوردم برخود لازم دانستم تا آن را با شما به اشتراک بگذارم در ابتدای نصب و کار با پلتفرم کودا برای این که با مشکلی موجه نشوید حتما سخت افزار کارت گرافیکتان را در سایت NVIDIA بررسی نمایید که آیا پلتفرم CUDA را پشتیبانی می کند یا خیر؟چون کارت گرافیک نصب شده روی سیستم من NVIDIA GEFORCE 210 بود و اطمینان خاطر داشتم که کودا را پشتیبانی می کند ،حتی در حین نصب کودا هم یک خطای سطحی داد و کار نصب را تکمیل نمود (شکل 1)
شکل1
اما در زمان اجرای کد (از همان کدهای sample کودا )با خطایی که در شکل 2 آمده مواجه شدم که این خطا مربوط به انتقال داده از CPU به GPU بود و نمی توانست کرنل کودا را اجرا نماید.
بعد از چند روز جستجوی وسیع در سایتهای مختلف متوجه این موضوع شدم که NVIDIA GEFORCE 210 از اولین سری کارتهای گرافیک NVIDIA بوده که کودا را پشتیبانی می کرده است و با نسخه های قدیمی سازگاری دارد ،سپس با بررسی لیست سخت افزار های کارت گرافیک از سایت NVIDIA و تعویض کارت گرافیک با GEFORCE GTX 1050 مشکل حل شد.شما می توانید با مراجعه به آدرس زیر سخت افزار کارت گرافیک خود را بررسی نمایید.
https://developer.nvidia.com/cuda-gpus
و لازم بذکر است بهترین محیط برای برنامه نویسی کودا Visual Studio 2013 با پلتفرم کودا 7.5 و یا 8 است.
و امّا ترتیب نصب ملزومات کودا :
1- نصب درایور کارت گرافیک
2- نصب ویژوال استودیو2013
3- نصب مازول ++C
4- نصب NSIGHT
5- نصب پلتفرم CUDA
شکل4:GEFORCE 210
که شما می توانید با مراجعه به لینک http://cuda-tabatabaei.blogsky.com/category/Programming بصورت دقیقتر مراحل را مشاهده نمایید.
در ابتدا بهتر است اطمینان حاصل کنید که کارت گرافیک کامپییوترتان مبتنی بر کودا ست به یکی از روش زیر می توانید اقدام کنید
1-کیلدهای ترکیبی win+R به منظور اجرای پنجره Run همزمان فشار دهید کلمه dxdiag را تایپ کنید پنجره Directx properties باز میشود . تب ِDisplay را اتنخاب کنید در این قسمت به شما مشخصات کارت گرافیک تان را نشان میدهد .
شکل 4
2- پنجره Control Panel را باز کنید ((Start - Control Panel برروی سیستم دو بار کلیک نمایید در پنجره properties برروی تب HaedWard سپس Device Manager کلیک کنید . لیستproperties Directx را باز کنید در نتیجه نام و مدل کارت گرافیکتان را خواهید یافت .
(شکل 5)
نیازمندی های سیستم در کودا
برروی استفاده از کودا بروی سیستم تان مورد زیر بایستی نصب شده باشد :
1-یک GPU مبتنی بر کودا
2-یک ورژن از ویندوز ساپورت شده (از Windows Seven به بعد )
3- یک ورژن از Visual Studio ساپورت شده از VS2010به بعد
4-ابزار nvidia cuda که در سایت cuda – downloads موجود می باشد .
می توانید برنامه cuda را با Proxy از سایت NVida.com ویا برخی از نسخه ها را از softgozer تهیه کنید که حجم ان با برنامه Nsight در حدود 1.02گیگابایت می باشد .جهت نصب با توجه به نسخه دانلود شده cuda برروی بستر OS دلخواه که در اینجا Version 8.0.4.4 برWindows 10 میباشد مراحل زیر را انجام می دهیم : لازم به ذکر است که قبل از نصب Cudaمی بایست برروی سیستم Visual Studio نصب شده باشد که برنامه Cuda به عنوان یکی از Feature ها روی ان بار گذاری شود . پس از دریافت از سایت softgozer فایل Cuda -8.0.4.4 Win10.exe را اجرا می نماییم که در ابتدا در مسیر جهت Extract برنامه CUDA سوال می کند.
شکل 6
پس ار ان شروع به Extract میکند
شکل 7
پس از اتمام شدن قسمت Extract بصورت AutoRun برنامه Setup Cuda اجرا می شود و شروع به چک کردن سیستم در رابطه با OS .وکارت گرافیک می کند البته دقت داشته باشید شاید بعضی مواقع Cuda بروی سیستم ناسازگار نصب شود اما هنگام اجرای برنامه به مشکل برخورد می نمایید .
شکل 8
وپس از چک کردن سیستم چنانچه به مشکل برخورد نکنید پنجره ذیل ظاهر می گردد
شکل 9
که با انتخاب گزینه Accept و زدن دو عدد next شروع به نصب Package cuda می کند
شکل 10
پس از اتمام نصب Cuda برنامه Visual Studio را اجرا نمایید و با انتخاب گزینه New Project سمت چپ منو nvidia و زیر منوی Runtime 8.0 Cuda ایجاد شده است که با انتخاب ان و تعیین نمودن نام پروژه و Solution Name گزینه ok را اجرا می نماییم
شکل 11
پس از انتخاب گزینه ok شروع به ساخت پروژه می نماید و یک Sample جمع دو برابر 5 عنصری را ایجاد می نماید که میتوان از ان جهت اموزش Cuda استفاده خیلی مفید نمود.
شکل 12
دستورات مهم مدیریت حافظه در CUDA