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&#174; 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

Reply via email to