1 पॉइंट द्वारा GN⁺ 2024-05-18 | 1 टिप्पणियां | WhatsApp पर शेयर करें
  • Bend एक उच्च-स्तरीय प्रोग्रामिंग भाषा है जो बड़े पैमाने की parallel processing को सपोर्ट करती है
  • CUDA और Metal जैसे low-level विकल्पों के विपरीत, Bend Python और Haskell जैसी expressive languages जैसा अनुभव और सुविधाएँ देता है
  • इसमें तेज object allocation, complete closure support वाले higher-order functions, unrestricted recursion, और यहाँ तक कि continuations भी शामिल हैं
  • फिर भी यह GPU जैसे massively parallel hardware पर चलता है, और core की संख्या के अनुसार लगभग linear speedup दिखाता है
  • किसी explicit parallel annotation की बिल्कुल ज़रूरत नहीं: thread creation, locks, mutexes, atomic operations की आवश्यकता नहीं होती
  • Bend, HVM2 runtime द्वारा संचालित है

त्वरित डेमो

Bend का उपयोग

यह अभी Windows पर काम नहीं करता, विकल्प के रूप में WSL2 का उपयोग करना होगा।

  • सबसे पहले, आपको Rust nightly इंस्टॉल करना होगा।
  • फिर, HVM2 और Bend इंस्टॉल करने होंगे:
    cargo +nightly install hvm  
    cargo +nightly install bend-lang  
    
  • अंत में, आप एक Bend फ़ाइल लिख सकते हैं और उसे नीचे दिए गए किसी एक कमांड से चला सकते हैं:
    bend run   # Rust interpreter का उपयोग (sequential)  
    bend run-c  # C interpreter का उपयोग (parallel)  
    bend run-cu  # CUDA interpreter का उपयोग (massively parallel)  
    
  • अधिकतम performance के लिए आप gen-c और gen-cu का उपयोग करके Bend को standalone C/CUDA फ़ाइलों में compile भी कर सकते हैं। हालाँकि, code generation अभी शुरुआती चरण में है, और GCC या GHC जैसे cutting-edge compilers जितना परिपक्व नहीं है।

Bend में parallel programming

  • Bend में parallel program लिखने के लिए... आपको कुछ भी करने की ज़रूरत नहीं है। बस इसे स्वभावतः sequential न होने वाला लिखना चाहिए।
  • उदाहरण के लिए, नीचे दिया गया expression parallel में execute नहीं हो सकता:
    (((1 + 2) + 3) + 4)  
    
    क्योंकि +4, +3 पर निर्भर करता है, और +3, (1+2) पर निर्भर करता है।
  • लेकिन नीचे दिया गया expression parallel में execute हो सकता है:
    ((1 + 2) + (3 + 4))  
    
    क्योंकि (1+2) और (3+4) स्वतंत्र हैं। Bend के मूल सिद्धांत के अनुसार, जो कुछ भी parallel में चल सकता है, वह parallel में चलेगा

उदाहरण कोड

  • एक अधिक पूर्ण उदाहरण के रूप में, नीचे दिए गए कोड पर विचार करें:

    # sorting network = tree rotation  
    def sort(d, s, tree):  
      switch d:  
        case 0:  
          return tree  
        case _:  
          (x, y) = tree  
          lft = sort(d-1, 0, x)  
          rgt = sort(d-1, 1, y)  
          return rots(d, s, lft, rgt)  
    
    # subtree rotation  
    def rots(d, s, tree):  
      switch d:  
        case 0:  
          return tree  
        case _:  
          (x, y) = tree  
          return down(d, s, warp(d-1, s, x, y))  
    
  • यह फ़ाइल immutable tree rotation का उपयोग करके एक bitonic sorter implement करती है। यह ऐसा algorithm नहीं है जिससे GPU पर तेज चलने की उम्मीद की जाए। लेकिन यह divide-and-conquer approach का उपयोग करता है, इसलिए यह स्वभावतः parallel है। Bend इसे multiple threads में चलाता है। कुछ benchmark:

    • CPU, Apple M3 Max, 1 thread: 12.15 सेकंड
    • CPU, Apple M3 Max, 16 threads: 0.96 सेकंड
    • GPU, NVIDIA RTX 4090, 16k threads: 0.21 सेकंड
    • 57x speedup बिना कुछ किए हासिल किया गया। thread creation, locks, mutexes का कोई explicit management नहीं। बस Bend से कहा गया कि program को RTX पर चलाए।

विभिन्न parallel systems का समर्थन

  • Bend tensor या matrix जैसे किसी विशेष paradigm तक सीमित नहीं है। shaders से लेकर Erlang जैसे actor model तक, हर parallel system को Bend में emulate किया जा सकता है।

  • उदाहरण के लिए, real time में image render करने के लिए, हर frame के लिए एक immutable tree allocate किया जा सकता है:

    # shader दिए जाने पर, एक square image लौटाता है  
    def render(depth, shader):  
      bend d = 0, i = 0:  
        when d < depth:  
          color = (fork(d+1, i*2+0), fork(d+1, i*2+1))  
        else:  
          width = depth / 2  
          color = shader(i % width, i / width)  
      return color  
    
    # position दिए जाने पर, color लौटाता है  
    # इस demo में, यह सिर्फ busy loop चलाता है  
    def demo_shader(x, y):  
      bend i = 0:  
        when i < 5000:  
          color = fork(i + 1)  
        else:  
          color = 0x000001  
      return color  
    
    # demo_shader का उपयोग करके 256x256 image render करें  
    def main:  
      return render(16, demo_shader)  
    
  • यह वास्तव में काम करता है। जटिल algorithms भी Bend में अच्छी तरह parallelize होते हैं। long-range communication global beta reduction (interaction combinators के अनुसार) से किया जाता है, और HVM2 के atomic linker द्वारा सही और कुशल रूप से synchronize किया जाता है।

अतिरिक्त सामग्री

  • तुरंत शुरू करने के लिए, Bend की GUIDE.md देखें।
  • features की सूची देखने के लिए, FEATURES.md देखें।
  • Bend की तकनीक को समझने के लिए, HVM2 का paper देखें।
  • Bend का विकास HigherOrderCO.com में किया गया है - Discord से जुड़ें।

GN⁺ की राय

  • parallel programming का सरलीकरण: Bend parallel programming को बहुत सरल बनाता है, जिससे शुरुआती software engineers भी इसे आसानी से अपना सकते हैं। इससे parallel programming में प्रवेश की बाधा काफी कम हो जाती है।
  • विविध hardware support: Bend सिर्फ CPU ही नहीं, बल्कि GPU पर भी कुशलता से चल सकता है, इसलिए इसे विभिन्न hardware environments में उपयोग किया जा सकता है।
  • expressive language: Python और Haskell की खूबियों को मिलाकर यह expressive code लिखने देता है। इससे code readability और maintainability बेहतर होती है।
  • शुरुआती चरण का code generation: फिलहाल Bend का code generation शुरुआती चरण में है, इसलिए mature compilers की तुलना में इसकी performance कम हो सकती है। यह भविष्य में सुधार की माँग करता है।
  • विभिन्न parallel systems का समर्थन: Bend किसी एक विशेष paradigm तक सीमित नहीं है, और कई तरह के parallel systems को support करता है, जिससे flexible programming संभव होती है। इससे Bend को विभिन्न application क्षेत्रों में उपयोग किया जा सकता है।

1 टिप्पणियां

 
GN⁺ 2024-05-18
Hacker News राय

Hacker News टिप्पणियों के संक्षिप्त सार

  • Python और PyPy प्रदर्शन तुलना

    • Python और PyPy पर एक ही कोड चलाने पर, PyPy काफ़ी तेज़ है.
    • Apple M3 Max और NVIDIA RTX 4090 पर बेंचमार्क नतीजे साझा किए गए.
    • Intel i7-1270P पर प्रदर्शन बहुत धीमा है.
    • Mac के अलावा दूसरे प्लेटफ़ॉर्म पर भी टेस्ट की ज़रूरत है.
  • सकारात्मक फ़ीडबैक

    • प्रोजेक्ट के शुरुआती चरण को देखते हुए, इसकी उपलब्धियों की सराहना की गई.
    • Futhark की तुलना में, कई targets को support न कर पाना एक कमी माना गया.
    • प्रदर्शन संबंधी समस्याएँ हल हो सकने योग्य लगती हैं.
  • आलोचनात्मक राय

    • शुरुआती वर्ज़न होने के बावजूद इसे काफ़ी आलोचना मिल रही है.
    • होमपेज सहज और समझने में आसान है.
    • parallel algorithms को लेकर उम्मीद और हक़ीक़त के अंतर का ज़िक्र किया गया.
  • parallel programming को लेकर अपेक्षाएँ

    • parallel programming के भविष्य को लेकर उत्साह व्यक्त किया गया.
    • Rust और Shadertoy के ज़रिए parallel programming के प्रयोग का अनुभव साझा किया गया.
    • GPU का उपयोग करने वाली general-purpose parallel language को लेकर उम्मीद जताई गई.
  • प्रदर्शन तुलना

    • C++ में लिखा एक साधारण loop, Bend के समान प्रदर्शन दिखाता है.
    • optimized C++ कोड काफ़ी तेज़ है.
  • प्रोजेक्ट के विकास को लेकर उम्मीद

    • automatic parallelization की मुश्किलों को पार करने की कोशिश की सराहना की गई.
    • प्रोजेक्ट के आगे बढ़ने की उम्मीद जताई गई.
  • संदेहपूर्ण नज़रिया

    • Bend की सीमित DSL प्रकृति की ओर इशारा किया गया.
    • इस बात पर ज़ोर दिया गया कि प्रदर्शन अच्छा नहीं है.
    • यह कहा गया कि वास्तविक high-performance parallel computing में arrays महत्वपूर्ण होते हैं.
    • Bend की उपयोगिता को लेकर संदेह व्यक्त किया गया.
  • सकारात्मक संभावनाएँ

    • यह कहा गया कि Bend में GPU उपयोग को अधिकतम करने की क्षमता हो सकती है.
    • LLMs के अलावा भी GPU के उपयोग की कई संभावनाओं को लेकर उम्मीद जताई गई.
  • Bend की भाषाई विशेषताएँ

    • Bend के सरल उपयोग और प्रदर्शन सुधार की सराहना की गई.
    • केवल 24-bit integers को support करना एक कमी माना गया.
    • अधिक bit वाले integers के support की ज़रूरत बताई गई.