مهمترین کابرد امروزهی کارتهای گرافیک یا GPU و کودا موازی سازی پردازش های مربوط به هوش مصنوعی و یادگیری عمیق است.
ایدهای که پشت الگوی برنامهنویسی کودا قرار دارد این است که برنامه ها دارای ساختاری هستند که در آن بخشی از کد بر روی سی پی یو ماشین میزبان[1] اجرا میشده و توابع کوچک فراخوانی شده بهصورت نخهایی[2] بر روی جی پی یو اجرا شوند. کدی که توسط سی پی یو بر روی میزبان اجرا میشود به کد میزبان معروف است. کد میزبان هسته ها[3] را برای اجرا بر روی جی پی یو که در کودا دستگاه نامیده میشود برنامه ریزی میکند. یک هسته میتواند با استفاده از هزاران یا حتی میلیونها نخ سبک وزن[4] که بر روی دستگاه اجرا میشوند، راه اندازی شود. نخهای کودا به دلایل زیر سبک وزن نامیده میشوند:
یک نخ کودا تقریباً هیچ بالاسری[5] ندارد به این معنا که هزاران نخ میتوانند بهسرعت ایجاد شوند.
در سطح پایین مدیریت کردن[6] نخهای کودا توسط سخت افزار شتابدهی شده است. دلیل دیگر این کارایی به دلیل کنترل خودکار منابع در سطح سختافزار است. این ویژگی سبب میشود که برنامهنویس تشویق شود که بزرگ و آزادانه فکر کند و به هر تعداد که نیاز است نخها را تعریف کند. نخهای بیشتر میتواند کندی ایجادشده به دلیل واکشی[7] داده را از بین ببرد و عملکرد بهتری را حاصل کند.
دلیل دیگر سبکوزن بودن نخها این است که برنامهنویسی کنترل کمتری بر روی آنها و ترتیب اجرای آنها دارد. زمانبندی اجرای نخها و بلوکهای[8] نیز توسط سختافزار مدیریت میشود. در هر هسته کد یکسانی توسط هر نخ اجرا میشود.
جی پی یو شامل واحدهای چندپردازنده[9]است که هرکدام شامل تعدادی هستهی پردازشی میشوند که نخها را بهصورت موازی اجرا میکنند. برنامه های کودا بر روی جی-پی-یوهای مختلف بدون در نظر گرفتن تعداد چندپردازنده ها یا هسته ها قابلاجراست. نخها ازنظر مفهومی حاصل تقسیم بلوکها هستند. هر بلوک از یک هسته مشخص شامل تعداد برابری نخ است و تعداد کل بلوکها در یک مشبک[10] مرتبشده است. یک مشبک شامل تمامی بلوکها و درنتیجه نخهای داخل یک هسته است. کودا با استفاده از واحد محاسباتی ای که تار[11]نامیده میشود عملیات را انجام میدهد. یک تار شامل 32 نخ است که دارای دستورالعملهای اجرا به طور همزمان بر روی چندپردازنده هستند.
یک دستگاه کودا شامل یک جیپییو با سلسهمراتبی از پردازندهها است که با یکدیگر قابلیت پردازش ترکیبی را ارائه میکنند. پردازندهی سطح بالا چندپردازنده رشتهای[12] که شامل چندین پردازندهی رشتهای[13] است، نامیده میشود. پردازندههای رشتهای هستههای کودا نیز نامیده میشوند. هر پردازندهی رشتهای واحد حساب و منطق عدد صحیح[14] و واحد ممیز شناور[15]خود را دارد. همچنین هر چندپردازنده رشتهای دارای چند واحد تابع خاص[16] که شامل پشتیبانی سختافزاری برای محاسبه سینوس، کسینوس، جذر مرتبه دوم و عملگرها دیگر است.
[1] Host
[2] Thread
[3] Kernel
[4] Lightweight
[5] Overhead
[6] Handling
[7] Fetch
[8] Block
[9] Multiprocessors
[10] Grid
[11] Warp
[12] Streaming Multiprocessor (SM)
[13] Streaming Processors (SP)
[14] Integer Arithmetic Logic Unit (ALU)
[15] Floating Point Unit (FPU)
[16] Special Function Units (SFU)