Ejemplo n.º 1
0
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;
}
Ejemplo n.º 2
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;
}