superponer - varias graficas en r




Procesamiento paralelo en R limitado (2)

Estoy ejecutando ubuntu 12.04 y R 2.15.1 con los paquetes paralelo y doParallel. cuando ejecuto algo en paralelo, estoy limitado al 100% de un núcleo, cuando debería tener hasta el 800%, ya que lo estoy ejecutando con 8 núcleos. Lo que aparece en el monitor del sistema es que cada proceso hijo obtiene solo el 12%.

¿Qué está pasando que limita mi velocidad de ejecución?


El problema puede ser que el proceso R está restringido a un núcleo (y los subprocesos lo heredan).

Prueba esto:

> system(sprintf("taskset -p 0xffffffff %d", Sys.getpid()))
pid 3064's current affinity mask: fff
pid 3064's new affinity mask: fff

Ahora, si en su máquina, la máscara de afinidad actual informa un 1, entonces este era el problema. La línea de arriba debe resolverlo (es decir, la segunda línea debe informar fff (o similar).

Simon Urbanek escribió una función mcaffinity que permite este control para multinúcleo. Por lo que sé, todavía está en R-devel.

Para más detalles, ver, por ejemplo, esta discusión en R-sig-hpc .

Actualización y adición a la respuesta de Xin Guo:

Si usa la paralelización implícita a través de openblas y la paralelización explícita (a través de paralelo / nieve / multinúcleo) juntas, puede querer cambiar el número de hilos que usa openblas dependiendo de si se encuentra dentro de una parte explícitamente paralela o no.
Esto es posible (con openblas en Linux, no conozco ningún otro BLAS optimizado habitual que proporcione una función para la cantidad de subprocesos), consulte la publicación de blog de Simon Fuller para obtener más información.


Experimenté el mismo problema debido a los libblas.so(.3gf) , y no sé si esto también causa su problema. Cuando R inicia, llama a un sistema BLAS instalado en su sistema para realizar cálculos algebraicos lineales. Tengo libopenblas.so(.3gf) y está altamente optimizado con la opción "CPU Affinity", es decir, cuando haces un vector numérico o un cálculo matricial, el paquete openblas solo hará 8 hilos y hará cada uno de los hilos pegados a una CPU especificada y fija para acelerar los códigos. Sin embargo, al configurar esto, se informa a su sistema que todas las CPU están muy ocupadas y, por lo tanto, si vienen más tareas paralelas, el sistema intentará comprimirlas en una CPU para no interferir con las CPU ocupadas.

Así que esta fue mi solución que funcionó: descargué una fuente de paquete de OpenBlas y la compilé con el archivo " Makefile.rule " cambiado: hay una línea " #NO_AFFINITY = 1 " y acabo de eliminar " # " para que después de compilado, haya no hay una opción de afinidad seleccionada. Luego instalé el paquete y el problema fue resuelto.

Para la referencia de esto, vea https://github.com/ipython/ipython/issues/840

Tenga en cuenta que esto es una compensación. Eliminar la afinidad de la CPU hará que pierda algo de eficiencia al hacer cálculos numéricos, es por eso que aunque el desarrollador de openblas (Dr. Xianyi Zhang) conoce el problema, aún publica los códigos con la afinidad de la CPU como una opción predeterminada.







parallel-processing