From ec6608eb119bd50f666071aa90eec2a42471b7e2 Mon Sep 17 00:00:00 2001 From: Shangtong Zhang Date: Thu, 3 Aug 2017 22:32:02 -0600 Subject: [PATCH] Check HAS_OPENMP --- .../async_learning_impl.hpp | 45 +++++++++++++------ .../worker/one_step_q_learning_worker.hpp | 14 ++++-- src/mlpack/tests/async_learning_test.cpp | 4 +- 3 files changed, 44 insertions(+), 19 deletions(-) diff --git a/src/mlpack/methods/reinforcement_learning/async_learning_impl.hpp b/src/mlpack/methods/reinforcement_learning/async_learning_impl.hpp index 3a007fc461..2cbb1c5c40 100644 --- a/src/mlpack/methods/reinforcement_learning/async_learning_impl.hpp +++ b/src/mlpack/methods/reinforcement_learning/async_learning_impl.hpp @@ -86,8 +86,10 @@ void AsyncLearning< tasks.push(i); // Synchronization for get/put task. - omp_lock_t tasksLock; - omp_init_lock(&tasksLock); + #ifdef HAS_OPENMP + omp_lock_t tasksLock; + omp_init_lock(&tasksLock); + #endif /** * Compute the number of threads for the for-loop. In general, we should use @@ -95,15 +97,21 @@ void AsyncLearning< * compiler. We can switch to OpenMP task once MSVC supports OpenMP 3.0. */ size_t numThreads = 0; - #pragma omp parallel reduction(+:numThreads) + #ifdef HAS_OPENMP + #pragma omp parallel reduction(+:numThreads) + #endif numThreads++; Log::Debug << numThreads << " threads will be used in total." << std::endl; - #pragma omp parallel for shared(stop, workers, tasks, learningNetwork, \ - targetNetwork, totalSteps, policy) + #ifdef HAS_OPENMP + #pragma omp parallel for shared(stop, workers, tasks, learningNetwork, \ + targetNetwork, totalSteps, policy) + #endif for (omp_size_t i = 0; i < numThreads; ++i) { - #pragma omp critical + #ifdef HAS_OPENMP + #pragma omp critical + #endif { Log::Debug << "Thread " << omp_get_thread_num() << " started." << std::endl; @@ -111,14 +119,19 @@ void AsyncLearning< while (!stop) { // Assign task to current thread from queue. - omp_set_lock(&tasksLock); - if (tasks.empty()) { - omp_unset_lock(&tasksLock); - continue; - } + #ifdef HAS_OPENMP + omp_set_lock(&tasksLock); + if (tasks.empty()) + { + omp_unset_lock(&tasksLock); + continue; + } + #endif size_t task = tasks.front(); tasks.pop(); - omp_unset_lock(&tasksLock); + #ifdef HAS_OPENMP + omp_unset_lock(&tasksLock); + #endif // Get corresponding worker. WorkerType& worker = workers[task]; @@ -130,9 +143,13 @@ void AsyncLearning< } // Put task back to queue. - omp_set_lock(&tasksLock); + #ifdef HAS_OPENMP + omp_set_lock(&tasksLock); + #endif tasks.push(task); - omp_unset_lock(&tasksLock); + #ifdef HAS_OPENMP + omp_unset_lock(&tasksLock); + #endif } } diff --git a/src/mlpack/methods/reinforcement_learning/worker/one_step_q_learning_worker.hpp b/src/mlpack/methods/reinforcement_learning/worker/one_step_q_learning_worker.hpp index eaa5ae3e5f..6749fe6d12 100644 --- a/src/mlpack/methods/reinforcement_learning/worker/one_step_q_learning_worker.hpp +++ b/src/mlpack/methods/reinforcement_learning/worker/one_step_q_learning_worker.hpp @@ -64,7 +64,7 @@ class OneStepQLearningWorker void Initialize(NetworkType& learningNetwork) { updater.Initialize(learningNetwork.Parameters().n_rows, - learningNetwork.Parameters().n_cols); + learningNetwork.Parameters().n_cols); // Build local network. network = learningNetwork; } @@ -112,7 +112,9 @@ class OneStepQLearningWorker return false; } - #pragma omp atomic + #ifdef HAS_OPENMP + #pragma omp atomic + #endif totalSteps++; pending[pendingIndex] = std::make_tuple(state, action, reward, nextState); @@ -129,7 +131,9 @@ class OneStepQLearningWorker // Compute the target state-action value. arma::colvec actionValue; - #pragma omp critical + #ifdef HAS_OPENMP + #pragma omp critical + #endif { targetNetwork.Predict( std::get<3>(transition).Encode(), actionValue); @@ -171,7 +175,9 @@ class OneStepQLearningWorker // Update global target network. if (totalSteps % config.TargetNetworkSyncInterval() == 0) { - #pragma omp critical + #ifdef HAS_OPENMP + #pragma omp critical + #endif { targetNetwork = learningNetwork; } } diff --git a/src/mlpack/tests/async_learning_test.cpp b/src/mlpack/tests/async_learning_test.cpp index b210abba4a..c01ed1d9a9 100644 --- a/src/mlpack/tests/async_learning_test.cpp +++ b/src/mlpack/tests/async_learning_test.cpp @@ -38,7 +38,9 @@ BOOST_AUTO_TEST_CASE(OneStepQLearningTest) * This is for the Travis CI server, in your own machine you shuold use more * threads. */ - omp_set_num_threads(1); + #ifdef HAS_OPENMP + omp_set_num_threads(1); + #endif // Set up the network. FFN, GaussianInitialization> model(MeanSquaredError<>(),