2011-07-20 18 views
6

के साथ मल्टीथ्रेडिंग मैं मैटलैब पर एक प्रोजेक्ट पर काम कर रहा हूं जहां हमें प्रदर्शन को अनुकूलित करना है, और मैं एक .m फ़ाइल से बने कुछ फ़ंक्शन कॉल को समानांतर करने के बारे में सोच रहा था।मैटलैब

विचार, सरल था एक मैटलैब फ़ाइल (मीटर) एक सी फ़ाइल MEX के रूप में संकलित फोन से, और कहा कि सी फ़ाइल से, धागे की एक जोड़ी बना सकते हैं और प्रत्येक धागे से matlab कार्यों वापस बुलाना।

//Global variables 
mxArray **g_plhs; 
mxArray **g_prhs; 
int g_nlhs; 
int g_nrhs; 

//Thread function 
DWORD WINAPI my_function(LPVOID lpParam) 
{ 
    mexCallMATLAB(g_nlhs,g_plhs,g_nrhs,g_prhs,"matlab_function"); 
    return 0; 
} 


//Main function 
void mexFunction(int nlhs, mxArray *plhs[], 
    int nrhs, const mxArray *prhs[]) { 

    DWORD dwThreadIdArray[MAX_THREADS]; 
    HANDLE hThreadArray[MAX_THREADS]; 
    g_plhs = plhs; 
    g_prhs = prhs; 
    g_nlhs = nlhs; 
    g_nrhs = nrhs; 

    hThreadArray[0] = CreateThread( 
     NULL,     
     0,      
     my_function,    
     NULL,     
     0,      
     &dwThreadIdArray[0]); 

    WaitForMultipleObjects(MAX_THREADS, hThreadArray, TRUE, INFINITE); 

    for(i=0; i<MAX_THREADS; i++) 
    { 
     CloseHandle(hThreadArray[i]); 
    } 
} 

हम पर कोई प्रतिबंध है:

सिद्धांत काम करता है, मैं धागे बना सकते हैं, और मैं भी matlab समारोह कॉल कर सकते हैं, समस्या यह है कि मैं धागे से matlab फ़ंक्शन को कॉल नहीं कर सकता है matlab के साथ काम करते समय वह विकल्प? क्या किसी ने ऐसा कुछ करने की कोशिश की है?

संपादित करें: क्या कोई विकल्प है जिसके लिए समांतर टूलबॉक्स की आवश्यकता नहीं है?

+0

क्या आप MATLAB कोड समानांतर करने की कोशिश कर रहे हैं? – You

+2

@rlbisbe: MEX API थ्रेड-सुरक्षित नहीं है: http://www.mathworks.com/support/solutions/en/data/1-V3B5T/index.html?समाधान = 1-वी 3 बी 5 टी – Amro

उत्तर

6

आप केवल MATLAB मुख्य थ्रेड से एमएक्स * और मैक्स * फ़ंक्शंस को कॉल कर सकते हैं। आप मल्टीथ्रेडेड एमएक्स फाइलें लिख सकते हैं जो इन्हें एमएक्स इंटरफ़ेस के नीचे एक स्तर पर अपना काम प्रदान करते हैं। यदि आप एकाधिक MATLAB दुभाषियों को चाहते हैं, तो आपको कई MATLAB प्रक्रियाओं की आवश्यकता है। एक तरीका है समांतर कंप्यूटिंग टूलबॉक्स के माध्यम से जैसा कि @You द्वारा इंगित किया गया है। यह आपको PARFOR लूप और SPMD एक साथ चीजों को चलाने के लिए ब्लॉक देता है।

+0

पर नहीं है और समांतर कंप्यूटिंग टूलबॉक्स के बिना कोई विकल्प होगा? –

+1

@rlbisbe: ओपनएमपी का उपयोग करते हुए समानांतर कोड का एक उदाहरण है (जब तक आप स्पैमड थ्रेड्स से एमएक्स एपीआई फ़ंक्शंस को कॉल नहीं करते हैं): http://www.walkingrandomly.com/?p=1795 (टिप्पणियां भी देखें पीसीटी के सुझाए गए विकल्पों के लिए) – Amro

3

आप शायद parfor जैसे मल्टीथ्रेडिंग सुविधाओं में निर्मित MATLAB का उपयोग करके बेहतर हो जाएंगे। असल में, कई MATLAB फ़ंक्शन पहले से ही मल्टीथ्रेड किए गए हैं (मैट्रिक्स ऑपरेशंस समेत), इसलिए के साथ for को बदलने से अलग चीजों को समानांतर करने की आवश्यकता नहीं होनी चाहिए। (सामान्यतः, while लूप को पैरालाइज्ड नहीं किया जा सकता है।)

+2

परफॉर को मैटलैब समांतर टूलबॉक्स की आवश्यकता है, और मेरे पास यह मेरे मैटलैब लाइसेंस –

1

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

+2

5 घंटे पहले आपके उत्तर से आपके उत्तर का जवाब अलग कैसे है? कृपया अपने उत्तरों को पर्याप्त बनाएं। यदि आप जो कह रहे हैं वह यह है कि समानांतर टूलबॉक्स सस्ता है, तो आपके उत्तर के तहत टिप्पणी के रूप में लिखा जाने पर यह सर्वोत्तम होता है। – abcd

+0

lol, वास्तव में, यह आपके या एड्रिक उत्तर से बहुत अलग नहीं है। यह बात बताने के लिए धन्यवाद। –

1

मुझे आश्चर्य है कि हर कोई parfor के लिए दबाव डाल रहा है। मैं आपको कम से कम इस बारे में सोचने के लिए प्रोत्साहित करता हूं कि क्या आप अपने एल्गोरिदम को मैटलैब से कॉल करने के लिए डिज़ाइन कर सकते हैं और मैक्सिथेड सी/सी ++ से महत्वपूर्ण स्तरों को मैक्स पर कॉल किए बिना कम स्तर पर चला सकते हैं। यह आम तौर पर संभव होना चाहिए। खासकर यदि आप यह पता लगाने की जो अपने विश्लेषण के कदम टोंटी हैं मैटलैब profiler या इसी तरह के उपकरण का उपयोग, तो आप जाने के लिए लिखने के लिए होगा एक और तरीका है बहु सी

में केवल 1 या 2 चरणों में लिखने के लिए सक्षम हो सकता है आपके जावा में समांतरता, जो मैटलैब से काम करना आसान है।

अन्य विकल्प जिन्हें आप चेक आउट करना चाहते हैं, उनमें multicore submission on Matlab Central या MatlabMPI library शामिल हैं। दोनों थोड़े क्लेडी हैं और इंटरप्रोसेस समांतरता के लिए डिज़ाइन किए गए हैं (आपको मैटलैब के कई उदाहरण चलाना है), इसलिए बहुत बढ़िया, जटिल समांतरता के लिए अच्छा नहीं है। लेकिन 4 या 8 या 16 भागों में नौकरी तोड़ने के लिए उन्हें नौकरी मिलनी चाहिए, और कम से कम multicore में उचित सामुदायिक समर्थन है। मैंने अभी तक MatlabMPI की कोशिश नहीं की है, लेकिन यह आशाजनक लग रहा है। बोनस के रूप में, इन्हें कई मशीनों पर काम करना चाहिए, हालांकि उन्हें शायद साझा नेटवर्क फाइल सिस्टम की आवश्यकता होगी।