public Queues() { localQueues = new WorkStealingQueue <Task> [AssignmentMain.TotalNumberOfProcessors()]; for (int i = 0; i < AssignmentMain.TotalNumberOfProcessors(); i++) { localQueues[i] = new WorkStealingQueue <Task>(); } }
public Processor(int id, Queues queue) { id_ = id; iteration = 0; localQueue = queue.localQueues[id_]; allProcQueues = queue; totalProcs = AssignmentMain.TotalNumberOfProcessors(); rand = new Random(); }
// main thread function // initially processor 0 has 1 task public void Run() { int procToStealFrom = 0; int MaxTasks = 0; Task localTask = null; while (!AssignmentMain.IsDone()) { if (localQueue.Count > 0) { bool Success = localQueue.LocalPop(ref localTask); if (Success) { localTask.Execute(this); //iteration++; } } else { // Find the processor with the most tasks and try to steal from them for (int i = 0; i < totalProcs; i++) { if (i != id_) { if (allProcQueues.localQueues[i].Count > MaxTasks) { MaxTasks = allProcQueues.localQueues[i].Count; procToStealFrom = i; } } } // Try to steal from a random processor. /*for (int i = 0; i < totalProcs; i++) * { * procToStealFrom = rand.Next(totalProcs); * * if (totalProcs != id_) * { * break; * } * }*/ // Execute the task immediately after a sucessful steal bool Success = allProcQueues.localQueues[procToStealFrom].TrySteal(ref localTask, 1); if (Success) { localTask.Execute(this); } } } }