| 78 | } |
| 79 | |
| 80 | int ThreadQueues::distribute_no_setup(ThreadJob job, int n_items, int base, |
| 81 | int granularity, const vector<void*>* supplies) |
| 82 | { |
| 83 | #ifdef VERBOSE_QUEUES |
| 84 | cerr << "Distribute " << job.type << " among " << available.size() << endl; |
| 85 | #endif |
| 86 | |
| 87 | int n_per_thread = get_n_per_thread(n_items, granularity); |
| 88 | size_t n_threads = get_n_threads(n_items, base, granularity); |
| 89 | |
| 90 | if (OnlineOptions::singleton.has_option("debug_sync")) |
| 91 | cerr << n_per_thread << " per thread" << ", " << n_threads << " threads" |
| 92 | << ", " << available.size() << " available" << endl; |
| 93 | |
| 94 | if (n_items and (n_per_thread == 0 or base + n_per_thread > n_items)) |
| 95 | { |
| 96 | assert(n_threads == 0); |
| 97 | available.clear(); |
| 98 | return base; |
| 99 | } |
| 100 | |
| 101 | for (size_t i = 0; i < available.size(); i++) |
| 102 | { |
| 103 | if (base + (i + 1) * n_per_thread > size_t(n_items)) |
| 104 | { |
| 105 | assert(i); |
| 106 | available.resize(i); |
| 107 | assert(n_threads == i); |
| 108 | return base + i * n_per_thread; |
| 109 | } |
| 110 | if (supplies) |
| 111 | job.supply = supplies->at(i); |
| 112 | job.begin = base + i * n_per_thread; |
| 113 | job.end = base + (i + 1) * n_per_thread; |
| 114 | at(available[i])->schedule(job); |
| 115 | } |
| 116 | assert(available.size() == n_threads); |
| 117 | return base + available.size() * n_per_thread; |
| 118 | } |
| 119 | |
| 120 | void ThreadQueues::sync() |
| 121 | { |
no test coverage detected