private void DoJob(FeedJob job) { if (job != null) { job.DoJob(); } }
// Metodo que crea todos los trabajos de las capas private void CreateJobs() { // Recorre todas las capas de la red for (int i = 0; i < net.numLayers; i++) { int numNeurons = net.layers[i].numNeurons; activations[i] = new float[numNeurons]; // Escoge en input adecuado y outpud donde se va guardar float[] inputL; float[] outputL; if (i == 0) { inputL = input; } else { inputL = activations[i - 1]; } outputL = activations[i]; // Checa como se van a distribuir el trabajo en los hilos int load = (int)Math.Floor((double)numNeurons / numWorkers); // Si el load promedio es menor que el load minimo, se pone el load minimo // esto va a causar que no todos los workers hagan algo if (load < minWorkLoad) { load = minWorkLoad; } // Espicifica los indices que cada worker va a trabajar en int start; int end = 0; int jobsCreated = 0; // Crea los jobs, conforme el load actual y el numero de neuronas pendientes while (jobsCreated < numWorkers && numNeurons > 0) { jobsCreated++; start = end; // Si es el ultimo job asegura que se agrege todo el trabajo necesario if (jobsCreated == numWorkers) { end += numNeurons; numNeurons = 0; } else { end += load; numNeurons -= load; } var job = new FeedJob(i, net.layers[i], inputL, outputL, start, end); dueJobs.Enqueue(job); // Debugging //System.Console.WriteLine("Job created, starts: " + start + " ends: " + end); } } }