| 149 | } |
| 150 | |
| 151 | void CpuDispatchChecker::TaskExecutor::add_task( |
| 152 | const MultiThreadingTask& task, size_t parallelism) { |
| 153 | #if MEGDNN_ENABLE_MULTI_THREADS |
| 154 | if (!m_main_thread_affinity && m_cpu_ids.size() == m_nr_threads) { |
| 155 | m_main_thread_prev_affinity_mask = |
| 156 | set_cpu_affinity({m_cpu_ids[m_nr_threads - 1]}); |
| 157 | m_main_thread_affinity = true; |
| 158 | } |
| 159 | #endif |
| 160 | if (m_nr_threads == 1 || parallelism == 1) { |
| 161 | for (size_t i = 0; i < parallelism; i++) { |
| 162 | task(i, 0); |
| 163 | } |
| 164 | } else { |
| 165 | #if MEGDNN_ENABLE_MULTI_THREADS |
| 166 | m_all_task_iter = parallelism; |
| 167 | m_current_task_iter.exchange(parallelism, std::memory_order_acq_rel); |
| 168 | m_task = task; |
| 169 | |
| 170 | //! Set flag to start thread working |
| 171 | for (uint32_t i = 0; i < m_nr_threads - 1; i++) { |
| 172 | *m_workers_flag[i] = true; |
| 173 | } |
| 174 | int index = -1; |
| 175 | while ((index = m_current_task_iter.fetch_sub(1, std::memory_order_acq_rel)) && |
| 176 | index > 0) { |
| 177 | m_task(static_cast<size_t>(m_all_task_iter - index), m_nr_threads - 1); |
| 178 | } |
| 179 | sync(); |
| 180 | #else |
| 181 | megdnn_throw( |
| 182 | "Try to use multithreading with " |
| 183 | "\'MEGDNN_ENABLE_MULTI_THREADS\' set to 0."); |
| 184 | #endif |
| 185 | } |
| 186 | } |
| 187 | |
| 188 | void CpuDispatchChecker::TaskExecutor::add_task(const Task& task) { |
| 189 | task(); |
no test coverage detected