2011-11-07 11 views
8

Tôi mới sử dụng OpenMP. Tôi có mã sau đây biên dịch tốt bằng cách sử dụng Matlab mex cấu hình với MSVS2010. Máy tính có 8 bộ vi xử lý có sẵn (mà tôi đã kiểm tra bằng cách sử dụng matlabpool).Tại sao OpenMP trong một tệp mex chỉ tạo ra 1 chuỗi?

#include "mex.h" 
#include <omp.h> 

typedef unsigned char uchar; 
typedef unsigned int uint; 
//Takes a uint8 input array and uint32 index array and preallocated uint8 array the same 
//size as the first one and copies the data over using the indexed mapping 
void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray*prhs[]) 
{ 
    uint N = mxGetN(prhs[0]); 
    mexPrintf("n=%i\n", N); mexEvalString("drawnow"); 
    uchar *input = (uchar*)mxGetData(prhs[0]); 
    uint *index = (uint*)mxGetData(prhs[1]); 
    uchar *output = (uchar*)mxGetData(prhs[2]); 

    uint nThreads, tid; 
#pragma omp parallel private(tid) shared(input, index, output, N, nThreads) num_threads(8) 
    { 
     tid = omp_get_thread_num(); 

     if (tid==0) { 
      nThreads = omp_get_num_threads(); 

     } 

     for (int i=tid*N/nThreads;i<tid*N/nThreads+N/nThreads;i++){ 
      output[i]=input[index[i]]; 
     } 
    } 
    mexPrintf("nThreads = %i\n",nThreads);mexEvalString("drawnow"); 
} 

Kết quả tôi nhận được là

n=600000000 
nThreads = 1 

Tại sao chỉ có một thread được tạo ra mặc dù tôi yêu cầu 8?

Trả lời

10

Sigh. Điển hình, dành hàng giờ cố gắng và thất bại và sau đó tìm câu trả lời 5 phút sau khi đăng lên SO.

Các tập tin cần được mexed với sự hỗ trợ OpenMP

mex mexIndexedCopy.cpp COMPFLAGS="/openmp $COMPFLAGS" 
+0

Tôi biết rằng cảm giác, bro. – CptSupermrkt

+0

tùy chọn tương đương dưới Linux với gcc làm trình biên dịch là gì? '-fopenmp'? – linello

+1

@linello Có. Tôi thực sự chỉ lãng phí một vài giờ mặc dù vì tôi đã không đi qua '-fopenmp' một cách chính xác. Bạn cần truyền nó cho cả trình biên dịch và trình liên kết. 'mex CXXFLAGS =" \ $ CXXFLAGS -fopenmp "LDFLAGS =" \ $ LDFLAGS -fopenmp "[tùy chọn khác] ' cho C++. (Đối với C, sử dụng 'CFLAGS' thay cho' CXXFLAGS'; cho cả C và C++, sử dụng cả hai.) –