Non sono sicuro che ciò valga di più come un problema del sistema operativo, ma ho pensato di chiedere qui nel caso in cui qualcuno abbia qualche intuizione dalla fine delle cose di Python.
Ho provato a parallelizzare un for
loop pesante per CPU usando joblib
, ma trovo che invece di ogni processo di lavoro assegnato a un core diverso, finisco con tutti loro assegnati allo stesso core e nessun guadagno in termini di prestazioni.
Ecco un esempio molto banale ...
from joblib import Parallel,delayed
import numpy as np
def testfunc(data):
# some very boneheaded CPU work
for nn in xrange(1000):
for ii in data[0,:]:
for jj in data[1,:]:
ii*jj
def run(niter=10):
data = (np.random.randn(2,100) for ii in xrange(niter))
pool = Parallel(n_jobs=-1,verbose=1,pre_dispatch='all')
results = pool(delayed(testfunc)(dd) for dd in data)
if __name__ == '__main__':
run()
... ed ecco cosa vedo htop
mentre questo script è in esecuzione:
Sto eseguendo Ubuntu 12.10 (3.5.0-26) su un laptop con 4 core. Chiaramente joblib.Parallel
sta generando processi separati per i diversi lavoratori, ma c'è un modo in cui posso fare eseguire questi processi su core diversi?