Dlaczego wieloprocesowość używa tylko jednego rdzenia po zaimportowaniu numpy?
Nie jestem pewien, czy jest to bardziej problem z systemem operacyjnym, ale pomyślałem, że chciałbym zapytać, czy ktoś nie ma wglądu w końcówkę Pythona.
Próbowałem zrównoważyć obciążenie procesorafor
używać pętlijoblib
, ale uważam, że zamiast przypisywania każdego procesu roboczego do innego rdzenia, kończę się na tym, że wszystkie są przypisane do tego samego rdzenia i nie zwiększają wydajności.
Oto bardzo trywialny przykład ...
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()
... a oto co widzęhtop
podczas działania tego skryptu:
Używam Ubuntu 12.10 (3.5.0-26) na laptopie z 4 rdzeniami. Wyraźniejoblib.Parallel
uruchamia oddzielne procesy dla różnych pracowników, ale czy jest jakiś sposób, aby te procesy mogły być wykonywane na różnych rdzeniach?