From a82f72eb04d4b5766f12d94febdf2f989ca7210a Mon Sep 17 00:00:00 2001 From: "Matthias P. Braendli" Date: Thu, 17 Aug 2017 15:25:47 +0200 Subject: Add number of threads setting for MemlessPoly --- src/MemlessPoly.cpp | 29 ++++++++++++++++++----------- 1 file changed, 18 insertions(+), 11 deletions(-) (limited to 'src/MemlessPoly.cpp') diff --git a/src/MemlessPoly.cpp b/src/MemlessPoly.cpp index 71ceac3..b0d950c 100644 --- a/src/MemlessPoly.cpp +++ b/src/MemlessPoly.cpp @@ -53,9 +53,10 @@ static const std::array default_coefficients({{ }}); -MemlessPoly::MemlessPoly(const std::string& coefs_file) : +MemlessPoly::MemlessPoly(const std::string& coefs_file, unsigned int num_threads) : PipelinedModCodec(), RemoteControllable("memlesspoly"), + m_num_threads(num_threads), m_coefs(), m_coefs_file(coefs_file), m_coefs_mutex() @@ -63,6 +64,16 @@ MemlessPoly::MemlessPoly(const std::string& coefs_file) : PDEBUG("MemlessPoly::MemlessPoly(%s) @ %p\n", coefs_file.c_str(), this); + if (m_num_threads == 0) { + const unsigned int hw_concurrency = std::thread::hardware_concurrency(); + etiLog.level(info) << "Polynomial Predistorter will use " << + hw_concurrency << " threads (auto detected)"; + } + else { + etiLog.level(info) << "Polynomial Predistorter will use " << + m_num_threads << " threads (set in config file)"; + } + RC_ADD_PARAMETER(ncoefs, "(Read-only) number of coefficients."); RC_ADD_PARAMETER(coeffile, "Filename containing coefficients. When written to, the new file gets automatically loaded."); @@ -156,12 +167,15 @@ int MemlessPoly::internal_process(Buffer* const dataIn, Buffer* dataOut) std::lock_guard lock(m_coefs_mutex); const unsigned int hw_concurrency = std::thread::hardware_concurrency(); - if (hw_concurrency) { - const size_t step = sizeOut / hw_concurrency; + const unsigned int num_threads = + (m_num_threads > 0) ? m_num_threads : hw_concurrency; + + if (num_threads) { + const size_t step = sizeOut / num_threads; vector > flags; size_t start = 0; - for (size_t i = 0; i < hw_concurrency - 1; i++) { + for (size_t i = 0; i < num_threads - 1; i++) { flags.push_back(async(launch::async, apply_coeff, m_coefs, in, start, start + step, out)); @@ -177,13 +191,6 @@ int MemlessPoly::internal_process(Buffer* const dataIn, Buffer* dataOut) } } else { - static bool error_printed = false; - if (not error_printed) { - etiLog.level(warn) << - "Your platform doesn't seem to have hardware concurrency. " - "MemlessPoly will run single-threaded"; - } - // For some reason we don't have hw concurrency. apply_coeff(m_coefs, in, 0, sizeOut, out); } } -- cgit v1.2.3