مقالات و اخبار تکنولوژی
OpenCL آشنایی با
در دنیای امروز، بسیاری از نرم افزارها برای اجرای سریع تر، دیگر فقط به پردازنده مرکزی (CPU) متکی نیستند و از قدرت پردازشی کارت گرافیک، پردازنده های تخصصی و سایر شتاب دهنده های سخت افزاری نیز استفاده می کنند. با این حال، یکی از چالش های اصلی این مسیر، تفاوت ابزارهای برنامه نویسی شرکت های سخت افزاری مختلف است؛ موضوعی که توسعه نرم افزارهای سازگار با انواع سخت افزار را دشوار می کند.
OpenCL برای پاسخ به همین نیاز شکل گرفت؛ یک استاندارد باز و چندسکویی که امکان استفاده از قدرت پردازشی انواع سخت افزارها را بدون وابستگی به یک برند خاص فراهم می کند.
در ادامه، OpenCL را به صورت تخصصی بررسی می کنیم و با نحوه عملکرد، مزایا، معایب و کاربردهای آن آشنا می شویم.
OpenCL چیست؟
اوپنسیال (OpenCL)، مخفف عبارت Open Computing Language، یک استاندارد باز، چندسکویی و بدون حق امتیاز برای برنامهنویسی موازی روی سکوهای ناهمگن (Heterogeneous Systems) است. یعنی سیستمهایی که ترکیبی از پردازندههای متفاوت مانند واحد پردازش مرکزی (CPU)، واحد پردازش گرافیکی (GPU)، پردازندهی سیگنال دیجیتال (DSP) و آرایههای دروازهی قابلبرنامهریزی (FPGA) را در خود دارند.
هدف اصلی OpenCL این است که برنامهنویسان بتوانند یک بار کد بنویسند و آن را، بدون وابستگی به برند یا معماری خاصی از سختافزار، روی طیف گستردهای از دستگاهها اجرا و شتابدهی کنند. این استاندارد شامل یک زبان برنامهنویسی مبتنی بر C (برای نوشتن توابعی به نام کرنل که مستقیماً روی دستگاههای شتابدهنده اجرا میشوند) و مجموعهای از رابطهای برنامهنویسی کاربردی (API) برای مدیریت سختافزار و حافظه است.
توسعه و نگهداری OpenCL توسط گروه غیرانتفاعی خرونوس (Khronos Group) انجام میشود؛ همان نهادی که مسئولیت استانداردهای شناختهشدهی دیگری مانند OpenGL و Vulkan را نیز بر عهده دارد.
تاریخچه OpenCL
ایدهی اولیه OpenCL توسط شرکت اپل مطرح و توسعه داده شد و در سال ۲۰۰۸ کار روی آن آغاز شد. نخستین نسخه رسمی این استاندارد، یعنی OpenCL 1.0، در ۲۸ اوت ۲۰۰۹ منتشر شد. از همان ابتدا، مدیریت و توسعه آینده این استاندارد به گروه غیرانتفاعی خرونوس واگذار شد؛ نهادی که پیشتر مسئولیت استانداردهایی مانند OpenGL را نیز بر عهده داشت.
در سالهای پس از انتشار نسخهی اولیه، این استاندارد بهتدریج تکامل یافت:
- OpenCL 1.1 (۲۰۱۰): با افزودن قابلیتهای جدید در زمینهی مدیریت حافظه و همگامسازی.
- OpenCL 1.2 (۲۰۱۱): یکی از مهمترین و پایدارترین نسخهها که هنوز هم بهعنوان پایهی اصلی بسیاری از پیادهسازیها مورد استفاده قرار میگیرد؛ این نسخه قابلیتهایی مانند تقسیمبندی دستگاه و پشتیبانی گستردهتر از تصاویر را اضافه کرد.
- OpenCL 2.0 و 2.1 (۲۰۱۳ تا ۲۰۱۵): با معرفی حافظهی مجازی مشترک و پشتیبانی از ++C برای نوشتن کرنلها.
- OpenCL 3.0 (سپتامبر ۲۰۲۰): یکی از تغییرات مهم در مسیر این استاندارد؛ در این نسخه، تمام قابلیتهای فراتر از نسخهی ۱.۲ اختیاری شدند تا فروشندگان مختلف سختافزار بتوانند بر اساس نیاز بازار هدف خود، پیادهسازی سبکتر و سادهتری ارائه دهند، بدون آنکه ملزم به پیادهسازی کامل مجموعهی پیچیدهی نسخهی ۲.x باشند.
این رویکرد انعطافپذیر باعث شد OpenCL 3.0 بهسرعت توسط شرکتهای بزرگی مانند انویدیا مورد پذیرش قرار گیرد و سازگاری کامل با آن اعلام شود.
قبل از OpenCL، برنامه نویس ها چه کار می کردند؟
قبل از معرفی OpenCL، استفاده از قدرت پردازشی کارت گرافیک برای انجام محاسبات عمومی کار ساده ای نبود. برنامه نویس ها در ابتدا باید مستقیماً با زبان اسمبلی شیدرها کار می کردند؛ روشی تخصصی که برای بیشتر توسعه دهندگان پیچیده و دشوار بود.
بعدها زبان هایی مثل Cg، HLSL و GLSL کار را ساده تر کردند، اما این زبان ها همچنان برای دنیای گرافیک طراحی شده بودند. در نتیجه، برنامه نویس باید محاسبات معمولی را به شکل عملیات گرافیکی بازنویسی می کرد.
از حدود سال ۲۰۰۴، ایده استفاده از پردازنده گرافیکی برای محاسبات عمومی یا GPGPU جدی تر شد و راهکارهایی مانند Brook و بعدتر CUDA انویدیا به وجود آمدند. با این حال، یک مشکل اساسی باقی مانده بود: هر شرکت راهکار و فناوری مخصوص خودش را داشت.
یعنی کدی که برای سخت افزار یک شرکت نوشته می شد، لزوماً روی سخت افزار شرکت دیگر اجرا نمی شد. OpenCL دقیقاً برای حل همین مشکل و ایجاد یک استاندارد مشترک و باز برای محاسبات ناهمگون به وجود آمد.
مزایای OpenCL
بزرگ ترین مزیت OpenCL این است که به یک برند یا نوع خاصی از سخت افزار وابسته نیست. برخلاف راهکارهای اختصاصی مانند CUDA، توسعه دهنده می تواند از یک استاندارد مشترک برای اجرای محاسبات روی سخت افزارهای مختلف استفاده کند. مهم ترین مزایای آن عبارت اند از:
- چندسکویی بودن: اجرای کد روی سخت افزارهای شرکت هایی مانند AMD، اینتل، انویدیا، کوالکام و اپل
- رایگان و بدون حق امتیاز: استفاده از استاندارد OpenCL هزینه ای برای توسعه دهنده ندارد.
- پشتیبانی از انواع پردازنده: امکان استفاده از GPU، CPU، DSP و FPGA
- کاهش وابستگی به یک شرکت: توسعه دهنده مجبور نیست نرم افزار خود را به سخت افزار یک برند خاص محدود کند.
- استاندارد باز: توسعه و مدیریت OpenCL توسط گروه Khronos و با مشارکت شرکت های مختلف صنعت انجام می شود.
- قابل استفاده در دستگاه های مختلف: از ابررایانه ها و سرورهای ابری گرفته تا کامپیوترهای شخصی، موبایل و سیستم های نهفته
- مناسب برای پردازش موازی: OpenCL می تواند برای مسائل مختلف داده محور و وظیفه محور مورد استفاده قرار گیرد.
معایب OpenCL
OpenCL با وجود انعطاف و پشتیبانی از سخت افزارهای مختلف، محدودیت هایی هم دارد. بخش مهمی از این مشکلات به چندسکویی بودن آن برمی گردد:
- عملکرد ضعیف تر در برخی سخت افزارها: به دلیل ماهیت عمومی OpenCL، در بعضی کاربردها بهینه سازی آن به اندازه راهکارهای اختصاصی مانند CUDA نیست.
- پیچیدگی بیشتر کدنویسی: مدیریت حافظه، دستگاه ها و اجرای کرنل ها در OpenCL می تواند نسبت به CUDA پیچیده تر باشد.
- ابزارهای توسعه محدودتر: اکوسیستم ابزارهای توسعه و بهینه سازی CUDA، مانند Nsight، cuDNN و TensorRT، بالغ تر و گسترده تر است.
- پشتیبانی ضعیف تر در هوش مصنوعی: بسیاری از چارچوب های یادگیری عمیق مانند PyTorch، TensorFlow و JAX تمرکز بیشتری روی CUDA دارند.
- وابستگی کمتر شرکت ها به OpenCL: برخی تولیدکنندگان، منابع توسعه خود را بیشتر روی فناوری های اختصاصی خود متمرکز کرده اند.
- تفاوت در پیاده سازی ها: قابلیت های اختیاری OpenCL، به ویژه از نسخه 3.0، ممکن است در همه سخت افزارها یکسان پشتیبانی نشوند و این موضوع می تواند سازگاری برنامه ها را دشوار کند.
سخن پایانی
OpenCL با ارائه یک استاندارد باز و چندسکویی، وابستگی به سخت افزار یک شرکت خاص را کاهش داده و امکان استفاده از پردازش موازی روی انواع پردازنده ها و شتاب دهنده ها را فراهم کرده است.
با وجود رقابت جدی با فناوری هایی مانند CUDA، به ویژه در حوزه هوش مصنوعی، انعطاف پذیری، رایگان بودن و سازگاری با سخت افزارهای متنوع همچنان OpenCL را به گزینه ای کاربردی برای بسیاری از پروژه ها تبدیل کرده است.