ciao.
Sto leggendo per divertirmi la libreria threading buildinhg block ,per la programmazione multicore.
Si basa tutta su template e function object.
questo function object serve per trovare il valore minimo di un array.
[code]
class MinIndexFoo {
const float *const my_a;
public:
float value_of_min;
long index_of_min;
void operator( )( const blocked_range<size_t>& r ) {
const float *a = my_a;
for( size_t i=r.begin(); i!=r.end( ); ++i ) {
float value = Foo(a[i]);
if( value<value_of_min ) {
value_of_min = value;
index_of_min = i;
}
}
}
MinIndexFoo( MinIndexFoo& x, split ) :my_a(x.my_a),value_of_min(FLT_MAX), index_of_min(-1)
{}
void join( const SumFoo& y ) {
if( y.value_of_min<value_of_min ) {
value_of_min = y.value_of_min;
index_of_min = y.index_of_min;
}
}
MinIndexFoo( const float a[] ) :my_a(a),value_of_min(FLT_MAX),index_of_min(-1)
{
}
};
//funzione chiamante
long ParallelMinIndexFoo( float a[], size_t n ) {
MinIndexFoo mif(a);
parallel_reduce(blocked_range<size_t>(0,n,YouPickA GrainSize), mif );
return mif.index_of_min;
}
[code]
Questo è un function object che ritorna l'indice con il valore minimo di un array
sum foo è un altro function object cosi:
e ritorna la somma di un array.codice:class SumFoo { float* my_a; public: float sum; void operator( )( const blocked_range<size_t>& r ) { float *a = my_a; for( size_t i=r.begin(); i!=r.end( ); ++i ) sum += Foo(a[i]); } SumFoo( SumFoo& x, split ) : my_a(x.my_a), sum(0) {} void join( const SumFoo& y ) {sum+=y.sum;} SumFoo(float a[] ) :my_a(a), sum(0){} };
non riesco a capire queste funzioni:
MinIndexFoo( const float a[] ) :my_a(a),value_of_min(FLT_MAX),index_of_min(-1)
cosa concatenano?
altre funzioni?
e com nel function object sum e nel minimo vengono fatti i join tra i valori , in modo da restituire il valore di insieme dei vari blocchi inviati.
e a cosa serve la funzione join dato che non è mai chiamata,
grazie.