2012-06-27 25 views
13

में मैक्स-फ़ंक्शन कैसे प्रोफाइल कर सकता हूं मेरे पास एक मैक्स-फ़ंक्शन (सी ++ में एक फ़ंक्शन है जिसे आप मैटलैब से कॉल कर सकते हैं) जो मैंने लिखा है, और मैं इसे valgrind/kcachegrind का उपयोग करके प्रोफ़ाइल करना चाहता हूं। मुझे पता है कि अगर आप सी ++ प्रोग्राम सीधे चला रहे हैं तो valgrind/kcachegrind का उपयोग कैसे करें, लेकिन अगर मैं Matlab से C++ प्रोग्राम को कॉल कर रहा हूं तो यह प्रोफाइलिंग करने का कोई तरीका है?मैटलैब

+0

महान सवाल, मैंने अक्सर इस बारे में सोचा है। अफसोस की बात है कि मुझे जवाब नहीं पता, लेकिन मुझे पता है कि विजुअल स्टूडियो के साथ मेक्स कोड को प्रोफाइल करना संभव है ... –

+0

@ बिलकैथम आप मेक्स फ़ाइल लोड करने के लिए रैपर कोड का उपयोग करके लिनक्स पर वालग्रिंड का उपयोग कर सकते हैं, जो अनिवार्य रूप से एक गतिशील पुस्तकालय है। मेरे जवाब पर एक नज़र डालें। – angainor

+0

एलेक्स, क्या आपको मेक्सिको फ़ाइलों को प्रोफाइल करने का कोई और तरीका मिला? मैं उत्सुक हूँ। – angainor

उत्तर

9

एमईएक्स फाइलें लाइब्रेरी साझा करने के बाद से एमईएक्स प्रोफाइल प्रोफाइलिंग मुश्किल है। यह मानक 'gprof' दृष्टिकोण का उपयोग कर लिनक्स पर नहीं किया जा सकता है - gprof बस ऐसा नहीं करता है। मैंने स्पोफ का उपयोग करने की कोशिश की, लेकिन मुझे “PLTREL not found error” मिल गया - स्पॉफ का उपयोग नहीं किया जा सकता है। पिछली पोस्ट here है, लेकिन किसी ने अंतिम जवाब नहीं दिया है।

सौभाग्य से, एक तरीका है जिसमें कोई लिनक्स पर वालग्रिंड के साथ ऐसा कर सकता है। सबसे पहले, हमें 'रनिंग' कोड लिखना होगा जो मैक्स फ़ाइल लोड करता है, हमारे लिए कॉल करने के लिए मैक्सफंक्शन प्रतीक प्रदान करता है, और एमएक्स फ़ाइल के पैरामीटर सेट करता है। मैंने MATLAB engine का उपयोग करके MATLAB के साथ ऐसा करने के लिए अनुशंसित तरीके का उपयोग करना चुना है। निम्न कोड (test.c के रूप में सहेजें) एक मैक्स फ़ाइल लोड करता है और मैक्सफंक्शन प्रतीक पाता है, पहले 'input.mat' के रूप में सहेजी गई फ़ाइल से इनपुट डेटा लोड करता है (सहेजने के आदेश से MATLAB में किया जा सकता है), और मैक्सफंक्शन को कॉल करता है।

#include <stdlib.h> 
#include <stdio.h> 
#include <string.h> 
#include <errno.h> 
#include <dlfcn.h> 
#include "engine.h" 

typedef void (*mexFunction_t)(int nargout, mxArray *pargout [ ], int nargin, const mxArray *pargin[]); 

int main(int argc, const char *argv[]) 

{ 
    Engine *ep; 
    char buff[1024]; 
    int i; 

    /* matlab must be in the PATH! */ 
    if (!(ep = engOpen("matlab -nodisplay"))) { 
    fprintf(stderr, "Can't start MATLAB engine\n"); 
    return -1; 
    } 
    engOutputBuffer(ep, buff, 1023); 

    /* load the mex file */ 
    if(argc<2){ 
    fprintf(stderr, "Error. Give full path to the MEX file as input parameter.\n"); 
    return -1; 
    } 
    void *handle = dlopen(argv[1], RTLD_NOW); 
    if(!handle){ 
    fprintf(stderr, "Error loading MEX file: %s\n", strerror(errno)); 
    return -1; 
    } 

    /* grab mexFunction handle */ 
    mexFunction_t mexfunction = (mexFunction_t)dlsym(handle, "mexFunction"); 
    if(!mexfunction){ 
    fprintf(stderr, "MEX file does not contain mexFunction\n"); 
    return -1; 
    } 

    /* load input data - for convenience do that using MATLAB engine */ 
    /* NOTE: parameters are MEX-file specific, so one has to modify this*/ 
    /* to fit particular needs */ 
    engEvalString(ep, "load input.mat"); 
    mxArray *arg1 = engGetVariable(ep, "Ain"); 
    mxArray *arg2 = engGetVariable(ep, "opts"); 
    mxArray *pargout[1] = {0}; 
    const mxArray *pargin[2] = {arg1, arg2}; 

    /* execute the mex function */ 
    mexfunction(1, pargout, 2, pargin); 

    /* print the results using MATLAB engine */ 
    engPutVariable(ep, "result", pargout[0]); 
    engEvalString(ep, "result"); 
    printf("%s\n", buff); 

    /* cleanup */ 
    mxDestroyArray(pargout[0]); 
    engEvalString(ep, "clear all;"); 
    dlclose(handle); 
    engClose(ep); 

    return 0; 
} 

एमएक्स फ़ाइल को mex -g स्विच के साथ भी संकलित किया जाना चाहिए। उपरोक्त कोड को mex -g के साथ संकलित किया जाना चाहिए और संकलन पैरामीटर के रूप में engopts.sh का उपयोग करना है। MATLAB कमांड लाइन प्रकार से

mex('-v', '-f', fullfile(matlabroot,... 
    'bin','engopts.sh'),... 
    'test.c'); 

या एक मानक लिनक्स टर्मिनल रन

/path/to/matlab/bin/mex -g -f /path/to/matlab/bin/engopts.sh test.c 

valgrind साथ MEX फ़ाइल रूपरेखा कमांड लाइन से 'परीक्षण' कार्यक्रम चलाने की आवश्यकता है में।

PATH=$PATH:/path/to/matlab/bin/ LD_LIBRARY_PATH=/path/to/matlab/bin/glnxa64/:/path/to/matlab/sys/os/glnxa64/ valgrind --tool=callgrind ./test ./mex_file.mexa64 

ध्यान दें कि MATLAB और सही वास्तुकला पर निर्भर पुस्तकालय रास्तों की जरूरत के लिए पथ सेट करने के लिए: निर्देशिका जहां दोनों परीक्षण और MEX फ़ाइल आदेश लिखें रहते हैं में! matlab निष्पादन योग्य पाथ में मौजूद होना चाहिए, अन्यथा 'परीक्षण' असफल हो जाएगा।

एक और पकड़ है। MATLAB इंजन को सिस्टम पर csh स्थापित करने की आवश्यकता है (आप किसी भी खोल का उपयोग कर सकते हैं, csh केवल/bin में उपस्थित होने की आवश्यकता है)। तो यदि आपके पास यह नहीं है, तो आपको इसे काम करने के लिए इसे इंस्टॉल करना होगा।

4

आप, डी विकल्प के साथ MATLAB शुरू कर सकता है इस MatlabCentral thread पर वर्णित है:

matlab -nojvm -nodesktop -nosplash -D"valgrind --error-limit=no --leak-check=yes --tool=memcheck -v --log-file=valgrind.log"

मुझे यकीन है कि आप valgrind का नवीनतम संस्करण है कि बनाने के लिए जोड़ना होगा। जब मैंने अपनी एमईएक्स फ़ाइल को valgrind संस्करण 3.6 के साथ डीबग करने का प्रयास किया, तो स्मृति त्रुटियों की रिपोर्ट करने के बजाय valgrind क्रैश हो गया।