diff --git a/src/shogun/statistical_testing/MMD.cpp b/src/shogun/statistical_testing/MMD.cpp index 217ec5ed7fa..d6025a85c6d 100644 --- a/src/shogun/statistical_testing/MMD.cpp +++ b/src/shogun/statistical_testing/MMD.cpp @@ -169,11 +169,11 @@ void CMMD::Self::compute_jobs(ComputationManager& cm) const { if (use_gpu) { - cm.use_gpu().compute(); + cm.use_gpu().compute_data_parallel_jobs(); } else { - cm.use_cpu().compute(); + cm.use_cpu().compute_data_parallel_jobs(); } } @@ -207,8 +207,8 @@ std::pair CMMD::Self::compute_statistic_variance() compute_kernel(cm, blocks, kernel); compute_jobs(cm); - auto mmds = cm.next_result(); - auto vars = cm.next_result(); + auto mmds = cm.result(0); + auto vars = cm.result(1); for (size_t i = 0; i < mmds.size(); ++i) { @@ -284,7 +284,7 @@ SGVector CMMD::Self::sample_null() for (auto j = 0; j < num_null_samples; ++j) { compute_jobs(cm); - auto mmds = cm.next_result(); + auto mmds = cm.result(0); for (size_t i = 0; i < mmds.size(); ++i) { auto delta = mmds[i] - statistic[j]; diff --git a/src/shogun/statistical_testing/QuadraticTimeMMD.cpp b/src/shogun/statistical_testing/QuadraticTimeMMD.cpp index e55446d0e43..e22dc20807a 100644 --- a/src/shogun/statistical_testing/QuadraticTimeMMD.cpp +++ b/src/shogun/statistical_testing/QuadraticTimeMMD.cpp @@ -127,9 +127,9 @@ void CQuadraticTimeMMD::Self::compute_jobs(ComputationManager& cm) const { SG_SDEBUG("Entering\n"); if (owner.use_gpu()) - cm.use_gpu().compute(); + cm.use_gpu().compute_task_parallel_jobs(); else - cm.use_cpu().compute(); + cm.use_cpu().compute_task_parallel_jobs(); SG_SDEBUG("Leaving\n"); } @@ -188,8 +188,8 @@ std::pair CQuadraticTimeMMD::Self::compute_statistic_varia cm.data(0)=kernel_matrix; compute_jobs(cm); - auto mmd=cm.next_result(); - auto var=cm.next_result(); + auto mmd=cm.result(0); + auto var=cm.result(1); float64_t statistic=mmd[0]; float64_t variance=var[0]; cm.done(); @@ -211,14 +211,17 @@ SGVector CQuadraticTimeMMD::Self::sample_null() ComputationManager cm; create_computation_jobs(); - cm.enqueue_job(permutation_job); cm.num_data(1); cm.data(0)=kernel_matrix; + for (auto i=0; i& ComputationManager::data(index_t i) { - return kernel_matrices[i]; + return data_array[i]; } void ComputationManager::enqueue_job(std::function)> job) { - jobq.push_back(job); + job_array.push_back(job); } -void ComputationManager::compute() +void ComputationManager::compute_data_parallel_jobs() { - for(auto job = jobq.begin(); job != jobq.end(); ++job) + result_array.resize(job_array.size()); + for(size_t j=0; j results; + const auto& compute_job=job_array[j]; + std::vector current_job_results(data_array.size()); if (gpu) { - // TODO results = operation.compute_using_gpu(kernel_matrices); + // TODO current_job_results = compute_job.compute_using_gpu(data_array); } else { - results.resize(kernel_matrices.size()); #pragma omp parallel for - for (size_t i = 0; i < kernel_matrices.size(); ++i) - { - results[i] = operation(kernel_matrices[i]); - } + for (size_t i=0; i current_job_results(data_array.size()); + if (gpu) + { + // TODO current_job_results = compute_job.compute_using_gpu(data_array); + } + else + { + for (size_t i=0; i ComputationManager::next_result() +std::vector& ComputationManager::result(index_t i) { - std::vector result; - if (!resultq.empty()) - { - result = resultq.front(); - resultq.pop(); - } - return result; + return result_array[i]; } ComputationManager& ComputationManager::use_gpu() { - gpu = true; + gpu=true; return *this; } ComputationManager& ComputationManager::use_cpu() { - gpu = false; + gpu=false; return *this; } diff --git a/src/shogun/statistical_testing/internals/ComputationManager.h b/src/shogun/statistical_testing/internals/ComputationManager.h index 5eccec07190..945c5f7a753 100644 --- a/src/shogun/statistical_testing/internals/ComputationManager.h +++ b/src/shogun/statistical_testing/internals/ComputationManager.h @@ -20,7 +20,6 @@ #define COMPUTATION_MANAGER_H__ #include -#include #include #include @@ -42,19 +41,18 @@ class ComputationManager SGMatrix& data(index_t i); void enqueue_job(std::function)> job); + void compute_data_parallel_jobs(); + void compute_task_parallel_jobs(); void done(); - - void compute(); - - std::vector next_result(); + std::vector& result(index_t i); ComputationManager& use_cpu(); ComputationManager& use_gpu(); private: bool gpu; - std::vector> kernel_matrices; - std::vector)>> jobq; - std::queue> resultq; + std::vector> data_array; + std::vector)>> job_array; + std::vector> result_array; }; } // namespace internal