Skip to content

Commit

Permalink
Made DistanceMachine use openmp
Browse files Browse the repository at this point in the history
  • Loading branch information
lisitsyn committed Jul 8, 2012
1 parent 15203a3 commit 6cc5b15
Show file tree
Hide file tree
Showing 2 changed files with 12 additions and 163 deletions.
161 changes: 12 additions & 149 deletions src/shogun/machine/DistanceMachine.cpp
Expand Up @@ -11,19 +11,9 @@
#include <shogun/machine/DistanceMachine.h>
#include <shogun/base/Parameter.h>

using namespace shogun;
#include <omp.h>

#ifndef DOXYGEN_SHOULD_SKIP_THIS
struct D_THREAD_PARAM
{
CDistance* d;
float64_t* r;
int32_t idx_r_start;
int32_t idx_start;
int32_t idx_stop;
int32_t idx_comp;
};
#endif // DOXYGEN_SHOULD_SKIP_THIS
using namespace shogun;

CDistanceMachine::CDistanceMachine()
: CMachine()
Expand Down Expand Up @@ -55,59 +45,12 @@ void CDistanceMachine::distances_lhs(float64_t* result,int32_t idx_a1,int32_t id

ASSERT(result);

if (num_threads < 2)
{
D_THREAD_PARAM param;
param.d=distance;
param.r=result;
param.idx_r_start=idx_a1;
param.idx_start=idx_a1;
param.idx_stop=idx_a2+1;
param.idx_comp=idx_b;

run_distance_thread_lhs((void*) &param);
}
#ifdef HAVE_PTHREAD
else
{
pthread_t* threads = SG_MALLOC(pthread_t, num_threads-1);
D_THREAD_PARAM* params = SG_MALLOC(D_THREAD_PARAM, num_threads);
int32_t num_vec=idx_a2-idx_a1+1;
int32_t step= num_vec/num_threads;
int32_t t;

pthread_attr_t attr;
pthread_attr_init(&attr);
pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE);

for (t=0; t<num_threads-1; t++)
{
params[t].d = distance;
params[t].r = result;
params[t].idx_r_start=t*step;
params[t].idx_start = (t*step)+idx_a1;
params[t].idx_stop = ((t+1)*step)+idx_a1;
params[t].idx_comp=idx_b;

pthread_create(&threads[t], &attr, CDistanceMachine::run_distance_thread_lhs, (void*)&params[t]);
}
params[t].d = distance;
params[t].r = result;
params[t].idx_r_start=t*step;
params[t].idx_start = (t*step)+idx_a1;
params[t].idx_stop = idx_a2+1;
params[t].idx_comp=idx_b;
int32_t i;
#pragma omp parallel shared(result) private(i)
#pragma omp for schedule(dynamic) nowait
for (i=idx_a1; i<idx_a2+1; i++)
result[i] = distance->distance(i,idx_b);

run_distance_thread_lhs(&params[t]);

for (t=0; t<num_threads-1; t++)
pthread_join(threads[t], NULL);

pthread_attr_destroy(&attr);
SG_FREE(params);
SG_FREE(threads);
}
#endif
}

void CDistanceMachine::distances_rhs(float64_t* result,int32_t idx_b1,int32_t idx_b2,int32_t idx_a)
Expand All @@ -117,91 +60,11 @@ void CDistanceMachine::distances_rhs(float64_t* result,int32_t idx_b1,int32_t id

ASSERT(result);

if (num_threads < 2)
{
D_THREAD_PARAM param;
param.d=distance;
param.r=result;
param.idx_r_start=idx_b1;
param.idx_start=idx_b1;
param.idx_stop=idx_b2+1;
param.idx_comp=idx_a;

run_distance_thread_rhs((void*) &param);
}
#ifndef WIN32
else
{
pthread_t* threads = SG_MALLOC(pthread_t, num_threads-1);
D_THREAD_PARAM* params = SG_MALLOC(D_THREAD_PARAM, num_threads);
int32_t num_vec=idx_b2-idx_b1+1;
int32_t step= num_vec/num_threads;
int32_t t;

pthread_attr_t attr;
pthread_attr_init(&attr);
pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE);

for (t=0; t<num_threads-1; t++)
{
params[t].d = distance;
params[t].r = result;
params[t].idx_r_start=t*step;
params[t].idx_start = (t*step)+idx_b1;
params[t].idx_stop = ((t+1)*step)+idx_b1;
params[t].idx_comp=idx_a;

pthread_create(&threads[t], &attr, CDistanceMachine::run_distance_thread_rhs, (void*)&params[t]);
}
params[t].d = distance;
params[t].r = result;
params[t].idx_r_start=t*step;
params[t].idx_start = (t*step)+idx_b1;
params[t].idx_stop = idx_b2+1;
params[t].idx_comp=idx_a;

run_distance_thread_rhs(&params[t]);

for (t=0; t<num_threads-1; t++)
pthread_join(threads[t], NULL);

pthread_attr_destroy(&attr);
SG_FREE(params);
SG_FREE(threads);
}
#endif
}

void* CDistanceMachine::run_distance_thread_lhs(void* p)
{
D_THREAD_PARAM* params= (D_THREAD_PARAM*) p;
CDistance* distance=params->d;
float64_t* res=params->r;
int32_t idx_res_start=params->idx_r_start;
int32_t idx_act=params->idx_start;
int32_t idx_stop=params->idx_stop;
int32_t idx_c=params->idx_comp;

for (int32_t i=idx_res_start; idx_act<idx_stop; i++,idx_act++)
res[i] =distance->distance(idx_act,idx_c);

return NULL;
}

void* CDistanceMachine::run_distance_thread_rhs(void* p)
{
D_THREAD_PARAM* params= (D_THREAD_PARAM*) p;
CDistance* distance=params->d;
float64_t* res=params->r;
int32_t idx_res_start=params->idx_r_start;
int32_t idx_act=params->idx_start;
int32_t idx_stop=params->idx_stop;
int32_t idx_c=params->idx_comp;

for (int32_t i=idx_res_start; idx_act<idx_stop; i++,idx_act++)
res[i] =distance->distance(idx_c,idx_act);

return NULL;
int32_t i;
#pragma omp parallel shared(result) private(i)
#pragma omp for schedule(dynamic) nowait
for (i=idx_b1; i<idx_b2+1; i++)
result[i] = distance->distance(idx_a,i);
}

CMulticlassLabels* CDistanceMachine::apply_multiclass(CFeatures* data)
Expand Down
14 changes: 0 additions & 14 deletions src/shogun/machine/DistanceMachine.h
Expand Up @@ -118,20 +118,6 @@ class CDistanceMachine : public CMachine
get_name());
}

/**
* pthread function for compute distance values
*
* @param p thread parameter
*/
static void* run_distance_thread_lhs(void* p);

/**
* pthread function for compute distance values
*
* @param p thread parameter
*/
static void* run_distance_thread_rhs(void* p);

private:
void init();

Expand Down

0 comments on commit 6cc5b15

Please sign in to comment.