Editar: Mi tamaño de muestra es demasiado pequeño. Cuando lo ejecuté contra los datos reales en 8 CPUs, vi un aumento de velocidad de 7.2x. No está mal para agregar 4 caracteres a mi código;)Tiempo de ejecución de la colección paralela Scala
Actualmente estoy en el proceso de tratar de "vender" la gestión de los beneficios de usar Scala, especialmente cuando se trata de escalar con CPU. Con ese fin, creé una aplicación de prueba simple que hace un montón de matemáticas vectoriales y me sorprendió un poco descubrir que el tiempo de ejecución no era notablemente mejor en mi máquina de cuatro núcleos. Curiosamente, descubrí que el tiempo de ejecución es el peor la primera vez que revisas la colección y mejora con las llamadas posteriores. ¿Hay algunas cosas perezosas en la colección paralela que están causando esto, o lo estoy haciendo mal? Cabe señalar que vengo del mundo C++/C#, por lo que es muy posible que haya estropeado mi configuración de alguna manera. De todos modos, aquí está mi configuración:
InteliJ Scala Plugin
Scala 2.9.1.final
Windows 7 64 bits, procesador de cuatro núcleos (sin hyperthreading)
import util.Random
// simple Vector3D class that has final x,y,z components a length, and a '-' function
class Vector3D(val x:Double, val y:Double, val z:Double)
{
def length = math.sqrt(x*x+y*y+z*z)
def -(rhs : Vector3D) = new Vector3D(x - rhs.x, y - rhs.y, z - rhs.z)
}
object MainClass {
def main(args : Array[String]) =
{
println("Available CPU's: " + Runtime.getRuntime.availableProcessors())
println("Parallelism Degree set to: " + collection.parallel.ForkJoinTasks.defaultForkJoinPool.getParallelism);
// my position
val myPos = new Vector3D(0,0,0);
val r = new Random(0);
// define a function nextRand that gets us a random between 0 and 100
def nextRand = r.nextDouble() * 100;
// make 10 million random targets
val targets = (0 until 10000000).map(_ => new Vector3D(nextRand, nextRand, nextRand)).toArray
// take the .par hit before we start profiling
val parTargets = targets.par
println("Created " + targets.length + " vectors")
// define a range function
val rangeFunc : (Vector3D => Double) = (targetPos) => (targetPos - myPos).length
// we'll select ones that are <50
val within50 : (Vector3D => Boolean) = (targetPos) => rangeFunc(targetPos) < 50
// time it sequentially
val startTime_sequential = System.currentTimeMillis()
val numTargetsInRange_sequential = targets.filter(within50)
val endTime_sequential = System.currentTimeMillis()
println("Sequential (ms): " + (endTime_sequential - startTime_sequential))
// do the parallel version 10 times
for(i <- 1 to 10)
{
val startTime_par = System.currentTimeMillis()
val numTargetsInRange_parallel = parTargets.filter(within50)
val endTime_par = System.currentTimeMillis()
val ms = endTime_par - startTime_par;
println("Iteration[" + i + "] Executed in " + ms + " ms")
}
}
}
La salida de este programa es:
Available CPU's: 4
Parallelism Degree set to: 4
Created 10000000 vectors
Sequential (ms): 216
Iteration[1] Executed in 227 ms
Iteration[2] Executed in 253 ms
Iteration[3] Executed in 76 ms
Iteration[4] Executed in 78 ms
Iteration[5] Executed in 77 ms
Iteration[6] Executed in 80 ms
Iteration[7] Executed in 78 ms
Iteration[8] Executed in 78 ms
Iteration[9] Executed in 79 ms
Iteration[10] Executed in 82 ms
¿Qué está pasando aquí? Las primeras 2 veces que hacemos el filtro, es más lento, y luego las cosas se aceleran? Entiendo que habrá un costo de inicio de paralelismo intrínsecamente, solo estoy tratando de descubrir dónde tiene sentido expresar el paralelismo en mi aplicación, y específicamente quiero poder mostrar a la Administración un programa que se ejecuta 3-4 veces más rápido en una caja de cuatro núcleos. ¿Esto no es un buen problema?
Ideas?
Si está buscando alguna idea sobre cómo vender administración, puede echarle un vistazo a http://scala-boss.heroku.com/#1 (use las teclas de flecha para ver las siguientes diapositivas). – huynhjl
En general, prefieren matrices paralelas a vectores paralelos, al menos hasta que se agreguen concates a vectores. – axel22
@huynhjl - Sabía que la presentación valía algo cuando vi mi vida representada en los primeros dos cómics. ¡Gracias! – fbl