Thanks a lot for the corrections. However, it's still executing just one thread, I don't see two hello messages.
I'm using Octave 3.2.4 and gcc 4.1.1 Regards Jaroslav Hajek wrote: > 2010/4/15 "Miguel A. Vázquez" <mavazq...@cttc.es>: > >> Hello all, >> >> I am trying to implement some code in OpenMP under Octave, but I have >> some problems. >> >> #include <omp.h> >> #include <octave/oct.h> >> >> DEFUN_DLD (pmean, args, , "Calculates then mean in parallel") >> { >> int nargin = args.length (); >> >> Matrix m (1,1); >> >> >> int tid,nthreads; >> omp_set_num_threads(2); >> #pragma omp parallel private( nthreads, tid) >> tid = omp_get_thread_num(); >> nthreads = omp_get_num_threads(); >> octave_stdout << "Thread "<< tid << " of " << nthreads << " >> threads \n."; >> if (nargin != 1) >> print_usage (); >> else >> { >> NDArray A = args(0).array_value (); >> >> >> >> #pragma omp parallel for reduction(+:m) >> for (octave_idx_type i = 0; i < A.nelem (); i++){ >> m = m + A.elem (i)/A.nelem (); >> } >> >> return octave_value (m); >> >> } >> >> } >> >> This code is supposed to calculate a mean of an Octave matrix in >> parallel: some iterations of the for will be done by different threads. >> >> I set the number of threads to 2 (omp_set_num_threads(2)). I compiled >> and linked it nicely but, unfortunatelly, when I executed it: >> >> octave:1> pmean([10 0 5]) >> Thread 0 of 1 threads >> .ans = 5 >> >> One thread is executed instead. I don't really know how to solve this >> problem, even don't know where I have to look for. Does anyone of you >> have treated this problem before? >> >> Thank you in advance, >> >> Miguel >> >> > > I think you lack some basic OpenMP knowledge. In C++, omp parallel > applies only to the next statement or block, so the way you've written > it it doesn't make much sense. Use omp critical for I/O to make it > atomic. > You didn't initialize m; besides, you must use a primitive type for > reduction clause. Also be aware that each DEFUN must return a value or > throw an exception, just like every C++ function. > > This version works for me: > > DEFUN_DLD (pmean, args, , "Calculates then mean in parallel") > { > int nargin = args.length (); > octave_value retval; > > omp_set_num_threads(2); > > #pragma omp parallel > { > int tid,nthreads; > tid = omp_get_thread_num(); > nthreads = omp_get_num_threads(); > // WARNING: I/O not thread safe > #pragma omp critical > octave_stdout << "Thread "<< tid << " of " << nthreads << " threads. > \n"; > } > > if (nargin != 1) > print_usage (); > else > { > const NDArray A = args(0).array_value (); > > double m = 0; > #pragma omp parallel for reduction(+:m) > for (octave_idx_type i = 0; i < A.nelem (); i++) > m += A.elem (i) / A.nelem (); > > retval = m; > } > > return retval; > } > > hth > > ------------------------------------------------------------------------------ Download Intel® Parallel Studio Eval Try the new software tools for yourself. Speed compiling, find bugs proactively, and fine-tune applications for parallel performance. See why Intel Parallel Studio got high marks during beta. http://p.sf.net/sfu/intel-sw-dev _______________________________________________ Octave-dev mailing list Octave-dev@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/octave-dev