diff options
author | Matthias P. Braendli <matthias.braendli@mpb.li> | 2017-08-17 15:25:47 +0200 |
---|---|---|
committer | Matthias P. Braendli <matthias.braendli@mpb.li> | 2017-08-17 15:33:19 +0200 |
commit | a82f72eb04d4b5766f12d94febdf2f989ca7210a (patch) | |
tree | fc43378dbb7ae7c2e16e81814fdbe9bfcff38a1f /src/MemlessPoly.cpp | |
parent | 15651ab0020ba594bff02491b3d2b6472f5e4fda (diff) | |
download | dabmod-a82f72eb04d4b5766f12d94febdf2f989ca7210a.tar.gz dabmod-a82f72eb04d4b5766f12d94febdf2f989ca7210a.tar.bz2 dabmod-a82f72eb04d4b5766f12d94febdf2f989ca7210a.zip |
Add number of threads setting for MemlessPoly
Diffstat (limited to 'src/MemlessPoly.cpp')
-rw-r--r-- | src/MemlessPoly.cpp | 29 |
1 files changed, 18 insertions, 11 deletions
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<complexf, 8> 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<std::mutex> 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<future<void> > 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); } } |