آموزش: برنامه نویسی موازی با استفاده از OpenCL

sayyad84

متخصص زبان Assembly
کاربر ممتاز
با سلام،
در پاسخ به یکی از دوستان در مورد این مبحث تصمیم گرفتم که چیزهایی که تو این مدت در مورد OpenCL یاد گرفتم (و زیاد هم نیست) رو اینجا قرار بدم تا دوستان دیگه هم بتونن استفاده کنن. از اونجایی که بخش مناسبی برای تاپیک پیدا نکردم، همین جا در صفحه ی اصلی ایجادش می کنم، امیدوارم مدیر محترم تاپیک رو به جایی که خودشون صلاح می دونن انتقال بدن!
برای شروع کار با OpenCL باید بسته ی نرم افزاری مربوطه رو با توجه پلت فرمی که قراره رو ش کار کنید دانلود و نصب کنید. منظور از پلت فرم AMD یا Intel بودنه. دو ستانی که از AMD استفاده می کنن، برای دانلود بسته ی مربوطه به مسیر زیر برن و بسته 32 یا 64 بیتی بودن ویندوزشون، بسته ی مناسب رو دانلود کنن:بعد از نصب نرم افزار لازمه که تغییراتی در رجیستری ایجاد کنید تا در زمان اجرای برنامه ها روی GPU مشکلی پیش نیاد. برای این کار بسته ی OpenCLTemplate رو از مسیر زیر دانلود کنید:و فایل OpenCL Template رو اجرا کنید. با فشردن دکمه ی Write recommended values to registry عملیات مربوطه انجام می شه.
قبل از ادامه باید زبانی که قصد دارید تا برنامه تون رو باهاش بنویسید، انتخاب کنید. فکر می کنم هر زبانی این قابلیت رو داره اما C و C# در اولویت هستن.
قبل از شروع برنامه نویسی لازمه که تنظیماتی رو در کامپایلرتون اعمال کنید. در اینجا به تنظیمات Visual Studio می پردازیم.
برای زبان C کارهای زیر رو انجام بدید:
در مسیر زیر:
Project Properties->c/c++->General-> Additional Include​
فولدر Include در محل نصب AMD APP که اغلب در Program files هستش رو آدرس بدید.
در مسیر زیر:
Preprocessor->Preprocessor-> definition​
مقدار ATI_OS_WIN رو اضافه کنید.
در مسیر:
Linker->General->Additional library​
فولدر LIB/X86 رو از محل نصب AMD APP ادرس بدید.
در مسیر زیر:
Input->Additional Dependencies​
مقدار OpenCL.lib رو اضافه کنید.
حالا همه چی سر جاشه، فقط باید header file مربوطه که همون “CL\cl.h” هست رو هم اضافه کنید.
اما برای C# کار ساده تره، و فقط نیاز به دو DLL دارید که در بسته ی OpenCL Template موجودند. البته این در صورتیه که بخواید از این کتابخانه ها استفاده کنید چون کتابخانه های دیگه ای هم برای این کار نوشته شده. پس دو کتابخانه ی Cloo.dll و OpenclTemplate.dll رو داخل پوشه ی برنامه کپی کنید و داخل Visual Studio و از مسیر Project/Add reference و تب Browse دو کتابخانه ی گفته شده رو اضافه کنید. برای سهولت برنامه نویسی می تونید دستور using OpenCLTemplate رو هم در بالای برنامه اضافه کنید.
برای نوشتن برنامه به زبان C لازمه که kernel رو بالای Main و به صورت یه رشته ی const تعریف کنید و هر خط برنامه داخل “ “ قرار بگیره و به \n ختم بشه.
اما در C# کافیه یه string تعریف کنید و کل کد Kernel رو داخل “ “ قرار بدید.
تنها دستور مهمی که در روال kernel باید مورد استفاده قرار بگیره، دستور مربوط به یافتن شماره ی واحد پردازشیه که با get_global_id(0) تعیین می شه. همون طور که می دونید واحدهای پردازشی در سه بعد و به صورت یه مکعب کنار هم قرار گرفتند و برای فهمیدن موقعیت واحد مورد نظر در بعدهای مختلف از دستور فوق استفاده می شه. صفر داخل پرانتز بعد x رو نشون می ده و برای ابعاد y و z هم از 1 و 2 استفاده می شه. سایر دستورات مثل یه زیربرنامه ی معمولیه اما باید به عدم تداخل کار پردازنده ها روی یه حافظه ی عمومی دقت ویژه ای داشته باشید.
 

sayyad84

متخصص زبان Assembly
کاربر ممتاز
روند کار در هر دو زبان تقریباً ثابته، یعنی باید دستورات ثابتی رو مورد استفاده قرار بدید که در ادامه بهشون می پردازیم:
در زبان C:
در 1 پلت فرم برنامه تعیین می شه.
در 2 نوع Device تعیین می گردد. مقدار CL_DEVICE_TYPE_GPU برای استفاده از GPU است.
در 3 Context تعریف می شه.
در 4 صف دستورات بر روی Context و device تعریف می شود.
OpenCL_Commands1.jpg
 
آخرین ویرایش:

sayyad84

متخصص زبان Assembly
کاربر ممتاز
در 5 برنامه با کامپایل رشته ای که در بالای برنامه در قالب رشته ی با کامپایل رشته ای که در بالای برنامه در قالب رشته ی کرنل تعریف کردید، در اینجا sort_kernel ایجاد می شه.
در 6 خود کرنل ایجاد میشه. اگه بیش از یه کرنل نیاز دارید باید همه رو در قالب یه رشته بیارید و در اینجا به تعداد کرنل هاتون از نوع Cl_kernel استفاده کنید و کرنل هاتون رو ایجاد کنید. نام کرنل در اینجا ParaSort یکی از ورودی های تابع هستش.
در 7 حافظه ای که قراره به صورت عمومی __global مورد استفاده قرار بگیره تعریف می شه که در اینجا src_sort_arr هستش و از روی آرایه ی unsorted_arr و به اندازه ی اون ایجاد می شه. فلگ های مورد استفاده در دستور CLCreateBuffer برای همین کاره. CL_MEM_READ_WRITE یعنی این حافظه قابلیت خوندن و نوشتن داره و CL_MEM_COPY_HOST_PTR یعنی این حافظه از روی حافظه ای که روی هاست قرار داره و بعداً مشخص شده که unsorted_arr هستش، کپی می شه.
در 8 تعداد پردازنده ها تعیین می شه که ممکنه مقداری ثابت باشه یا از رابطه ی خاصی بدست بیاد.
در 9 آرگومان های کرنل بهش داده می شه. عدد 0 نشان دهنده ی شماره ی آرگومانه و برای آرگومان بعدی یکی بهش اضافه می شه. برای هر آرگومان باید اندازه و آدرس اون رو در این دستور بیارید.
OpenCL_Commands2.jpg
 

sayyad84

متخصص زبان Assembly
کاربر ممتاز
در 10 مواد لازم (!) برای اجرای کرنل بهش داده می شه که مهم ترینش تعداد پردازنده هاست.
در 11 خروجی برنامه که در حافظه ی src_sort_arr بود به هاست و در sorted_arr برمی گرده. تعداد خانه ها و اندازه ی عمومی هم جزو آرگومان هاست.
در 12 کار تموم شده و برنامه به پایان می رسه.
OpenCL_Commands3.jpg
 

azadeh_vafa

عضو جدید
salam mer30 az matalebi ke neveshtid
ye manba ke opencl ro sadeh tozih dade bashe soragh nadarid?
zaban asli ham bashe eshkal nadare
khod site AMD dare vali sakht gofte
rasti lap topam dell
kart graphic ATI 5650 Intel
toye site gofte support mishe vali hanooz nasb nakardam
benazaretoon mishe?
mer30
 

sayyad84

متخصص زبان Assembly
کاربر ممتاز
معرفی کتاب، آموزش OpenCL

معرفی کتاب، آموزش OpenCL

salam mer30 az matalebi ke neveshtid
ye manba ke opencl ro sadeh tozih dade bashe soragh nadarid?
zaban asli ham bashe eshkal nadare
khod site AMD dare vali sakht gofte
rasti lap topam dell
kart graphic ATI 5650 Intel
toye site gofte support mishe vali hanooz nasb nakardam
benazaretoon mishe?
mer30
با سلام،
چیزایی که نوشتم برای شروع کار خوبه و بهتره که اول کمی باهاش آشنا بشید بعد برید سراغ کتاب تا درک مطلب هم براتون ساده بشه! اما کتاب:از جمله بهترین کتاب ها در این زمینه است.
 

rahim171

عضو جدید
in ,abahs k khili kame ???kasi etelaate bishtar dar morede open cl nadareeee???tozihe ie barnamash....
 

azadeh_vafa

عضو جدید
salam
bebakhshid age emkanesh hast ye mesal ke ejra beshe mesle jam 2 array ra bezarid
dar rah khoida
baraye projam motaje opencl am
 

Similar threads

بالا