La mayoría de las funciones de Numpy permitirán el subprocesamiento múltiple de forma predeterminada.
por ejemplo, trabajo en una estación de trabajo Intel CPU de 8 núcleos, si ejecuto un script
import numpy as np
x=np.random.random(1000000)
for i in range(100000):
np.sqrt(x)
Linux top
mostrará un uso de CPU del 800% durante la ejecución, lo
que significa que numpy detecta automáticamente que mi estación de trabajo tiene 8 núcleos y np.sqrt
usa automáticamente los 8 núcleos para acelerar el cálculo.
Sin embargo, encontré un error extraño. Si ejecuto un script
import numpy as np
import pandas as pd
df=pd.DataFrame(np.random.random((10,10)))
df+df
x=np.random.random(1000000)
for i in range(100000):
np.sqrt(x)
¡El uso de la CPU es 100%! Esto significa que si además de dos pandas DataFrame antes de ejecutar cualquier función numpy, la función de subprocesamiento automático de numpy desaparece sin previo aviso. Esto no es absolutamente razonable, ¿por qué el cálculo del marco de datos de Pandas afectaría la configuración de subprocesos Numpy? ¿Es un error? ¿Cómo solucionar esto?
PD:
Excavo más con la perf
herramienta Linux .
ejecutando el primer script muestra
Mientras se ejecuta el segundo script muestra
Por lo tanto libmkl_vml_avx2.so
, ambas secuencias de comandos implican , mientras que la primera secuencia de comandos implica adicional libiomp5.so
que parece estar relacionada con openMP.
Y dado que vml significa intel vector math library, de acuerdo con vml doc, supongo que al menos las funciones a continuación son multiproceso automáticamente
import numpy as np import pandas as pd import os os.environ["MKL_NUM_THREADS"] = '4' print(os.environ["MKL_NUM_THREADS"]) df=pd.DataFrame(np.random.random((10,10))) df+df print(os.environ["MKL_NUM_THREADS"]) a = np.random.random((20000000, 3)) b = np.random.random((3, 30)) for _ in range(10): c = np.dot(a, b)