2012-08-03 12 views
7

Mac OS X 10.6.8 çalıştırıyorum ve Enthought Python Distribution'ı kullanıyorum. Nümerik işlevlerimin hem çekirdeklerimden faydalanmasını istiyorum. Bu yazıya benzer bir sorun yaşıyorum: multithreaded blas in python/numpy ama o posterin adımlarını izledikten sonra hala aynı problemi yaşıyorum. İşte benim numpy.show_config(): Orijinal yayının yorumların olduğu gibiOtomatik dişli scipy ve numpy işlevlerinin birden fazla çekirdek kullanılmadığı varsayıldı

lapack_opt_info: 
    libraries = ['mkl_lapack95_lp64', 'mkl_intel_lp64', 'mkl_intel_thread', 'mkl_core', 'mkl_mc', 'mkl_mc3', 'pthread'] 
    library_dirs = ['/Library/Frameworks/EPD64.framework/Versions/1.4.2/lib'] 
    define_macros = [('SCIPY_MKL_H', None)] 
    include_dirs = ['/Library/Frameworks/EPD64.framework/Versions/1.4.2/include'] 
blas_opt_info: 
    libraries = ['mkl_intel_lp64', 'mkl_intel_thread', 'mkl_core', 'mkl_mc', 'mkl_mc3', 'pthread'] 
    library_dirs = ['/Library/Frameworks/EPD64.framework/Versions/1.4.2/lib'] 
    define_macros = [('SCIPY_MKL_H', None)] 
    include_dirs = ['/Library/Frameworks/EPD64.framework/Versions/1.4.2/include'] 
lapack_mkl_info: 
    libraries = ['mkl_lapack95_lp64', 'mkl_intel_lp64', 'mkl_intel_thread', 'mkl_core', 'mkl_mc', 'mkl_mc3', 'pthread'] 
    library_dirs = ['/Library/Frameworks/EPD64.framework/Versions/1.4.2/lib'] 
    define_macros = [('SCIPY_MKL_H', None)] 
    include_dirs = ['/Library/Frameworks/EPD64.framework/Versions/1.4.2/include'] 
blas_mkl_info: 
    libraries = ['mkl_intel_lp64', 'mkl_intel_thread', 'mkl_core', 'mkl_mc', 'mkl_mc3', 'pthread'] 
    library_dirs = ['/Library/Frameworks/EPD64.framework/Versions/1.4.2/lib'] 
    define_macros = [('SCIPY_MKL_H', None)] 
    include_dirs = ['/Library/Frameworks/EPD64.framework/Versions/1.4.2/include'] 
mkl_info: 
    libraries = ['mkl_intel_lp64', 'mkl_intel_thread', 'mkl_core', 'mkl_mc', 'mkl_mc3', 'pthread'] 
    library_dirs = ['/Library/Frameworks/EPD64.framework/Versions/1.4.2/lib'] 
    define_macros = [('SCIPY_MKL_H', None)] 
    include_dirs = ['/Library/Frameworks/EPD64.framework/Versions/1.4.2/include'] 

, ben değişken MKL_NUM_THREADS=1 set çizgi silindi. Fakat daha sonra çok iş parçacığı kullanması gereken numpy ve scipy işlevleri, bir seferde yalnızca çekirdeklerimden birini kullanıyor. Değiştirmem gereken başka bir şey var mı?

Düzeltme: Açıkça söylemek gerekirse, numpy.dot() gibi tek bir hesaplamayı MKL uygulamasına göre kendi başına çok iş parçacığı kullanmak için kullanmaya çalışıyorum; hesaplamalar GIL'in kontrolünü serbest bırakır, dolayısıyla diğer işlevlerle çoklu iş parçacığı kolaylaştırır. akıllıca operasyonun öngörülen speedup bağlı olarak belli işlemler paralel hale getirir

import numpy as np 

a = np.random.randn(1000, 10000) 
b = np.random.randn(10000, 1000) 

np.dot(a, b) #this line should be multi-threaded 
+0

Sadece denedim: python -mtimeit -s'import np olarak numpy; a = np.random.randn (1e3,1e3) '' np.dot (a, a) ''Birden çok çekirdek kullanır. En azından bazı yapılandırmalarda bunu yapabilir. – jfs

+0

@ J.F.Sebastian Yapabileceğinin farkındayım, ama neyi kaçırdığımı anlamaya çalışıyorum. – Nino

+0

@ J.F.Sebastian Sadece yaptığınız işi yapmaya çalıştım ve çekirdeklerimi tam olarak kullanıyorum. Bunun nedeni, numpy hesaplamalarının GIL'yi bırakmasıdır, böylece bir for döngüsünde (timeit tarafından yapıldığı gibi) birkaç farklı hesaplama yapıldığında, her bir hesaplama farklı bir iş parçacığında yapılır. Bununla birlikte, sorun yaşıyorum, tek bir hesaplamanın kendi başına çok iş parçacığı olmasıdır. Zaman çizelgesini kullanmadan sizinkilere benzer bir betik çalıştırırsam (bu nedenle yineleme yok), bir seferde yalnızca bir çekirdek kullanılır. – Nino

cevap

7

This article o numpy ima görünüyor: Burada

çoklu iş parçacığı kullanan ama benim makinede değil gerektiğini küçük bir script :

  • "senin numpy/scipy bunlardan birini kullanarak derlenmiş ise (bu hızlı ise), o zaman hiçbir şey yapmadan paralel olarak hesaplanır edilecektir) (dot."

Muhtemelen küçük (-ish) test kutunuz, belirli bir dot() çağrısının ne zaman paralelleştirileceğini belirlemek için numpy'nin sezgisine göre önemli bir hızlanma göstermeyecektir? Belki de gülünç derecede büyük bir operasyonu denemek ve her iki çekirdek kullanılıp kullanılmadığını görmek?

Yan not olarak, işlemci/makine yapılandırmanız aslında BLAS'ı destekliyor mu?

+0

BLAS'ı destekliyor, ancak bu benim numpy'mn MKL'ye bağlı olması nedeniyle sorunun dışında kalıyor. Yani, garip bir şekilde, sadece hayal kırıklığı yüzünden, bu senaryoyu tekrar çalıştırmayı denedim ve şimdi işe yarıyor. Çok şaşkın ... Ama şimdi gideceğim iyi ve cevapladın diye 50 puan sana. Teşekkürler. – Nino

+0

Gee, teşekkürler! – chisaipete