diff --git a/include/armadillo_bits/glue_powext_meat.hpp b/include/armadillo_bits/glue_powext_meat.hpp index ad2177c4..8b06e0bd 100644 --- a/include/armadillo_bits/glue_powext_meat.hpp +++ b/include/armadillo_bits/glue_powext_meat.hpp @@ -229,8 +229,6 @@ glue_powext_cx::apply(Mat& out, const mtGlue tmp; @@ -264,9 +262,26 @@ glue_powext_cx::apply(Mat< std::complex >& out, const Mat< std::complex >& const eT* A_mem = A.memptr(); const T* B_mem = B.memptr(); - for(uword i=0; i::eval(N) ) { - out_mem[i] = std::pow(A_mem[i], B_mem[i]); + #if defined(ARMA_USE_OPENMP) + { + const int n_threads = mp_thread_limit::get(); + + #pragma omp parallel for schedule(static) num_threads(n_threads) + for(uword i=0; i::eval(A.n_elem) ) { - const eT* A_mem = A.colptr(i); - eT* out_mem = out.colptr(i); - - for(uword row=0; row < A_n_rows; ++row) + #if defined(ARMA_USE_OPENMP) { - out_mem[row] = std::pow(A_mem[row], B_mem[row]); + const int n_threads = int( (std::min)(uword(mp_thread_limit::get()), A_n_cols) ); + + #pragma omp parallel for schedule(static) num_threads(n_threads) + for(uword i=0; i < A_n_cols; ++i) + { + const eT* A_mem = A.colptr(i); + eT* out_mem = out.colptr(i); + + for(uword row=0; row < A_n_rows; ++row) + { + out_mem[row] = std::pow(A_mem[row], B_mem[row]); + } + } + } + #endif + } + else + { + for(uword i=0; i < A_n_cols; ++i) + { + const eT* A_mem = A.colptr(i); + eT* out_mem = out.colptr(i); + + for(uword row=0; row < A_n_rows; ++row) + { + out_mem[row] = std::pow(A_mem[row], B_mem[row]); + } } } } if(mode == 1) // each row { - for(uword i=0; i < A_n_cols; ++i) + if( arma_config::openmp && mp_gate::eval(A.n_elem) ) { - const eT* A_mem = A.colptr(i); - eT* out_mem = out.colptr(i); - - const eT B_val = B_mem[i]; - - for(uword row=0; row < A_n_rows; ++row) + #if defined(ARMA_USE_OPENMP) { - out_mem[row] = std::pow(A_mem[row], B_val); + const int n_threads = int( (std::min)(uword(mp_thread_limit::get()), A_n_cols) ); + + #pragma omp parallel for schedule(static) num_threads(n_threads) + for(uword i=0; i < A_n_cols; ++i) + { + const eT* A_mem = A.colptr(i); + eT* out_mem = out.colptr(i); + + const eT B_val = B_mem[i]; + + for(uword row=0; row < A_n_rows; ++row) + { + out_mem[row] = std::pow(A_mem[row], B_val); + } + } + } + #endif + } + else + { + for(uword i=0; i < A_n_cols; ++i) + { + const eT* A_mem = A.colptr(i); + eT* out_mem = out.colptr(i); + + const eT B_val = B_mem[i]; + + for(uword row=0; row < A_n_rows; ++row) + { + out_mem[row] = std::pow(A_mem[row], B_val); + } } } }