2 पॉइंट द्वारा GN⁺ 2024-04-27 | 1 टिप्पणियां | WhatsApp पर शेयर करें

tiny-gpu आर्किटेक्चर का अवलोकन

GPU

  • एक समय में एक kernel चलाने के लिए बनाया गया है
  • kernel चलाने के लिए निम्न काम करने होते हैं:
    1. global program memory में kernel code लोड करना
    2. data memory में आवश्यक data लोड करना
    3. device control register में चलाए जाने वाले threads की संख्या निर्दिष्ट करना
    4. start signal को HIGH पर सेट करके kernel चलाना
  • GPU निम्न units से मिलकर बना है:
    1. device control register
    2. dispatcher
    3. बदलती संख्या में computing cores
    4. data memory और program memory के लिए memory controller
    5. cache

मेमोरी

  • GPU को external global memory के साथ interface करने के लिए बनाया गया है
  • सरलता के लिए data memory और program memory को अलग रखा गया है
  • global memory में fixed read/write bandwidth है
  • memory controller computing cores से memory की ओर जाने वाले सभी outgoing requests को ट्रैक करता है, वास्तविक external memory bandwidth के अनुसार requests को नियंत्रित करता है, और external memory से उचित resources तक responses relay करता है
  • cache बार-बार मांगे जाने वाले data को स्टोर करके memory bandwidth के उपयोग को कम करता है

कोर

  • प्रत्येक core के पास computing resources होते हैं
  • इस सरल GPU में प्रत्येक core एक समय में एक block प्रोसेस करता है, और block के प्रत्येक thread के लिए dedicated ALU, LSU, PC और register file रखता है
  • scheduler thread execution को मैनेज करता है, और किसी block को पूरा करने से पहले नया block नहीं चुनता
  • fetcher वर्तमान program counter से instructions को asynchronous तरीके से fetch करता है
  • decoder fetched instructions को thread execution के लिए control signals में decode करता है
  • प्रत्येक thread के पास dedicated register file set होता है
  • ALU thread-विशिष्ट dedicated arithmetic logic unit है
  • LSU global data memory तक पहुंचने के लिए thread-विशिष्ट dedicated load-store unit है
  • PC प्रत्येक thread में अगला चलाया जाने वाला instruction तय करने वाला dedicated program counter है

ISA

  • सरल 11-instruction ISA इम्प्लीमेंट किया गया है
  • matrix addition और multiplication जैसे सरल kernels के लिए बनाया गया है
  • basic arithmetic operations, memory load/store, branching, constant load आदि को support करता है

निष्पादन

  • प्रत्येक core instruction चलाने के लिए fetch, decode, request, wait, execute, update चरणों से गुजरता है
  • प्रत्येक thread register file के data पर गणना करने के लिए execution path का पालन करता है
  • SIMD functionality के लिए read-only registers में block index, dimensions, और thread index values होती हैं

कर्नेल

  • matrix addition और multiplication kernels को ISA में लिखकर SIMD programming और GPU execution को प्रदर्शित किया गया है
  • test files की मदद से GPU पर kernel execution को पूरी तरह simulate किया जा सकता है और data memory state तथा execution trace तैयार की जा सकती है

सिमुलेशन

  • iverilog और cocotb इंस्टॉल करने के बाद make command से kernel simulation चलाया जा सकता है
  • log file में शुरुआती/अंतिम data memory state और kernel का पूरा execution trace आउटपुट होता है

उन्नत फीचर्स

  • performance और functionality को काफी बढ़ाने वाले modern GPU के कई अतिरिक्त features सरलता के लिए छोड़ दिए गए हैं
  • multi-level cache और shared memory, memory coalescing, pipelining, Warp scheduling, branch divergence, synchronization और barriers जैसी सुविधाओं पर चर्चा की गई है

GN⁺ की राय

  • यह GPU आर्किटेक्चर और SIMD programming model के मूल को सरल और समझने में आसान तरीके से अच्छी तरह समझाता है। खासकर matrix operation kernel उदाहरणों के जरिए यह अच्छी तरह दिखाता है कि वास्तविक GPU में parallel processing कैसे होती है।
  • modern GPU में इस्तेमाल होने वाले advanced features भी अच्छी तरह व्यवस्थित हैं, इसलिए tiny-gpu को समझने के बाद अधिक जटिल GPU आर्किटेक्चर का अध्ययन करने में मदद मिल सकती है।
  • हालांकि, वास्तविक graphics pipeline features इसमें शामिल नहीं हैं, इसलिए graphics-विशिष्ट hardware कैसे काम करता है यह इसमें नहीं बताया गया है। graphics में रुचि रखने वालों को यह कमी महसूस हो सकती है।
  • open source के रूप में जारी अन्य GPU आर्किटेक्चर जैसे MIAOW या GPGPU-Sim से इसकी तुलना करने पर अधिक यथार्थवादी GPU को समझने में मदद मिल सकती है।
  • आगे चलकर यदि branch divergence, memory coalescing, pipelining जैसी सुविधाएं जोड़ी जाती हैं, तो यह और भी उपयोगी learning material बन सकता है। यह एक open source project भी है जिसमें development में योगदान दिया जा सकता है, जो इसे और आकर्षक बनाता है।

1 टिप्पणियां

 
GN⁺ 2024-04-27
Hacker News की राय
  • Intel ने GPU के बारे में बहुत सारे technical documents सार्वजनिक किए हैं। 810/815 manuals भी ऑनलाइन मिल सकते हैं। 855/910/915/945 को छोड़कर documentation काफ़ी consistency के साथ की गई है.

  • open core GPU पर काम को प्रोत्साहन.

  • NyuziProcessor नाम का एक और open source GPU project है। (https://github.com/jbush001/NyuziProcessor)

  • मैं FPGA में शुरुआत करना चाहता हूँ, लेकिन कहाँ से शुरू करूँ यह समझना मुश्किल है और यह क्षेत्र अपने आप में थोड़ा intimidating लगता है।

  • अंतिम लक्ष्य LLM(Large Language Model) के लिए एक accelerator card बनाना है। memory offloading वाले हिस्से को छोड़कर, इसमें इस project से काफ़ी समानताएँ होंगी.

  • sequential always block में non-blocking और blocking assignment operators को मिलाने की वजह पूछी गई.

  • पहले VHDL में ऐसा ही कुछ काम किया था। opencores नाम की एक site पर तरह-तरह के open source HDL projects थे। जिज्ञासा है कि क्या आजकल HPC स्तर के बड़े distributed HDL simulators मौजूद हैं। modern GPU का उपयोग करके RTL स्तर की simulation करना उचित लगता है.

  • hardware projects का open होना अच्छा लगता है। लेकिन इसे SIMD coprocessor कहा जा सकता है। GPU कहलाने के लिए कम से कम किसी तरह का display output होना चाहिए। हाल में Nvidia वगैरह ने graphics architecture के server-only variants को भी GPU के रूप में बेचना शुरू किया है, इसलिए terminology कुछ ढीली हुई है, लेकिन GPU design का "graphics" हिस्सा अब भी complexity का बड़ा हिस्सा है.

  • यह सवाल है कि क्या ALU का hardware स्तर पर DIV instruction को सीधे implement करना सामान्य बात है। यह जानने की जिज्ञासा है कि modern CUDA cores जैसी जगहों में यह सचमुच instruction के रूप में इस्तेमाल होता है या आम तौर पर software emulation होती है। असली hardware divide circuit काफ़ी जगह लेता है, इसलिए GPU ALU में इसकी उम्मीद नहीं थी। Verilog में DIV: begin alu_out_reg <= rs / rt; end लिखना आसान है, लेकिन silicon में यह बहुत जगह घेरता है। मगर जो लोग सिर्फ Verilog simulate करते हैं, वे शायद यह न समझें.

  • graphics functionality न देने वाला एक और "GPU"। राय है कि इन्हें किसी और नाम से बुलाया जाना चाहिए.

  • यह सरल मान लिया गया है कि threads parallel में process होते हैं और हर instruction के बाद सभी threads एक ही program counter पर "converge" करते हैं। असली GPU में individual threads अलग PC पर branch कर सकते हैं, जिससे branch divergence होती है। silicon में GPU बनाने से पहले GPU programming करके देखना अच्छा रहेगा। यह SIMD भी नहीं है। (उसी व्यक्ति जैसा, जिसने LED blink करने वाला circuit जोड़कर दावा किया था कि उसने CPU बना लिया)