| 70 | |
| 71 | |
| 72 | __global__ void RunParallel (int num, |
| 73 | const nvstd::function<void(int nr, int size)> & func) |
| 74 | { |
| 75 | TPToken ptoken(*queue); |
| 76 | TCToken ctoken(*queue); |
| 77 | |
| 78 | // std::atomic<int> cnt{0}; |
| 79 | int cnt = 0; |
| 80 | |
| 81 | for (size_t i = 0; i < num; i++) |
| 82 | { |
| 83 | Task task; |
| 84 | task.nr = i; |
| 85 | task.size = num; |
| 86 | task.pfunc = &func; |
| 87 | task.cnt = &cnt; |
| 88 | queue->enqueue(ptoken, task); |
| 89 | } |
| 90 | |
| 91 | /* |
| 92 | // faster with bulk enqueue (error with gcc-Release) |
| 93 | Task firsttask; |
| 94 | firsttask.nr = 0; |
| 95 | firsttask.size = num; |
| 96 | firsttask.pfunc=&func; |
| 97 | firsttask.cnt = &cnt; |
| 98 | queue.enqueue_bulk (ptoken, firsttask, num); |
| 99 | */ |
| 100 | |
| 101 | while (cnt < num) |
| 102 | { |
| 103 | Task task; |
| 104 | if(!queue->try_dequeue_from_producer(ptoken, task)) |
| 105 | if(!queue->try_dequeue(ctoken, task)) |
| 106 | continue; |
| 107 | |
| 108 | (*task.pfunc)(task.nr, task.size); |
| 109 | // (*task.cnt)++; |
| 110 | atomicAdd(task.cnt, 1); |
| 111 | |
| 112 | } |
| 113 | } |
| 114 | |
| 115 | |
| 116 | // #ifdef __CUDACC__ |
nothing calls this directly
no test coverage detected