2011-07-20 9 views
6

Tôi đang làm việc trên một dự án trên Matlab, nơi chúng tôi phải tối ưu hóa hiệu suất và tôi đã suy nghĩ về việc song song một vài cuộc gọi hàm được tạo từ tệp .m. Ý tưởng rất đơn giản, từ một tệp Matlab (.m) gọi một tệp C được biên dịch là MEX và từ tệp C đó, tạo một vài luồng và gọi lại các hàm matlab từ mỗi luồng.Đa luồng với Matlab

Lý thuyết hoạt động, tôi có thể tạo ra các chủ đề, và tôi cũng có thể gọi hàm matlab, vấn đề là tôi không thể gọi hàm MATLAB từ thread:

//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]); 
    } 
} 

Liệu chúng ta có bất kỳ hạn chế về tùy chọn đó khi làm việc với MATLAB? Có ai đó đã thử một cái gì đó như thế này?

Chỉnh sửa: Có tùy chọn nào không yêu cầu Hộp công cụ song song không?

+0

Bạn đang cố gắng song song mã MATLAB nào? – You

+2

@rlbisbe: API MEX không an toàn cho luồng: http://www.mathworks.com/support/solutions/en/data/1-V3B5T/index.html?solution = 1-V3B5T – Amro

Trả lời

6

Bạn chỉ có thể gọi các chức năng mx * và mex * từ chuỗi chính MATLAB. Bạn có thể viết các tệp MEX đa luồng cung cấp các tệp này làm công việc của họ ở cấp dưới giao diện mx. Nếu bạn muốn có nhiều trình thông dịch MATLAB, bạn cần nhiều quy trình MATLAB. Một cách là thông qua Hộp công cụ tính toán song song như được chỉ ra bởi @You. Điều này cung cấp cho bạn các vòng PARFORSPMD để chạy đồng thời.

+0

Và nếu không có Hộp công cụ tính toán song song sẽ có bất kỳ tùy chọn nào? –

+1

@rlbisbe: đây là một ví dụ về mã song song sử dụng OpenMP (miễn là bạn không gọi hàm MEX API từ các chủ đề được sinh ra): http://www.walkingrandomly.com/?p=1795 (cũng xem các nhận xét cho các giải pháp thay thế được đề xuất cho PCT) – Amro

3

Có thể bạn nên sử dụng các tính năng đa luồng được tích hợp sẵn của MATLAB như parfor. Trong thực tế, nhiều hàm MATLAB đã đa luồng (bao gồm các phép toán ma trận), vì vậy không cần bạn phải tự song song mọi thứ ngoài việc thay thế for bằng parfor. (Nói chung, while các vòng không thể được so sánh.)

+2

Parfor yêu cầu hộp công cụ song song Matlab, và tôi không có nó trên giấy phép Matlab của tôi –

1

Tùy chọn tốt nhất của bạn là parfor. nếu bạn là sinh viên, bạn có thể nhận được hộp công cụ song song khá rẻ. thậm chí giá đầy đủ cũng không nhiều nếu bạn nghiêm túc về hiệu suất. Mã của bạn ở trên sẽ dễ xảy ra lỗi và khó kiểm tra. sử dụng parfor trực quan và sạch sẽ.

+2

Câu trả lời của bạn khác với câu trả lời của Bạn được đăng 5 giờ trước đó như thế nào? Hãy làm cho câu trả lời của bạn đáng kể. Nếu tất cả những gì bạn nói là hộp công cụ song song là giá rẻ, tốt nhất nếu được viết dưới dạng nhận xét trong câu trả lời của Bạn. – abcd

+0

lol, quả thật vậy, nó không khác nhiều so với câu trả lời của Bạn hoặc Edric. Cảm ơn bạn đã chỉ ra điều đó. –

1

Tôi ngạc nhiên khi mọi người đang thúc đẩy parfor. Tôi sẽ khuyến khích bạn ít nhất là suy nghĩ xem liệu bạn có thể thiết kế thuật toán của bạn để được gọi từ Matlab và chạy các phần quan trọng ở mức thấp từ đa luồng C/C++ mà không gọi lại cho mex. Điều này nói chung là có thể. Đặc biệt nếu bạn sử dụng Matlab profiler hoặc công cụ tương tự để tìm ra các bước phân tích của bạn là nút cổ chai, thì bạn có thể viết chỉ 1 hoặc 2 bước trong đa luồng C.

Một cách khác để đi là viết song song trong Java, đó là dễ dàng hơn để làm việc với từ Matlab.

Các tùy chọn khác mà bạn có thể muốn kiểm tra bao gồm multicore submission on Matlab Central hoặc MatlabMPI library. Cả hai đều là một kludgy nhỏ và được thiết kế cho sự song song giữa các tiến trình (bạn phải chạy nhiều trường hợp của Matlab), vì vậy không tốt cho việc xử lý song song rất chi tiết, phức tạp. Nhưng chỉ đơn giản là phá vỡ một công việc thành 4 hoặc 8 hoặc 16 phần họ sẽ nhận được công việc làm, và ít nhất multicore có hỗ trợ cộng đồng hợp lý. Tôi chưa thử MatlabMPI, nhưng có vẻ đầy hứa hẹn. Là một phần thưởng, chúng sẽ hoạt động trên nhiều máy mặc dù chúng có thể sẽ yêu cầu một hệ thống tập tin mạng chia sẻ.