2013-03-01 3 views
16

मेरे पास एक आर पैकेज है जो रिकर्सिव रैखिक बीजगणित कंप्यूटेशंस के नेस्टेड लूप के लिए फोर्ट्रान सबराउटिन का उपयोग करता है (बीएलएएस और लैपैक रूटीन पर भारी निर्भर करता है)। फोरट्रान के लिए एक इंटरफ़ेस के रूप में, मैं .Fortran फ़ंक्शन का उपयोग करता हूं। मैंने सी/सी ++ में लिखे गए सबराउटिन के मामले में .Call के बजाय .Call का उपयोग करने के बारे मेंपढ़ा है, और यह मुझे सोच रहा है कि सी में एक साधारण रैपर लिखकर फोरट्रान सबराउटिन का उपयोग करते समय .Call इंटरफ़ेस का उपयोग करना बेहतर होगा। फोरट्रान subroutines?आर: फोर्ट्रान सबराउटिन का उपयोग करने के फायदे। फोर्ट्रान के बजाय कैल और सी/सी ++ रैपर।

जैसा कि कहा गया है, मेरे फोरट्रान कोड इस अर्थ में काफी सरल हैं कि मैं सिर्फ डबल या पूर्णांक के बहुआयामी सरणी के साथ खेलता हूं। लेकिन मैंने सीखा है कि मुझे यह सुनिश्चित करने के लिए आर पक्ष में काफी सारे चेक लिखना होगा कि सब कुछ दुर्घटनाग्रस्त नहीं है क्योंकि मैं गलती से कुछ मैट्रिक्स के स्टोरेज मोड को पूर्णांक में बदलने या कुछ मैट्रिक्स के आयामों को बदलने के लिए भूल गया था।

सबराउटिन F90/95 के रूप में लिखे गए हैं।

+1

कुछ सी फ़ंक्शन के साथ उपयोग करने के लिए उचित लगता है। और फिर आप वास्तव में सी कोड से अपने फोरट्रान सबराउटिन को कॉल कर सकते हैं, जो अपेक्षाकृत आसान है (या यदि आपको वास्तव में फोरट्रान की आवश्यकता नहीं है तो सी में सबकुछ भी करें)। – steabert

+0

हां, लेकिन अगर कोई लाभ आएगा तो क्या होगा? मैं पूरी तरह से सी पर स्विच कर सकता था, लेकिन मैं बहुत बोझिल होगा और मुझे संदेह है कि यह उपयोगी होगा क्योंकि मैं फिर से फोरट्रान ब्लैस फ़ंक्शन को कॉल कर रहा हूं। –

+0

प्रासंगिक हो सकता है: http://www.ualberta.ca/AICT/RESEARCH/LinuxClusters/doc/ifc91/main_for/mergedProjects/bldaps_for/pgsclmix.htm – KLDavenport

उत्तर

3

यदि आप बड़े डेटासेट के साथ काम कर रहे हैं तो इसका लाभ हो सकता है। .Call बहुत तेज़ हो सकता है क्योंकि जब भी आप फ़ंक्शन को कॉल करते हैं तो आप डेटा की प्रतिलिपि नहीं बना रहे हैं। इस प्रश्न में वर्णित मामले के लिए, ऐसा कोई फायदा नहीं होगा, क्योंकि आर 2.15.1 रिलीज नोट्स राज्य

सी।() और फोर्ट्रान() कम प्रतिलिपि करते हैं: तर्क जो कच्चे, तार्किक, पूर्णांक, वास्तविक या जटिल वैक्टर और अज्ञात हैं जिन्हें कॉल से पहले कॉपी नहीं किया गया है, और (नाम या नहीं) कॉल के बाद कॉपी नहीं किए गए हैं। सूची अब कॉपी नहीं की जाती है (उन्हें सी कोड में केवल पढ़ने के लिए उपयोग किया जाना चाहिए)।

स्विचिंग। का मतलब है कि आप फोर्ट्रान इंटरफेस की सुविधा छोड़ देते हैं। आप सीएक्सपी को सी कोड में पास कर देंगे, (डरावनी और अच्छी तरह से प्रलेखित नहीं) आर एपीआई का उपयोग कर डेटा के किसी भी चेक/हेरफेर करें, और फिर सी से फोरट्रान फ़ंक्शन को कॉल करें। आपके कोड के साथ काम करने वाले किसी और को समझना होगा आर एपीआई और सी/फोरट्रान इंटरऑप।

+0

हां प्रतिलिपि एक स्पष्ट लाभ प्रतीत होती है, हालांकि आर 2.15.1 के रूप में अंतर थोड़ा कम हो गया है: "' सी() 'और' फोर्ट्रान() 'कम प्रतिलिपि करते हैं: तर्क जो कच्चे, तार्किक, पूर्णांक हैं , वास्तविक या जटिल वैक्टर और अज्ञात हैं जिन्हें कॉल से पहले कॉपी नहीं किया गया है, और (नाम या नहीं) कॉल के बाद कॉपी नहीं किए गए हैं। " (आर समाचार से)। –

+0

ऐसा लगता है कि मेरे आवेदन में कॉपी करने के प्रभाव महत्वपूर्ण नहीं हैं; मैंने 'DUP = FALSE' और' DUP = TRUE' का उपयोग करके 'फोर्ट्रान' के साथ अपने कोड को कॉल करने का परीक्षण किया, और व्यावहारिक रूप से कोई अंतर नहीं देखा, हालांकि मैं लाखों तत्वों वाले सरणी का उपयोग कर रहा था। –

+0

मुझे उन कार्यों के व्यवहार में बदलाव से अवगत नहीं था। मैंने इसे प्रतिबिंबित करने के लिए प्रश्न संपादित किया है। – user2225804

संबंधित मुद्दे