//Called after the window and OpenGL are initialized. Called exactly once, before the main loop. void init() { tasks.push_back(new TaskOne()); tasks.push_back(new TaskTwo()); tasks.push_back(new TaskThree()); tasks.push_back(new TaskFour()); tasks.push_back(new BonusTask()); // initialize all our new tasks for (TaskVector::iterator it = tasks.begin(); it != tasks.end(); it++) { ITask* task = (*it); task->InitializeProgram(); task->Initialize(); } currentTaskNumber = 0; ITask* currentTask = tasks[currentTaskNumber]; if (currentTask != NULL) { currentTask->InitializeProgram(); } glCullFace(GL_BACK); // only back faces will be culled, if enabled glClearColor(0.3f, 0.3f, 0.3f, 1.0f); // color for cleaning the screen }
void test_region(int level, int maxLevel, int* threadNums, TaskVector parents){ #pragma omp parallel num_threads(threadNums[level-1]) { TaskVector taskIDs; #ifdef OMPT_DEBUG // Critical section around get_task_id for easier debugging #pragma omp critical #endif for(int i=0; i<=level; i++){ taskIDs.push_back(ompt_get_task_id(i)); } #pragma omp critical { #ifdef OMPT_DEBUG std::cout <<"(Level " << level << ") implicit_task=" << taskIDs[0] << " enclosing_task=" << taskIDs[1] << std::endl; #endif is_task_unique( map_taskID, taskIDs[0], taskIDs[1]); for(int i=1; i<=level; i++){ std::stringstream sMsg; sMsg << "Parent task ID level " << level << " -> " << level - i << " mismatch"; assertEqual(taskIDs[i], parents[parents.size()-i], sMsg.str().c_str()); } } if(level<maxLevel){ // Do not modify outer vector as it is used by other threads! TaskVector newParents = parents; newParents.push_back(taskIDs[0]); test_region(level+1, maxLevel, threadNums, newParents); // Make sure the task ids did not change for(int i=0; i<=level; i++){ std::stringstream sMsg; sMsg << "Task ID level " << level << " -> " << level - i << " changed after nested region"; assertEqual(ompt_get_task_id(i), taskIDs[i], sMsg.str().c_str()); } } } }
void test_parallel(int nested, int outerThreadNum, int middleThreadNum, int innerThreadNum, int singleThreadNum){ std::cout << std::endl << "nested: " << nested << "; outer Threads: " << outerThreadNum << "; middle Threads: " << middleThreadNum << "; inner Threads: " << innerThreadNum << "; single (non-nested) Threads: " << singleThreadNum << std::endl; ompt_task_id_t serial_taskID = ompt_get_task_id(0); #ifdef OMPT_DEBUG std::cout << "(before first region) serial_thread_task_id=" << serial_taskID << std::endl; #endif int threadNums[3]; threadNums[0]=outerThreadNum; threadNums[1]=middleThreadNum; threadNums[2]=innerThreadNum; TaskVector parents; parents.push_back(serial_taskID); test_region(1, (innerThreadNum)?3:2, threadNums, parents); #ifdef OMPT_DEBUG std::cout << std::endl << "(before second region) serial_thread_task_id=" << ompt_get_task_id(0) << std::endl; #endif assertEqual(ompt_get_task_id(0), serial_taskID, "Serial task id changed after region 1"); test_region(1, 1, &singleThreadNum, parents); }