GPU Memory آموزش و یادگیری GPU Memory به صورت رایگان
توی ترد قبلی دیدیم که GPU برای رندر کردن یک صحنه، باید به داده های مختلف دسترسی داشته باشه.
مثل ورتکس ها، تکستچر ها، بافر ها و کلی اطلاعات دیگه.
اما یه سؤال مهم:
این داده ها کجا نگهداری میشن؟
و مهمتر از اون:
چطوری این دادهها از CPU به GPU میرسن؟
اینجاست که با مفهوم GPU Memory آشنا میشیم.
VRAM چیه؟
احتمالاً تا حالا اسم VRAM به گوشتون خورده.
VRAM مخفف Video Random Access Memory هست و به حافظهای گفته میشه که برای استفادهی GPU در کارتهای گرافیک اختصاص داده شده.
مثلاً وقتی میگیم:
«این کارت گرافیک 8GB VRAM داره.»
یعنی 8 گیگابایت حافظه برای نگهداری دادههایی که GPU بهشون نیاز داره در اختیارشه.
مثلاً میتونیم دادههایی مثل:
- Textureها
- Vertexها
- Indexها
- Framebufferها
- و دادههای مختلف مورد نیاز Rendering
رو در این حافظه نگهداری کنیم.
اما یک نکته ریز و مهم وجود داره:
VRAM تنها حافظه ای نیست که وقتی دربارهی حافظهی GPU صحبت میکنیم باید در نظرش بگیریم.
GPU Memory یعنی فقط VRAM؟
نه.
وقتی میگیم GPU Memory، داریم دربارهی مفهوم گستردهتری صحبت میکنیم.
GPU میتونه به انواع مختلفی از حافظه و فضای ذخیرهسازی داده دسترسی داشته باشه و معماری این حافظهها هم به نوع GPU و سیستم بستگی داره.
مثلاً در یک سیستم با کارت گرافیک مجزا، معمولاً GPU حافظهی اختصاصی خودش رو داره.
اما در سیستمهایی با GPU مجتمع (Integrated GPU)، ممکنه GPU از حافظهی اصلی سیستم یعنی RAM استفاده کنه.
پس بهتره از همین اول، این دو مفهوم رو یکی در نظر نگیریم:
VRAM یک نوع حافظهی مورد استفادهی GPU است، اما GPU Memory مفهوم گستردهتری است.
جزئیات بیشتر دربارهی انواع حافظه و معماری Memory رو فعلاً کنار میذاریم؛ برای این دوره همین مدل ذهنی کافیه.
CPU و GPU چطور دادهها رو با هم به اشتراک میذارن؟
حالا فرض کنید مدل سهبعدی ما روی CPU قرار داره.
GPU که نمیتونه خودش حدس بزنه این مدل کجاست!
پس باید دادهها رو در اختیار GPU قرار بدیم.
بهصورت ساده میتونیم این اتفاق رو اینطور تصور کنیم:
CPU Memory → GPU Memory
مثلاً:
CPU —-(Vertex Data, Texture Data, … ) —> GPU Memory —–> GPU
البته نحوهی انجام این انتقال به نوع سیستم، API و نوع حافظه بستگی داره.
ولی مفهوم اصلی همینه:
GPU باید به دادهای که قراره پردازش کنه دسترسی داشته باشه.
Data Transfer — انتقال داده چرا مهمه؟
شاید در نگاه اول فکر کنیم:
«خب داده رو میفرستیم GPU، تموم شد!»
اما انتقال داده بین CPU و GPU همیشه رایگان نیست.
این انتقال میتونه زمان و پهنای باند مصرف کنه.
به همین دلیل در Graphics Programming معمولاً تلاش میکنیم دادههایی که GPU قراره بارها ازشون استفاده کنه رو تا جای ممکن در محلی نگه داریم که دسترسی بهشون برای GPU مناسب باشه.
مثلاً اگر یک Texture رو برای هزاران فریم استفاده میکنیم، منطقی نیست که برای هر فریم دوباره اون رو از CPU به GPU منتقل کنیم.
پس یکی از مفاهیم مهم در Graphics Programming اینه:
انتقال داده بین CPU و GPU هزینه داره و باید آگاهانه مدیریت بشه.
دادهها رو چطور داخل GPU نگه میداریم؟
تا اینجا گفتیم GPU به داده نیاز داره و این دادهها باید در حافظهای قرار بگیرن که GPU بتونه بهشون دسترسی داشته باشه.
اما برنامهنویس چطوری این دادهها رو مدیریت میکنه؟
اینجا دو مفهوم خیلی مهم وارد میشن:
Buffer و Texture
Buffer چیه؟
Buffer بهصورت ساده یک فضای حافظه برای نگهداری داده است.
مثلاً میتونیم دادههای مربوط به Vertexها رو داخل یک Buffer قرار بدیم.
یا Indexهای یک Mesh رو ذخیره کنیم.
در OpenGL با چیزهایی مثل Vertex Buffer Object (VBO) با این مفهوم کار خواهیم کرد.
فعلاً لازم نیست وارد جزئیات API بشیم.
فقط این رو بدونیم:
Buffer یکی از روشهای اصلی نگهداری و انتقال داده برای استفادهی GPU است.
Texture چیه؟
Texture هم نوع دیگری از داده است که GPU در Rendering ازش استفاده میکنه.
مثلاً یک تصویر میتونه به عنوان Texture در اختیار GPU قرار بگیره.
بعداً GPU میتونه هنگام Rendering از اطلاعات اون، برای مشخص کردن رنگ یا ویژگیهای مختلف سطح استفاده کنه.
Texture فقط یک «عکس» نیست و میتونه انواع مختلفی از دادهها رو در خودش نگه داره.
اما فعلاً برای ما همین کافیه که بدونیم:
Texture یکی از مهمترین انواع دادهایه که GPU در Graphics Processing باهاش کار میکنه.
حالا یک تصویر کلی داریم:
CPU دادهها رو تولید یا نگهداری میکنه –> دادهها در اختیار GPU قرار میگیرن –> GPU از دادهها برای انجام محاسبات و Rendering استفاده میکنه.
و اینجا یک سؤال جالب به وجود میاد:
ما به عنوان برنامهنویس، چطوری این دستورها و دادهها رو به GPU میفرستیم؟
اصلاً برنامهی ما چطور با GPU صحبت میکنه؟
برای جواب این سؤال، توی تِرِد بعدی میریم سراغ:
چطوری با GPU صحبت کنیم؟
جسی ساما: اگه با دوره تا الان حال کردی ریکشن و کامنت بزار✨ سوالی ام داشتی بپرس حتما، جواب میدم 3: