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);          }      } | 
