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
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
@ J.F.Sebastian Yapabileceğinin farkındayım, ama neyi kaçırdığımı anlamaya çalışıyorum. – Nino
@ 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