int main(int argc, char *argv[]) { uint64_t count = 1048576; int par_fork = 0; unsigned long threads = 1; qtimer_t timer; double total_time = 0.0; CHECK_VERBOSE(); NUMARG(count, "MT_COUNT"); NUMARG(par_fork, "MT_PAR_FORK"); assert(0 != count); #pragma omp parallel #pragma omp single { timer = qtimer_create(); threads = omp_get_num_threads(); if (par_fork) { qtimer_start(timer); #pragma omp parallel for for (uint64_t i = 0; i < count; i++) { #pragma omp task untied null_task(NULL); } } else { qtimer_start(timer); #pragma omp task untied for (uint64_t i = 0; i < count; i++) { #pragma omp task untied null_task(NULL); } } #pragma omp taskwait qtimer_stop(timer); } total_time = qtimer_secs(timer); qtimer_destroy(timer); printf("%lu %lu %f\n", threads, (unsigned long)count, total_time); return 0; }
KSGTaskManager::PtrType KSGTaskManager::NewTask(int taskId,int code,const std::string& content ,KSGDeviceNode* node,TaskPriority pri /*= ptNormal*/,void *arg) { // 当增加一个新的任务时,需要调用 TaskPool 的 singal 函数去唤醒可能已经在等待的线程 // 等待任务的线程在下一次被调度执行时,将检查可用的任务 PtrType null_task((TaskType*)NULL); PtrType ret((TaskType*)NULL); int res; KSG_Task_Queue *queue = NULL; { ACE_GUARD_RETURN(ACE_Thread_Mutex,mon,_s_mutex,null_task); TaskType * task = FindTask(taskId); if(task != NULL) { // 如果任务已经存在, 抛出异常 throw TaskAlreadyExistsException(); } else { queue = node->owner_queue(); if(!queue) throw NullPointerException(); try { ret = _pool.Alloc(taskId,code,content); _tasks.insert(TaskMapType::value_type(ret->GetTaskId() ,ret.get())); //ACE_DEBUG((LM_INFO,"生成指令对象id[%d]",ret->GetTaskId())); ret->SetDeviceNode(node); ret->private_data(arg); // res = 0; switch(pri) { case ptReal: res = queue->insert_task(ret); break; case ptPreempt: // TODO : support preemptive task ACE_DEBUG((LM_DEBUG,"抢占式任务!taskid[%d]",taskId)); res = queue->push_preemptive_task(ret); break; default: case ptNormal: res = queue->push_task(ret); ACE_DEBUG((LM_DEBUG,"队列任务数[%d]",queue->count_of_tasks())); break; } if(res) { ACE_DEBUG((LM_ERROR,"任务加入队列失败!!taskid[%d]",taskId)); return null_task; } } catch(...) { return null_task; } } } std::string key = node->owner_queue()->key_name(); Task_Queue_Pool::instance()->singal_queue(key,queue); return ret; }