Bombyx: OpenCilk Compilation for FPGA Hardware Acceleration
Shahawy, de Castelnau, Ienne
Task-level parallelism (TLP) is a widely used approach in software where independent tasks are dynamically created and scheduled at runtime. Recent systems have explored architectural support for TLP on field-programmable gate arrays (FPGAs), often leveraging high-level synthesis (HLS) to create processing elements (PEs). In this paper, we present Bombyx, a compiler toolchain that lowers OpenCilk programs into a Cilk-1-inspired intermediate representation, enabling efficient mapping of CPU-oriented TLP applications to spatial architectures on FPGAs. Unlike OpenCilk's implicit task model, which requires costly context switching in hardware, Cilk-1 adopts explicit continuation-passing - a model that better aligns with the streaming nature of FPGAs. Bombyx supports multiple compilation targets: one is an OpenCilk-compatible runtime for executing Cilk-1-style code using the OpenCilk backend, and another is a synthesizable PE generator designed for HLS tools like Vitis HLS. Additionally, we introduce a decoupled access-execute optimization that enables automatic generation of high-performance PEs, improving memory-compute overlap and overall throughput.
academic
Bombyx: FPGA हार्डवेयर त्वरण के लिए OpenCilk संकलन
यह पेपर Bombyx प्रस्तुत करता है, जो OpenCilk प्रोग्राम को FPGA हार्डवेयर त्वरक में संकलित करने के लिए एक टूलचेन है। Bombyx OpenCilk के निहित कार्य समानांतरता मॉडल को Cilk-1 शैली के स्पष्ट निरंतरता-पारण (continuation-passing) मध्यवर्ती प्रतिनिधित्व में परिवर्तित करता है, जो FPGA की स्ट्रीमिंग विशेषताओं के लिए अधिक उपयुक्त है। यह टूल कई संकलन लक्ष्यों का समर्थन करता है: सत्यापन के लिए OpenCilk-संगत रनटाइम, और Vitis HLS जैसे उच्च-स्तरीय संश्लेषण उपकरणों के लिए संश्लेषणीय प्रसंस्करण इकाई जनरेटर। इसके अतिरिक्त, Bombyx विघटित मेमोरी-निष्पादन (DAE) अनुकूलन प्रस्तुत करता है, जो स्वचालित रूप से उच्च-प्रदर्शन प्रसंस्करण इकाइयां उत्पन्न करता है, मेमोरी-कंप्यूट ओवरलैप और समग्र थ्रूपुट को बढ़ाता है।
कार्य-स्तरीय समानांतरता (TLP) सॉफ्टवेयर में व्यापक रूप से उपयोग की जाने वाली समानांतरता तकनीक है, जो रनटाइम पर स्वतंत्र कार्यों को गतिशील रूप से बनाने और शेड्यूल करने में सक्षम बनाती है। हालांकि FPGA पर TLP का समर्थन करने के लिए हार्डवेयर ढांचे (जैसे ParallelXL और HardCilk) मौजूद हैं, सॉफ्टवेयर TLP ढांचे से प्रसंस्करण इकाई (PE) कोड को स्वचालित रूप से निकालने और संकलित करने के लिए स्वचालन उपकरणों की कमी है। मौजूदा ढांचे आमतौर पर उपयोगकर्ताओं को PE कोड मैन्युअल रूप से प्रदान करने की आवश्यकता होती है, जो कठिन और त्रुटि-प्रवण दोनों है।
स्वचालन की आवश्यकता: CPU-उन्मुख TLP अनुप्रयोगों को FPGA में स्थानांतरित करने के लिए कोड पुनर्संरचना, हार्डवेयर इंटरफेस अनुकूलन, कॉन्फ़िगरेशन फ़ाइल पीढ़ी आदि सहित बड़े पैमाने पर मैनुअल कार्य की आवश्यकता होती है
प्रदर्शन अनुकूलन: मैन्युअल रूप से लिखा गया कोड उन्नत हार्डवेयर अनुकूलन (जैसे विघटित मेमोरी-निष्पादन) लागू करना मुश्किल है
विकास दक्षता: स्वचालित टूलचेन की कमी FPGA त्वरण में TLP के व्यापक अनुप्रयोग में बाधा डालती है
OpenCilk का निहित मॉडल: cilk_spawn और cilk_sync का उपयोग करने वाला fork-join मॉडल समन्वय बिंदुओं पर संदर्भ स्विचिंग की आवश्यकता होती है। हार्डवेयर में संदर्भ स्विचिंग को लागू करने के लिए संपूर्ण सर्किट स्थिति को सहेजना आवश्यक है, जो वर्तमान HLS उपकरणों के लिए न तो सीधे समर्थित है और न ही बड़े पैमाने पर RTL इंजीनियरिंग की आवश्यकता है
TAPIR मध्यवर्ती प्रतिनिधित्व: OpenCilk द्वारा उपयोग किया जाने वाला TAPIR निम्न-स्तरीय संकलक निर्माणों का उपयोग करता है, जिससे HLS के लिए मूल कोड के करीब पठनीय C++ कोड उत्पन्न करना मुश्किल है
मैनुअल PE लेखन: समापन संरेखण, लेखन बफर इंटरफेस, कॉन्फ़िगरेशन फ़ाइल पीढ़ी आदि जैसे कठिन विवरणों को मैन्युअल रूप से संभालने की आवश्यकता है
Cilk-1 का स्पष्ट निरंतरता-पारण मॉडल हार्डवेयर कार्यान्वयन के लिए अधिक उपयुक्त है, क्योंकि यह समन्वय बिंदुओं पर कार्यों को समाप्त कार्यों में विभाजित करता है (परमाणु रूप से निष्पादित, संदर्भ स्विचिंग की आवश्यकता नहीं)। हालांकि यह मॉडल सॉफ्टवेयर प्रोग्रामिंग के लिए पर्याप्त सहज नहीं है (इसलिए Cilk के विकास में समाप्त हो गया), लेकिन हार्डवेयर कार्यान्वयन के लिए यह प्राकृतिक है। Bombyx का लक्ष्य OpenCilk से स्पष्ट TLP में रूपांतरण को स्वचालित करना, और अनुकूलित हार्डवेयर PE उत्पन्न करना है।
स्वचालित संकलन प्रवाह: OpenCilk से FPGA हार्डवेयर त्वरक तक संपूर्ण स्वचालित संकलन टूलचेन Bombyx प्रस्तावित करता है
स्पष्ट मध्यवर्ती प्रतिनिधित्व: नियंत्रण प्रवाह ग्राफ-आधारित निहित और स्पष्ट IR डिजाइन करता है, fork-join मॉडल से निरंतरता-पारण मॉडल में स्वचालित रूपांतरण को सक्षम करता है
बहु-लक्ष्य कोड पीढ़ी:
HardCilk बैकएंड: स्वचालित रूप से संश्लेषणीय C++ HLS कोड और कॉन्फ़िगरेशन फ़ाइलें उत्पन्न करता है
Cilk-1 सिमुलेशन परत: रूपांतरण सही होने को सत्यापित करने के लिए OpenCilk रनटाइम का उपयोग करता है
विघटित मेमोरी-निष्पादन अनुकूलन: संकलक निर्देशों (pragma) के माध्यम से DAE अनुकूलन का समर्थन करता है, मेमोरी और कंप्यूट को अलग-अलग कार्यों में अलग करता है, हार्डवेयर प्रदर्शन को बढ़ाता है
प्रायोगिक सत्यापन: ग्राफ ट्रैवर्सल बेंचमार्क में, DAE अनुकूलन 26.5% रनटाइम में कमी प्राप्त करता है
OpenCilk Clang फ्रंटएंड का उपयोग करके अमूर्त वाक्य वृक्ष उत्पन्न करता है
AST को नियंत्रण प्रवाह ग्राफ (CFG) प्रतिनिधित्व के निहित IR में परिवर्तित करता है
प्रत्येक कार्य एक CFG से मेल खाता है, जिसमें शामिल है:
अद्वितीय प्रवेश ब्लॉक (कोई इनबाउंड किनारा नहीं)
एक या अधिक निकास ब्लॉक (कोई आउटबाउंड किनारा नहीं)
मूल ब्लॉक क्रमिक C कथनों से बने होते हैं, नियंत्रण प्रवाह कथनों द्वारा समाप्त होते हैं
TAPIR का उपयोग क्यों नहीं: TAPIR निम्न-स्तरीय निर्माणों (जैसे φ नोड्स, alloca आदि) का उपयोग करता है, जिससे मूल कोड के करीब पठनीय C++ कोड उत्पन्न करना मुश्किल हो जाता है। Bombyx का IR मूल कोड संरचना को संरक्षित करता है।
यह Bombyx का मूल रूपांतरण चरण है, जो OpenCilk के निहित समन्वय मॉडल को Cilk-1 के स्पष्ट निरंतरता-पारण मॉडल में परिवर्तित करता है।
मुख्य अवधारणाएं:
समापन (Closure): कार्य का प्रतिनिधित्व करने वाली डेटा संरचना, जिसमें शामिल है:
तैयार पैरामीटर
निर्भरता की प्रतीक्षा करने वाले प्लेसहोल्डर
रिटर्न पॉइंटर
spawn_next: निर्भरता की प्रतीक्षा करने वाले निरंतरता कार्य को बनाता है
send_argument: प्रतीक्षा समापन में पैरामीटर को स्पष्ट रूप से लिखता है और शेड्यूलर को सूचित करता है
रूपांतरण एल्गोरिदम:
पथ विभाजन: CFG को ट्रैवर्स करता है, कार्य समाप्ति ब्लॉक (return) या sync ऑपरेशन का सामना करते समय नया पथ शुरू करता है
प्रत्येक पथ एक आत्मनिर्भर समाप्ति कार्य बन जाता है
चित्र 4(c) में ग्रे क्षेत्र दो पथों का प्रतिनिधित्व करता है
निर्भरता पहचान: sync सीमा की निर्भरता संबंध का विश्लेषण करता है
sync के बाद उपयोग किए जाने वाले चर की पहचान करता है (जैसे चित्र 1 में x और y)
ये चर को समापन में स्पष्ट रूप से संग्रहीत करने की आवश्यकता है
कीवर्ड प्रतिस्थापन:
spawn कॉल पर समापन घोषणा सम्मिलित करता है
sync को spawn_next कॉल से बाद के कार्य में बदलता है
spawn के रिटर्न मान को समापन फ़ील्ड में स्पष्ट लेखन में बदलता है
return कथन को संरक्षित करता है, बाद में send_argument में परिवर्तित किया जा सकता है
उदाहरण रूपांतरण (चित्र 1 से चित्र 2):
// निहित (OpenCilk)
int x = cilk_spawn fib(n-1);
int y = cilk_spawn fib(n-2);
cilk_sync;
return x + y;
// स्पष्ट (Cilk-1)
cont int x, y;
spawn_next sum(k, ?x, ?y); // निरंतरता कार्य बनाता है
spawn fib(x, n-1); // x प्लेसहोल्डर में लिखता है
spawn fib(y, n-2); // y प्लेसहोल्डर में लिखता है
// कार्य समाप्त, sync की आवश्यकता नहीं
HardCilk एक खुला स्रोत FPGA TLP आर्किटेक्चर जनरेटर है, जो हार्डवेयर कार्य चोरी शेड्यूलर प्रदान करता है। Bombyx स्वचालित रूप से HardCilk के लिए आवश्यक सभी घटक उत्पन्न करता है:
2 OpenCilk (PPoPP'23): नवीनतम Cilk ढांचा, Bombyx का इनपुट भाषा
4 HardCilk (FCCM'24): Bombyx का लक्ष्य प्लेटफॉर्म, लेखकों का पूर्ववर्ती कार्य
5 Cilk-1 (SIGPLAN'95): शास्त्रीय स्पष्ट निरंतरता-पारण TLP प्रणाली, Bombyx का सैद्धांतिक आधार
6 Joerg डॉक्टरेट थीसिस (1996): निहित से स्पष्ट रूपांतरण की सैद्धांतिक व्यवहार्यता साबित करता है
समग्र मूल्यांकन: Bombyx एक मूल्यवान अनुसंधान कार्य है, जो OpenCilk से FPGA हार्डवेयर त्वरण तक स्वचालित टूलचेन अंतर को भरता है। इसका मूल नवीनता Cilk-1 के स्पष्ट निरंतरता-पारण मॉडल का उपयोग करके हार्डवेयर संदर्भ स्विचिंग से बचना है, और संपूर्ण संकलन प्रवाह प्रदान करना है। हालांकि, प्रारंभिक कार्य के रूप में, पेपर प्रायोगिक मूल्यांकन की चौड़ाई और गहराई में स्पष्ट कमी है, और DAE अनुकूलन की अर्ध-स्वचालन भी उपयोग में आसानी को सीमित करती है। यह उपकरण HardCilk उपयोगकर्ताओं और TLP शोधकर्ताओं के लिए सीधा मूल्य है, लेकिन व्यापक अनुप्रयोग के लिए आगे की परिपक्वता की आवश्यकता है। अनुशंसित भविष्य कार्य स्वचालित अनुकूलन पहचान, विस्तारित बेंचमार्क मूल्यांकन, और खुला स्रोत रिलीज पर ध्यान केंद्रित करना चाहिए ताकि सामुदायिक सत्यापन और सुधार को बढ़ावा दिया जा सके।