2011-12-28 8 views
16

Parallel Linq जैसे सिस्टम का उपयोग करना, एक ही मशीन के भीतर एकाधिक कोर और धागे में अज्ञात कार्यों, प्रश्नों आदि के निष्पादन को विभाजित करना संभव है। मुझे मानक भाषा संरचनाओं जैसे कि लूप (जैसे Parallel.For()), int एस, struct एस आदि जैसे मूल्य प्रकारों का उपयोग करके कई मशीनों में चलाने के लिए इसे विस्तारित करने की क्षमता चाहिए, और एप्लिकेशन स्रोत संशोधन को न्यूनतम में रखें। आदर्श रूप से, यह मुझे एक परियोजना खोलने, एक विधि में एक विशेषता जोड़ने, और उन्नत कार्यक्षमता तक पहुंच प्राप्त करने के लिए पुन: संकलित करने की अनुमति देगा।सी # भाषा एक्सटेंशन कार्यान्वित करना

ऐसा लगता है कि मैं की तर्ज पर कुछ आवश्यकता होगी: (जैसे कि एक लैम्ब्डा के रूप में)

  1. क्षमता कोड का एक संकलित ब्लॉक कब्जा करने के लिए और यह एक कार्यकर्ता एक और नोड पर चल प्रक्रिया को पारित , आवश्यक किसी भी डेटा के साथ, या

  2. एक प्रीप्रोसेसर प्रदान करें जो प्रश्न में कोड को कैप्चर करेगा, इसे एक प्रकार के टेम्पलेट प्रोजेक्ट में संकलित करेगा जो वैरिएबल संदर्भों को प्रतिस्थापित करेगा, आदि को संभालने वाली कक्षा के संदर्भों के साथ नेटवर्क संचार, कैशिंग और किसी अन्य आवश्यक संपत्ति तक पहुंच, और परिणामी डीएलएल को किसी भी availa को भेजें ब्ली वर्कर नोड्स अन्य मशीनों पर चल रहा है।

Roslyn कुछ उपकरण प्रदान करने के लिए प्रतीत होता है जो यहां उपयोगी होंगे। इस अनुमति के लिए वर्तमान संकलन पाइपलाइन में हुक करने का कोई तरीका है?

संपादित

ठीक है, मैं जानता हूँ कि यह संभव है, because these guys did it। सवाल है, कैसे?

+5

ठीक है, closers - यह वास्तव में भी स्थानीयकृत कैसे है? –

+2

क्योंकि आप यहां एकमात्र व्यक्ति होना चाहिए जो ओपनसीएल कर्नेल बनाने के लिए सी # भाषा एक्सटेंशन को कार्यान्वित करना चाहता है। –

+1

ठीक है, ओपनसीएल भाग के बारे में भूल जाओ। हेटरोजेनस प्लेटफार्मों में निष्पादन को वितरित करने के लिए कोड जनरेशन को अनुकूलित करने के लिए आप संकलन चरण में हुकिंग के बारे में कैसे जाएंगे? यह शायद मुझे और अधिक स्पष्ट लगता है। और जब से हम विशिष्ट अनुप्रयोगों के बारे में सवाल कब बंद करते हैं ?! –

उत्तर

10

आपको ब्राह्मा क्या करने के लिए भाषा persay का विस्तार करने की आवश्यकता नहीं है। उन्होंने अभी एक कस्टम क्वेरी प्रदाता को कार्यान्वित किया है जो अभिव्यक्ति के पेड़ों को पार करता है और जीपीजीपीयू कोड उत्सर्जित करता है (एसक्यूएल से एसक्यूएल एक ही चीज करता है लेकिन एसक्यूएल के साथ)।

मैंने एमएसडीएन here पर एक मूल गाइड से जुड़ा हुआ है जो आपको IQueryable प्रदाता लागू करने और चलाने के लिए चला सकता है।

कठिन हिस्सा अभिव्यक्ति पेड़ों को पार कर रहा है और ओपनसीएल कोड उत्पन्न करेगा। एक बार ऐसा करने के बाद आप इसे क्लू को पास कर दें और आपको दौड़ना चाहिए।

संपादित

आप एक उपकरण है जो एक विशेषता [Kernel] साथ GPU कोड को मानक .NET कोड संकलित जुड़े। वे संकलित आईएल में विशेषताओं के लिए एक पोस्ट-बिल्ड टूल देखकर ऐसा करते हैं और वे जीपीयू कॉल जेनरेट करने के लिए आईएल रीराइटिंग करते हैं। यह PostSharp, एक एओपी समाधान के समान है।

आईएल पुनर्लेखन समय लेने वाली और कड़ी मेहनत है लेकिन आप इस मार्ग पर भी जा सकते हैं।

+0

बहुत बढ़िया; जवाब के लिए धन्यवाद। मैं अभी भी कस्टम प्रदाता का उपयोग किए बिना इसे लागू करने के बारे में उत्सुक हूं - जैसे कि लूप कैप्चर करना, और उन्हें ऐसे प्रदाता के संदर्भों के साथ बदलना - लेकिन इससे समस्या हल हो जाएगी। –

+1

+1। कुछ पुस्तकालय हैं जो कस्टम LINQ प्रदाता को कार्यान्वित करने के लिए सरल हैं, जैसे कि [re-linq] (http://relinq.codeplex.com/)। – TrueWill

+1

अभिव्यक्ति पेड़ लूप का प्रतिनिधित्व कर सकते हैं और अधिकांश कथन सी # 4 के रूप में बनाते हैं। यदि आप नहीं चाहते हैं कि LINQ शैली सिंटैक्स सिर्फ अभिव्यक्ति पेड़ों को पार्स करें। याद रखें कि आप सीधे अभिव्यक्ति वस्तुओं पर लैम्ब्डा फ़ंक्शंस असाइन कर सकते हैं, उदाहरण के लिए: 'अभिव्यक्ति > someExpression = (i) => वापसी "अरे!" ' –

11

समांतर लिंक जैसे सिस्टम का उपयोग करना, एक ही मशीन के भीतर कई कोर और धागे में अज्ञात कार्यों, प्रश्नों आदि के निष्पादन को विभाजित करना संभव है। मैं मानक भाषा संरचनाओं जैसे कि लूप (जैसे समानांतर.फॉर()), इन्स, structs इत्यादि जैसे मान प्रकारों का उपयोग करके एकाधिक मशीनों में चलाने के लिए इसे विस्तारित करने की क्षमता चाहूंगा, और एप्लिकेशन स्रोत संशोधनों को न्यूनतम में रखूंगा ।

बहुत अच्छा लगता है। असल में हमारे पास माइक्रोसॉफ्ट रिसर्च में बहुत अधिक प्रणाली है, हालांकि जाहिर है कि मैं विवरणों पर चर्चा नहीं कर सकता।

मैं कोड का एक संकलित ब्लॉक कब्जा करने के लिए (जैसे कि एक लैम्ब्डा के रूप में) और, एक कार्यकर्ता एक और नोड पर चल प्रक्रिया के लिए इसे पारित किसी भी डेटा की आवश्यकता है

ठीक के साथ क्षमता की जरूरत है, तुम्हें यह मिल गया है। हमने उस सुविधा को सी # 3 में जोड़ा। इस प्रकार LINQ से SQL काम करता है। किसी भी तरह LINQ क्वेरी डेटाबेस पर जाना है। संकलित लैम्ब्डा क्लाइंट मशीन पर पूछताछ की जाती है, जो सर्वर नोड को भेजी गई क्वेरी में परिवर्तित होती है, और फिर परिणाम वापस भेज दिया जाता है।

रोज़लिन कुछ टूल प्रदान करने लगते हैं जो यहां उपयोगी होंगे। इस अनुमति के लिए वर्तमान संकलन पाइपलाइन में हुक करने का कोई तरीका है?

यह रोज़लिन का उद्देश्य नहीं है; Roslyn सी # भाषा में नई सुविधाओं को जोड़ने के बारे में नहीं है। यह रिफैक्टरिंग इंजन जैसी चीजों को बनाने के लिए कोड का विश्लेषण करना आसान बनाता है।

आपको संकलन पाइपलाइन में शामिल होने की आवश्यकता नहीं है। PLINQ संकलक को नहीं बदलता है, LINQ से SQL संकलक को नहीं बदलता है, और इसी तरह। जब आप एक लैम्ब्डा को अभिव्यक्ति वृक्ष में परिवर्तित करते हैं तो संकलक कोड को उत्सर्जित करता है जो लम्बाडा का प्रतिनिधित्व करने वाले रनटाइम पर एक अभिव्यक्ति वृक्ष बनाता है। आप उस अभिव्यक्ति के पेड़ से पूछताछ कर सकते हैं, इसे अपने नेटवर्क में किसी अन्य मशीन पर क्रमबद्ध कर सकते हैं, इसे विलुप्त कर सकते हैं, इसे एक प्रतिनिधि में बदल सकते हैं और इसे चला सकते हैं यदि वह ऐसी चीज है जिसे आप पसंद करते हैं।

आपको शायद अपना खुद का अभिव्यक्ति वृक्ष धारावाहिक और deserializer लिखने की आवश्यकता होगी, लेकिन वे बहुत सरल डेटा संरचनाएं हैं। एक अपरिवर्तनीय पेड़ होने के कारण उन्हें क्रमबद्ध करने और deserialize करने के लिए बहुत आसान बनाना चाहिए; वे वास्तव में जटिल नेटवर्क नहीं बना सकते क्योंकि वे हमेशा पत्ते नोड्स से बने होते हैं।

+0

धन्यवाद, एरिक। मैंने LINQ से SQL तक समानता नहीं माना था। मैंने आज सुबह अभिव्यक्ति के पेड़ के साथ खेलना शुरू कर दिया है, और मैं बहुत जोर से पकड़ने की कोशिश नहीं कर रहा हूं। :) –

+0

अनुवर्ती: यह आश्चर्यजनक रूप से अच्छी तरह से काम करता है। ऐसी लचीली, एक्स्टेंसिबल प्रणाली प्रदान करने के लिए एमएस के लिए क्यूडो। कोड-ए-डेटा का संकलन-समय सत्यापन प्रदान करना दिमागी रूप से अच्छा है। –