Vx: زبانی که حافظهی GPU رو توی تایپ میذاره
خلاصهٔ کاملتر
Vx یه زبان برنامهنویسی سیستمی برای heterogeneous computing هست (یعنی برنامهای که همزمان روی CPU و GPU و NPU و شتابدهندههای دیگه اجرا میشه). حرف اصلی سازندههاش اینه که جای داده باید توی تایپ معلوم باشه، نه اینکه یه runtime بزرگ و مبهم پشت صحنه تصمیم بگیره. مثلاً یه tensor که توی حافظهی HBM یه NPU هست، تایپش با tensorی که توی DRAM خود CPU هست فرق داره. اگه یه thread روی CPU بخواد pointer دستگاه رو بخونه، خطای کامپایل میگیری نه segfault ساعت سه صبح.
برای جابهجایی داده بین این حافظهها باید صریحاً transfer() بنویسی، حتی وقتی سختافزار هزینهای براش نداره. روی حافظهی یکپارچهی Apple این transfer تقریباً به هیچی کامپایل میشه ولی باز هم نوشته میشه. به گفتهی سازندهها دلیلش اینه که محل داده باید با خوندن کد معلوم بشه، نه با profile گرفتن از برنامه.
کامپایلر چند دسته باگ رو قبل از اجرا میگیره: دسترسی به حافظهی اشتباه، capacity admission (یعنی بررسی اینکه داده واقعاً توی اون حافظه جا میشه یا نه)، خوندن بافری که transfer ناهمگامش هنوز تموم نشده (که با یه SMT prover بررسی میشه)، استفاده بعد از move با linear types و borrow checker، transfer بین دو حافظهای که مسیری بینشون تعریف نشده، و autodiff روی جایی که مشتقش تعریف نشده.
کامپایلر cost model ثابت نداره و بهجاش یه machine file میخونه که سلسلهمراتب حافظه و اتصالهای یه سختافزار واقعی رو توصیف میکنه. واحدها عدد صحیح دقیقن، پس GB یعنی ۱۰ به توان ۹ و GiB یعنی ۲ به توان ۳۰. ریپو برای H100، H200، B200، A100، MI300X، Apple M4 و نودهای چند GPUیی machine file داره. یه تیکه از نمونهی خود سایت:
Memory HBM { capacity: 80 GiB, bandwidth: 3.35 TB/s,
managed: explicit, scope: device }
Memory L2 { within: Memory::HBM, capacity: 50 MiB,
bandwidth: 12 TB/s, managed: cached }frontend کامپایلر دادهمحوره: هر symbol و تایپ یه شناسهی تخت ۲۵۶ بیتی هست و کامپایل بهصورت موازی و بدون قفل انجام میشه. سازندهها توی تستها چک میکنن که MLIR خروجی چه موازی چه تکنخی دقیقاً یکی باشه. backendها شامل CPU (x86-64 و arm64) از طریق LLVM، GPU انویدیا از طریق NVVM و PTX، و Apple AMX/ANE از طریق CoreML هستن و سازندههای سختافزار میتونن با پلاگین MLIR بهش اضافه کنن.
سازندهها خودشون میگن Vx برای همهچی مناسب نیست. کاربر PyTorch وسط حلقه معماری مدل رو عوض میکنه، شکل tensor رو چاپ میکنه و بر اساسش تصمیم میگیره. توی Vx که ahead-of-time و ایستاست، این انعطاف کار زیادی میبره. به قول خودشون Vx برای چیزیه که باید روی ده جور سختافزار درست و سریع کار کنه، نه برای چیزی که هنوز داری کشفش میکنی.
نکات کلیدی:
- جای حافظه (CPU DRAM، NPU HBM و غیره) بخشی از تایپ دادهست و جابهجایی فقط با transfer() صریح انجام میشه
- کامپایلر جا نشدن داده توی حافظه رو با machine file سختافزار و قبل از ساخت باینری چک میکنه
- machine fileها برای H100، H200، B200، A100، MI300X و Apple M4 آمادهن
- backendها: CPU با LLVM، GPU انویدیا با PTX، و Apple AMX/ANE با CoreML
- فعلاً روی macOS با Apple Silicon و Linux x86_64 نصب میشه
- برای کارهای پویا و آزمایشی مثل روند معمول PyTorch مناسب نیست




