ç§ãã¡ã®ã·ã¹ãã ã®1ã€ã§ã次ã®ã³ãŒãã¹ãããããPythonã€ã³ã¿ãŒããªã¿ãŒã®ã¯ã©ãã·ã¥ã«ã€ãªãããŸãã
import numpy as np
A = np.matrix([[1.], [3.]])
B = np.matrix([[2., 3.]])
np.dot(A, B)
ããã€ãã®è©³çŽ°ïŒ
ä»ã®ã·ã¹ãã ã§ã¯ããã®ã³ãã³ãã¯åé¡ãªãæ©èœããŸãã
ã©ãã§ãããã¹ããããŠããŸããïŒ ãããïŒ ã¢ãã³ã³ãïŒ np.show_config()
ã¯äœãšèšã£ãŠããŸããïŒ
ãåçããããšãããããŸãã numpyãpipããã€ã³ã¹ããŒã«ããŸããã
>>> import numpy as np
>>> np.show_config()
blas_mkl_info:
NOT AVAILABLE
openblas_lapack_info:
library_dirs = ['C:\\projects\\numpy-wheels-jc1cl\\numpy\\build\\openblas']
libraries = ['openblas']
define_macros = [('HAVE_CBLAS', None)]
language = f77
blis_info:
NOT AVAILABLE
lapack_mkl_info:
NOT AVAILABLE
openblas_info:
library_dirs = ['C:\\projects\\numpy-wheels-jc1cl\\numpy\\build\\openblas']
libraries = ['openblas']
define_macros = [('HAVE_CBLAS', None)]
language = f77
lapack_opt_info:
library_dirs = ['C:\\projects\\numpy-wheels-jc1cl\\numpy\\build\\openblas']
libraries = ['openblas']
define_macros = [('HAVE_CBLAS', None)]
language = f77
blas_opt_info:
library_dirs = ['C:\\projects\\numpy-wheels-jc1cl\\numpy\\build\\openblas']
libraries = ['openblas']
define_macros = [('HAVE_CBLAS', None)]
language = f77
ãã·ã³äžã§ææ°ã®MicrosoftVisualCã©ã³ã¿ã€ã ã«ã¢ããã°ã¬ãŒãããŸãã
å©ããŠïŒ ãã¶ããWindowsUpdateãŸãã¯æ¬¡ã®ãµã€ãããå
¥æã§ããŸãã
https://support.microsoft.com/en-us/help/2977003/the-latest-supported-visual-c-downloads
@pvãã³ãã«æè¬ããŸãããææ°ã®2017ã©ã³ã¿ã€ã ãã€ã³ã¹ããŒã«ããŠã·ã¹ãã ãåèµ·åããåŸãããšã©ãŒã¯åŒãç¶ãååšããŸãã
ããããåé¡ãšã¯äœã®é¢ä¿ããããŸãããã圱é¿ãåããã·ã¹ãã ã¯KVMã§å®è¡ãããŠããWindows10ã§ãã
äžèšã®ãã¹ãã¹ã¯ãªãããt.py
ãšããŠæ¬¡ã®ããã«å®è¡ãããšã python -u -m trace -t t.py
ãã¯ã©ãã·ã¥ããåã«æ¬¡ã®åºåãåŸãããŸãã
t.py(4): A = np.matrix([[1.], [3.]])
--- modulename: defmatrix, funcname: __new__
defmatrix.py(213): if isinstance(data, matrix):
defmatrix.py(221): if isinstance(data, N.ndarray):
defmatrix.py(232): if isinstance(data, str):
defmatrix.py(236): arr = N.array(data, dtype=dtype, copy=copy)
defmatrix.py(237): ndim = arr.ndim
defmatrix.py(238): shape = arr.shape
defmatrix.py(239): if (ndim > 2):
defmatrix.py(241): elif ndim == 0:
defmatrix.py(243): elif ndim == 1:
defmatrix.py(246): order = 'C'
defmatrix.py(247): if (ndim == 2) and arr.flags.fortran:
defmatrix.py(248): order = 'F'
defmatrix.py(250): if not (order or arr.flags.contiguous):
defmatrix.py(253): ret = N.ndarray.__new__(subtype, shape, arr.dtype,
defmatrix.py(254): buffer=arr,
defmatrix.py(255): order=order)
--- modulename: defmatrix, funcname: __array_finalize__
defmatrix.py(259): self._getitem = False
defmatrix.py(260): if (isinstance(obj, matrix) and obj._getitem): return
defmatrix.py(261): ndim = self.ndim
defmatrix.py(262): if (ndim == 2):
defmatrix.py(263): return
defmatrix.py(256): return ret
t.py(5): B = np.matrix([[2., 3.]])
--- modulename: defmatrix, funcname: __new__
defmatrix.py(213): if isinstance(data, matrix):
defmatrix.py(221): if isinstance(data, N.ndarray):
defmatrix.py(232): if isinstance(data, str):
defmatrix.py(236): arr = N.array(data, dtype=dtype, copy=copy)
defmatrix.py(237): ndim = arr.ndim
defmatrix.py(238): shape = arr.shape
defmatrix.py(239): if (ndim > 2):
defmatrix.py(241): elif ndim == 0:
defmatrix.py(243): elif ndim == 1:
defmatrix.py(246): order = 'C'
defmatrix.py(247): if (ndim == 2) and arr.flags.fortran:
defmatrix.py(248): order = 'F'
defmatrix.py(250): if not (order or arr.flags.contiguous):
defmatrix.py(253): ret = N.ndarray.__new__(subtype, shape, arr.dtype,
defmatrix.py(254): buffer=arr,
defmatrix.py(255): order=order)
--- modulename: defmatrix, funcname: __array_finalize__
defmatrix.py(259): self._getitem = False
defmatrix.py(260): if (isinstance(obj, matrix) and obj._getitem): return
defmatrix.py(261): ndim = self.ndim
defmatrix.py(262): if (ndim == 2):
defmatrix.py(263): return
defmatrix.py(256): return ret
t.py(6): print(np.dot(A, B))
--- modulename: defmatrix, funcname: __array_finalize__
defmatrix.py(259): self._getitem = False
defmatrix.py(260): if (isinstance(obj, matrix) and obj._getitem): return
defmatrix.py(261): ndim = self.ndim
defmatrix.py(262): if (ndim == 2):
defmatrix.py(263): return
ããŒãã
ããã¯åäœããŸã
A = np.matrix([[1.], [3.]])
B = np.matrix([[2., 3.]])
print(np.dot(A.astype(np.float16), B.astype(np.float16)))
ããã¯ã¯ã©ãã·ã¥ããŸã
A = np.matrix([[1.], [3.]])
B = np.matrix([[2., 3.]])
print(np.dot(A.astype(np.float32), B.astype(np.float32)))
äœãæ¡ãïŒ
ããŸããŸãªnumpyããŒãžã§ã³ã§éãã åŸãç§ã¯ãããèšãããšãã§ããŸã
ããã«ã€ãªããå¯èœæ§ã®ããæãããªå€æŽã¯èŠåœãããŸããã åé¡ã¯ãã®ã€ã³ã¹ããŒã«ã«åºæã®ãã®ã§ãããããç°å¢ãããŒããŠã§ã¢ãªã©ã«äœãç¹å¥ãªãã®ããããã©ããã確èªãããšåœ¹ç«ã€å ŽåããããŸããã©ããã«ã©ã€ãã©ãªã®åé¡ãããã®ã§ã¯ãªãããšçã£ãŠããŸãã
ã©ã®æ å ±ã«èå³ããããŸããïŒ
OS Name Microsoft Windows 10 Pro
Version 10.0.16299 Build 16299
Other OS Description Not Available
OS Manufacturer Microsoft Corporation
System Name <REMOVED>
System Manufacturer QEMU
System Model Standard PC (i440FX + PIIX, 1996)
System Type x64-based PC
System SKU
Processor Common KVM processor, 1996 Mhz, 4 Core(s), 4 Logical Processor(s)
BIOS Version/Date SeaBIOS rel-1.11.0-0-g63451fca13-prebuilt.qemu-project.org, 4/1/2014
SMBIOS Version 2.8
Embedded Controller Version 255.255
BIOS Mode Legacy
Platform Role Desktop
Secure Boot State Unsupported
PCR7 Configuration Binding Not Possible
Windows Directory C:\WINDOWS
System Directory C:\WINDOWS\system32
Boot Device \Device\HarddiskVolume1
Locale Austria
Hardware Abstraction Layer Version = "10.0.16299.371"
User Name Not Available
Time Zone W. Europe Daylight Time
Installed Physical Memory (RAM) 4.00 GB
Total Physical Memory 4.00 GB
Available Physical Memory 1.94 GB
Total Virtual Memory 8.00 GB
Available Virtual Memory 5.27 GB
Page File Space 4.00 GB
Page File C:\pagefile.sys
Virtualization-based security Not enabled
Device Encryption Support Reasons for failed automatic device encryption: TPM is not usable, PCR7 binding is not supported, Hardware Security Test Interface failed and device is not InstantGo, Un-allowed DMA capable bus/device(s) detected, Disabled by policy, TPM is not usable
A hypervisor has been detected. Features required for Hyper-V will not be displayed.
ç§ã¯ããªãã®äœæ¥èšåãšã®éããæ¢ããŠããŸãã åºæ¬ã·ã¹ãã ã¯Linuxã®ããã«èŠããŸããïŒ
ããã¯åäœããŸãïŒ
ä»ã«åæ§ã®Windows10ã»ããã¢ããã¯ãããŸããã圱é¿ãåããã·ã¹ãã ãããšæ¯èŒã§ããŸãã
åºæ¬ã·ã¹ãã ã¯Linuxã®ããã«èŠããŸããïŒ
æ£ç¢ºã«ïŒDebian GNU / Linux 9ïŒã¹ãã¬ããïŒ
ãããããããåŒãèµ·ãããNumPyã®å€æŽã¯ã1.13.3ã®Windowsã§ã®OpenBLASãžã®åãæ¿ãã§ããã KVMæ°å€ç°å¢ã§åŸ®èª¿æŽãå¿ ââèŠãªãã®ããããšæšæž¬ããŸãã
ã¢ãã©ã¹dllãæµ®ããã§ãããã©ããã確èªã§ããŸãã
ã¢ãã©ã¹dllãæµ®ããã§ãããã©ããã確èªã§ããŸãã
ãã®æãšã¯ã©ãããæå³ã§ããïŒ
ãã以éã®ããŒãžã§ã³ã«ã¯openblasdllãããã¯ããªã®ã§ãå€ãã¢ãã©ã¹dllãšã©ããããããæ··ä¹±ããã®ã§ã¯ãªãããšæããŸãã ããããããããããã§ã¯ãããŸããã IIUCãnumpyãå®è¡ãããééã£ãçµæãè¿ãããã ãã§ãã
Numpyã¯å®è¡ãããŸãããäžèšã®äŸã§ã¯ãå®éã«ã¯äœãåå®è¡ãããã¯ã©ãã·ã¥ã«ã€ãªãããŸãã
ãã1ã€ã®å¯èœæ§ã¯ãOpenBLASãKVMç°å¢ã§ãµããŒããããŠããªãäžæ£ãªåœä»€ïŒSSE *ïŒãçºè¡ããããšã§ãã ããã§äœãæå¹ã«ãªã£ãŠããã®ãããããŸãããã確èªããŠããã ããŸããïŒ
OpenBlasã¯ç°å¢å€æ°ããå¶åŸ¡ã§ããŸãã set OPENBLAS_VERBOSE=2
ã¯ã䜿çšãããŠããããã©ã«ãã®ããã»ããµã¢ãã«ãåºåããå¿
èŠããããŸãã ããã§ããã²ã¹ããå®éã®ãã¹ãã®ããŒããŠã§ã¢ãšåãã¢ãã«ã䜿çšããå¿
èŠããããããããset OPENBLAS_CORETYPE=nehalem
ãããšãã°ãããããªãã®ãã¹ããã·ã³ã®ããã«æ£ãããã©ããã NumPyã¯ãã¹ããã·ã³äžã§æ£ããåäœããŸããïŒ ãã®å Žåã¯ã詳现èšå®ã䜿çšããŠãã²ã¹ãã䜿çšããå¿
èŠããããã®ãèŠã€ããããšãã§ããŸã
ãã®åé¡ã«é¢ããããæ å ±ã¯ãããŸããïŒ
åé¡ã¯ãŸã ååšããŸããã @ mattipã§ãã¹ãããããšã¯ãŸã ã§ããŸããã§ããã ä»åŸ2é±é以å ã«ãããè¡ãããšã¯ã§ããŸããããåŸã§è¡ããŸãã
OKãããããšãã
@ m55c55ããããããããã°ã§ããŸãããïŒ
ããã«ã¡ã¯ã
ç§ã¯ãã®åé¡ã確èªããããšãã§ããå¥ã®ãŠãŒã¹ã±ãŒã¹ãäžããããšã§åœ¹ç«ã€ãããããŸãã...
ç§ã®ãã·ã³ã§ã¯éåžžã«ãã䌌ãåäœããããŸãïŒLinuxã®æ°èŠã€ã³ã¹ããŒã«ïŒïŒ
Linux 4.15.0-42-generic #45-Ubuntu SMP Thu Nov 15 19:32:57 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux
Ubuntu 18.04.1 LTS
numpy (1.15.4)
>>> np.show_config()
blas_mkl_info:
NOT AVAILABLE
blis_info:
NOT AVAILABLE
openblas_info:
libraries = ['openblas', 'openblas']
library_dirs = ['/usr/local/lib']
language = c
define_macros = [('HAVE_CBLAS', None)]
blas_opt_info:
libraries = ['openblas', 'openblas']
library_dirs = ['/usr/local/lib']
language = c
define_macros = [('HAVE_CBLAS', None)]
lapack_mkl_info:
NOT AVAILABLE
openblas_lapack_info:
libraries = ['openblas', 'openblas']
library_dirs = ['/usr/local/lib']
language = c
define_macros = [('HAVE_CBLAS', None)]
lapack_opt_info:
libraries = ['openblas', 'openblas']
library_dirs = ['/usr/local/lib']
language = c
define_macros = [('HAVE_CBLAS', None)]
ç§ã®Pythonã¹ã¯ãªããïŒ
import numpy as np
A = np.random.randn(100, 3000)
B = np.random.randn(3000, 100)
np.dot(B, A)
ã¹ã¯ãªããã¯ãéåžžã«å°ããªè¡åã§ãã¯ã©ãã·ã¥ããŸããã
ãã ããã¯ã©ãã·ã¥ã¯å®éã«ã¯é倧ã§ãããã·ã³ã¯å³åº§ã«åèµ·åããå€ãã®ãã¡ã€ã«ãç ŽæããŸãïŒèª¿æ»äžã«ãbashãšnumpyã¢ãžã¥ãŒã«ãå£ããŸããïŒã
ç§ã¯ããªããnp.dot(B, A.T)
ãæå³ãããšæããŸããïŒ ã©ã®ããã«ããŠNumPyãå
¥æããŸãããïŒ ããªããèªåã§æ§ç¯ããå ŽåãOpenBLASã®ã©ã®ããŒãžã§ã³ã§ããïŒ
ãããã寞æ³ãæããã«ã¯np.dot(B, A)
ããå¿
èŠããããŸãã
pipïŒ1.15.4ïŒããnumpyãååŸããŠã¿ãŸãã
â ~ pip3 install numpy
Collecting numpy
Using cached https://files.pythonhosted.org/packages/ff/7f/9d804d2348471c67a7d8b5f84f9bc59fd1cefa148986f2b74552f8573555/numpy-1.15.4-cp36-cp36m-manylinux1_x86_64.whl
ãŸããubuntuãªããžããªïŒ1.13.3ïŒãããè©ŠããŠã¿ãŸãã
â ~ apt-cache show python3-numpy
Package: python3-numpy
Architecture: amd64
Version: 1:1.13.3-2ubuntu1
Priority: optional
Section: python
Source: python-numpy
Origin: Ubuntu
Maintainer: Ubuntu Developers <[email protected]>
Original-Maintainer: Sandro Tosi <[email protected]>
Bugs: https://bugs.launchpad.net/ubuntu/+filebug
Installed-Size: 10670
Provides: python3-f2py, python3-numpy-abi9, python3-numpy-api11, python3-numpy-dev, python3.6-numpy
Depends: python3 (<< 3.7), python3 (>= 3.6~), python3.6:any, python3:any (>= 3.4~), libblas3 | libblas.so.3, libc6 (>= 2.14), liblapack3 | liblapack.so.3
Suggests: gcc (>= 4:4.6.1-5), gfortran, python-numpy-doc, python3-dev, python3-nose (>= 1.0), python3-numpy-dbg
Filename: pool/main/p/python-numpy/python3-numpy_1.13.3-2ubuntu1_amd64.deb
Size: 1942804
MD5sum: 7b84ea9967f987a292b64f5bc5b6d65f
SHA1: 73fd8354b7106ac81b8add37947173aad515a9d5
SHA256: 3098ad88b8404cbeee66cc6eef96b13ea87eda848900d7cb754fd0bf280741bf
ubuntu 18ãšpipãã€ã³ã¹ããŒã«ãããnumpyãå®è¡ããŠããå¥ã®ã³ã³ãã¥ãŒã¿ãŒã§è©Šãããšãããã¯ã©ãã·ã¥ãåçŸã§ããŸããã äœãèµ·ãã£ãŠããã®ãããããªãïŒ
ããã«ã¡ã¯ãcorrcoefé¢æ°ãå®è¡ããŠãããšãã«ãã®ãã°ã«ééããŸããã ããªã«ããŠã³ããŠã次ã®åŒã³åºãã§ã¯ã©ãã·ã¥ãåçŸã§ããããšãããããŸããnp.dot(np.array([[0], [0]]), np.array([0, 0]).conj())
ã¢ãã³ã³ãç°å¢ã§Windows10ãå®è¡ããŠããŸãã
np.__version__
1.14.2
np.show_configïŒïŒ
mkl_info:
libraries = ['mkl_rt']
library_dirs = ['C:/Users/tommassino/AppData/Local/Continuum/Anaconda3/envs/project-conda\\Library\\lib']
define_macros = [('SCIPY_MKL_H', None), ('HAVE_CBLAS', None)]
include_dirs = ['C:\\Program Files (x86)\\IntelSWTools\\compilers_and_libraries_2016.4.246\\windows\\mkl', 'C:\\Program Files (x86)\\IntelSWTools\\compilers_and_libraries_2016.4.246\\windows\\mkl\\include', 'C:\\Program Files (x86)\\IntelSWTools\\compilers_and_libraries_2016.4.246\\windows\\mkl\\lib', 'C:/Users/tommassino/AppData/Local/Continuum/Anaconda3/envs/project-conda\\Library\\include']
blas_mkl_info:
libraries = ['mkl_rt']
library_dirs = ['C:/Users/tommassino/AppData/Local/Continuum/Anaconda3/envs/project-conda\\Library\\lib']
define_macros = [('SCIPY_MKL_H', None), ('HAVE_CBLAS', None)]
include_dirs = ['C:\\Program Files (x86)\\IntelSWTools\\compilers_and_libraries_2016.4.246\\windows\\mkl', 'C:\\Program Files (x86)\\IntelSWTools\\compilers_and_libraries_2016.4.246\\windows\\mkl\\include', 'C:\\Program Files (x86)\\IntelSWTools\\compilers_and_libraries_2016.4.246\\windows\\mkl\\lib', 'C:/Users/tommassino/AppData/Local/Continuum/Anaconda3/envs/project-conda\\Library\\include']
blas_opt_info:
libraries = ['mkl_rt']
library_dirs = ['C:/Users/tommassino/AppData/Local/Continuum/Anaconda3/envs/project-conda\\Library\\lib']
define_macros = [('SCIPY_MKL_H', None), ('HAVE_CBLAS', None)]
include_dirs = ['C:\\Program Files (x86)\\IntelSWTools\\compilers_and_libraries_2016.4.246\\windows\\mkl', 'C:\\Program Files (x86)\\IntelSWTools\\compilers_and_libraries_2016.4.246\\windows\\mkl\\include', 'C:\\Program Files (x86)\\IntelSWTools\\compilers_and_libraries_2016.4.246\\windows\\mkl\\lib', 'C:/Users/tommassino/AppData/Local/Continuum/Anaconda3/envs/project-conda\\Library\\include']
lapack_mkl_info:
libraries = ['mkl_rt']
library_dirs = ['C:/Users/tommassino/AppData/Local/Continuum/Anaconda3/envs/project-conda\\Library\\lib']
define_macros = [('SCIPY_MKL_H', None), ('HAVE_CBLAS', None)]
include_dirs = ['C:\\Program Files (x86)\\IntelSWTools\\compilers_and_libraries_2016.4.246\\windows\\mkl', 'C:\\Program Files (x86)\\IntelSWTools\\compilers_and_libraries_2016.4.246\\windows\\mkl\\include', 'C:\\Program Files (x86)\\IntelSWTools\\compilers_and_libraries_2016.4.246\\windows\\mkl\\lib', 'C:/Users/tommassino/AppData/Local/Continuum/Anaconda3/envs/project-conda\\Library\\include']
lapack_opt_info:
libraries = ['mkl_rt']
library_dirs = ['C:/Users/tommassino/AppData/Local/Continuum/Anaconda3/envs/project-conda\\Library\\lib']
define_macros = [('SCIPY_MKL_H', None), ('HAVE_CBLAS', None)]
include_dirs = ['C:\\Program Files (x86)\\IntelSWTools\\compilers_and_libraries_2016.4.246\\windows\\mkl', 'C:\\Program Files (x86)\\IntelSWTools\\compilers_and_libraries_2016.4.246\\windows\\mkl\\include', 'C:\\Program Files (x86)\\IntelSWTools\\compilers_and_libraries_2016.4.246\\windows\\mkl\\lib', 'C:/Users/tommassino/AppData/Local/Continuum/Anaconda3/envs/project-conda\\Library\\include']
@TommassinoåçŸã§ããŸããã ãããã倱æããŠãã圢ã§ãããšç¢ºä¿¡ããŠããŸããïŒ
ãã®åé¡ã¯VMå
ã§ã®å®è¡ã«é¢ãããã®ã§ããã»ããã¢ãããç°ãªãå Žåã¯ãæ°ããåé¡ãéããŠãã ããã
>>> import sys
>>> print(sys.version)
3.6.6 (default, Sep 12 2018, 18:26:19)
[GCC 8.0.1 20180414 (experimental) [trunk revision 259383]]
>>> import numpy as np
>>> np.__version__
'1.14.2'
>>> np.dot(np.array([[0], [0]]), np.array([0, 0]).conj())
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: shapes (2,1) and (2,) not aligned: 1 (dim 1) != 2 (dim 0)
@mattipç³ãèš³ãããŸãããããããç¹ã«VMç°å¢ã«é¢é£ããŠããããšã«æ°ã¥ããŸããã§ãããããã¯ã次ã®æçš¿ã§ã®ã¿èšåãããŠããããã§ãã ä»ã®è¿ä¿¡ã®ããã€ãã¯ãévmsã§çºçããåé¡ã«èšåããŠããããã§ãã np.dotã³ãã³ãã®ééãã§ããããã¬ãŒããé åã誀ã£ãŠã³ããŒããŸããã
>>> import sys
>>> import numpy as np
>>> print(sys.version)
3.6.6 | packaged by conda-forge | (default, Jul 26 2018, 11:48:23) [MSC v.1900 64 bit (AMD64)]
>>> print(np.__version__)
1.14.2
>>> X = np.array([0., 0.])
>>> X_T = np.array([0., 0.])
>>> print(X)
[0. 0.]
>>> print(X_T)
[0. 0.]
>>> print(np.dot(X, X_T.conj()))
Process finished with exit code 2
ãã ããmklãã€ãã£ããæ£ããèªã¿èŸŒãŸããªãããšã«é¢é£ããŠããå¯èœæ§ãããããšã¯ãã§ã«ããã£ãŠãããããããã¯ç¢ºãã«å¥ã®åé¡ã§ããå¯èœæ§ããããŸãã
@Tommassinoã³ã³ãããã
@ oleksandr-pavlykïŒäœãèãã¯ãããŸããïŒ
@Tommassinoã³ã³ãããã
è¿ä¿¡ãé ããªã£ãŠãã¿ãŸãããäŒæ¥...ã¯ãç§ã¯ã³ã³ããã³ããŒã䜿çšããŠããŸã
> conda list --no-pip | grep numpy
numpy 1.14.2 py36h5c71026_1
ãã ããåè¿°ããããã«ãmklïŒ conda update mkl
ïŒãæŽæ°ãããšãåé¡ã¯è§£æ±ºããŸããã
ç§ãã¡ã¯ãããããããéããããšãã§ãããšæããŸããïŒ @Khemalã¯Linuxãå®è¡ããŠããã®ã§ãã¯ã©ãã·ã¥ãçºçããããã¯ã¹ã«https://gist.github.com/seberg/ce4563f3cb00e33997e4f80675b80953ã®åºåãæçš¿ã§ããŸããïŒ ããã¯ç¢ºãã«ãã©ã¹ã«é¢é£ããŠããã®ã§ãããã¯ããªã/ç§ãã¡ã«äœãæªãã®ããæããŠããããããããŸããã
åç §ã«ãŠã³ãã®åé¡ãå®éã«ãªãéããä»ã®äººã«ãã©ã³ãã ã«ãããããªãããšã«é©ãããããšã§ãããã
ããã«ã¡ã¯ã
ãã®åé¡ã«é¢ãããã¬ãŒã¹ããã¯ãåéããŸããã
Python 3.6.7
numpyïŒ1.15.4ïŒ
(.kfr-test-env) root<strong i="9">@whatever</strong>:/app# gdb python3
(gdb) run testcode.py
Starting program: /app/.kfr-test-env/bin/python3 testcode.py
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".
[New Thread 0x7ffff3c1b700 (LWP 29704)]
Thread 1 "python3" received signal SIGILL, Illegal instruction.
0x00007ffff4a5c204 in dgemm_oncopy_OPTERON_SSE3 () from /app/.kfr-test-env/lib/python3.6/site-packages/numpy/core/../.libs/libopenblasp-r0-8dca6697.3.0.dev.so
(gdb) bt
#0 0x00007ffff4a5c204 in dgemm_oncopy_OPTERON_SSE3 () from /app/.kfr-test-env/lib/python3.6/site-packages/numpy/core/../.libs/libopenblasp-r0-8dca6697.3.0.dev.so
#1 0x00007ffff6520630 in ?? () from /app/.kfr-test-env/lib/python3.6/site-packages/numpy/core/../.libs/libopenblasp-r0-8dca6697.3.0.dev.so
#2 0x00000000000000e0 in ?? ()
#3 0x00007ffff41275db in dgemm_tt () from /app/.kfr-test-env/lib/python3.6/site-packages/numpy/core/../.libs/libopenblasp-r0-8dca6697.3.0.dev.so
#4 0x00007ffff4052088 in cblas_dgemm () from /app/.kfr-test-env/lib/python3.6/site-packages/numpy/core/../.libs/libopenblasp-r0-8dca6697.3.0.dev.so
#5 0x00007ffff676d28f in ?? () from /app/.kfr-test-env/lib/python3.6/site-packages/numpy/core/multiarray.cpython-36m-x86_64-linux-gnu.so
#6 0x00007ffff6732c36 in ?? () from /app/.kfr-test-env/lib/python3.6/site-packages/numpy/core/multiarray.cpython-36m-x86_64-linux-gnu.so
#7 0x00007ffff673400a in ?? () from /app/.kfr-test-env/lib/python3.6/site-packages/numpy/core/multiarray.cpython-36m-x86_64-linux-gnu.so
#8 0x00000000005030d5 in _PyCFunction_FastCallDict (kwargs=<optimized out>, nargs=<optimized out>, args=<optimized out>,
func_obj=<built-in method dot of module object at remote 0x7ffff6a535e8>) at ../Objects/methodobject.c:231
#9 _PyCFunction_FastCallKeywords (kwnames=<optimized out>, nargs=<optimized out>, stack=<optimized out>, func=<optimized out>) at ../Objects/methodobject.c:294
#10 call_function.lto_priv () at ../Python/ceval.c:4837
#11 0x0000000000506859 in _PyEval_EvalFrameDefault () at ../Python/ceval.c:3335
#12 0x0000000000504c28 in PyEval_EvalFrameEx (throwflag=0, f=Frame 0xadeb18, for file testcode.py, line 10, in <module> ()) at ../Python/ceval.c:4166
#13 _PyEval_EvalCodeWithName.lto_priv.1761 () at ../Python/ceval.c:4166
#14 0x0000000000506393 in PyEval_EvalCodeEx (closure=0x0, kwdefs=0x0, defcount=0, defs=0x0, kwcount=0, kws=0x0, argcount=0, args=0x0, locals=<optimized out>,
globals=<optimized out>, _co=<optimized out>) at ../Python/ceval.c:4187
#15 PyEval_EvalCode (co=<optimized out>, globals=<optimized out>, locals=<optimized out>) at ../Python/ceval.c:731
#16 0x0000000000634d52 in run_mod () at ../Python/pythonrun.c:1025
#17 0x0000000000634e0a in PyRun_FileExFlags () at ../Python/pythonrun.c:978
#18 0x00000000006385c8 in PyRun_SimpleFileExFlags () at ../Python/pythonrun.c:419
#19 0x00000000006387a5 in PyRun_AnyFileExFlags () at ../Python/pythonrun.c:81
#20 0x000000000063915a in run_file (p_cf=0x7fffffffe2fc, filename=<optimized out>, fp=<optimized out>) at ../Modules/main.c:340
#21 Py_Main () at ../Modules/main.c:810
#22 0x00000000004a6f10 in main (argc=2, argv=0x7fffffffe4f8) at ../Programs/python.c:69
@sebergããã¯åºåã§ãïŒ
Probing Multiarray
------------------
OpenBLAS:
num threads: 2
version info: DYNAMIC_ARCH NO_AFFINITY Opteron MAX_THREADS=64
Probing Linalg
--------------
OpenBLAS:
num threads: 2
version info: DYNAMIC_ARCH NO_AFFINITY Opteron MAX_THREADS=64
LDD information:
----------------
running: ldd /app/.kfr-test-env/lib/python3.6/site-packages/numpy/core/multiarray.cpython-36m-x86_64-linux-gnu.so
linux-vdso.so.1 (0x00007ffe941ef000)
libopenblasp-r0-8dca6697.3.0.dev.so => /app/.kfr-test-env/lib/python3.6/site-packages/numpy/core/../.libs/libopenblasp-r0-8dca6697.3.0.dev.so (0x00007f9319cea000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f931994c000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f931972d000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f931933c000)
/lib64/ld-linux-x86-64.so.2 (0x00007f931c800000)
libgfortran-ed201abd.so.3.0.0 => /app/.kfr-test-env/lib/python3.6/site-packages/numpy/core/../.libs/libgfortran-ed201abd.so.3.0.0 (0x00007f9319042000)
running: ldd /app/.kfr-test-env/lib/python3.6/site-packages/numpy/linalg/_umath_linalg.cpython-36m-x86_64-linux-gnu.so
linux-vdso.so.1 (0x00007ffda69d5000)
libopenblasp-r0-8dca6697.3.0.dev.so => /app/.kfr-test-env/lib/python3.6/site-packages/numpy/linalg/../.libs/libopenblasp-r0-8dca6697.3.0.dev.so (0x00007f12097c1000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f12095a2000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f12091b1000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f1208e13000)
libgfortran-ed201abd.so.3.0.0 => /app/.kfr-test-env/lib/python3.6/site-packages/numpy/linalg/../.libs/libgfortran-ed201abd.so.3.0.0 (0x00007f1208b19000)
/lib64/ld-linux-x86-64.so.2 (0x00007f120c0ee000)
@mattipç§ã¯ããªããèšã£ãç°å¢å€æ°ã®ããšãè©ŠããŸããïŒ
os.environ["OPENBLAS_CORETYPE"] = "nehalem"
ãããšæ©èœããŸããã䜿çšããªããšæ©èœããŸããã
import os
os.environ["OPENBLAS_VERBOSE"] = "2"
os.environ["OPENBLAS_CORETYPE"] = "nehalem"
import numpy as np
A = np.matrix([[1.], [3.]])
B = np.matrix([[2., 3.]])
ret = np.dot(A, B)
print(ret)
@kfrendrichããªããä»®æ³ãã·ã³ã
@sebergã¯ããããã¯ä»®æ³ãã·ã³ã§ã
ããã¯ãOpenBLASãCPUãæ€åºããæ¹æ³ã®ãã°ã®ããã«èãããŸãã 圌ãã«å ±åããŠããããŸããïŒ éããŠããkvm
åé¡ã¯èŠã€ãããŸããéããŠããåé¡ãããã€ããã
ã¯ããããã«å ±åããŸãã
ããã¯ãŸã åçŸãããŠããŸããïŒ
numpy1.17.3ã§åãã¯ã©ãã·ã¥ã
$ python
>>> import numpy as np
>>> A = np.matrix([[1.0], [3.0]])
>>> B = np.matrix([[2.0, 3.0]])
>>> ret = np.dot(A, B)
Illegal instruction (core dumped)
ãããããããç§ãèŠã€ãããšã©ãŒã®çç±ã§ã-å®è¡ããããšãããšãPythonã¯ãäžæ£ãªåœä»€ïŒã³ã¢ãã³ãïŒãã§æ»ã«ãŸãïŒ
import matplotlib.pyplot as plt
fig = plt.figure(figsize=(10,10))
ææ¡ããã解決çïŒ
import os
os.environ["OPENBLAS_VERBOSE"] = "2"
os.environ["OPENBLAS_CORETYPE"] = "nehalem"
import numpy as np
åäœããŸãã:(
ãããå®å šãªã¹ããŒãªãŒãšæ§æã§ãïŒ
$ python
Python 3.6.8 (default, Oct 9 2019, 14:04:01)
[GCC 8.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> import numpy as np
>>> print(sys.version)
3.6.8 (default, Oct 9 2019, 14:04:01)
[GCC 8.3.0]
>>> print(np.__version__)
1.17.3
>>> np.show_config()
blas_mkl_info:
NOT AVAILABLE
blis_info:
NOT AVAILABLE
openblas_info:
libraries = ['openblas', 'openblas']
library_dirs = ['/usr/local/lib']
language = c
define_macros = [('HAVE_CBLAS', None)]
blas_opt_info:
libraries = ['openblas', 'openblas']
library_dirs = ['/usr/local/lib']
language = c
define_macros = [('HAVE_CBLAS', None)]
lapack_mkl_info:
NOT AVAILABLE
openblas_lapack_info:
libraries = ['openblas', 'openblas']
library_dirs = ['/usr/local/lib']
language = c
define_macros = [('HAVE_CBLAS', None)]
lapack_opt_info:
libraries = ['openblas', 'openblas']
library_dirs = ['/usr/local/lib']
language = c
define_macros = [('HAVE_CBLAS', None)]
CPUæ å ±ïŒããã¯ä»®æ³ãã·ã³ã§ãïŒïŒ
$ cat /proc/cpuinfo
processor : 0
vendor_id : GenuineIntel
cpu family : 6
model : 85
model name : Intel Xeon Processor (Skylake)
stepping : 4
microcode : 0x1
cpu MHz : 2199.998
cache size : 4096 KB
physical id : 0
siblings : 1
core id : 0
cpu cores : 1
apicid : 0
initial apicid : 0
fpu : yes
fpu_exception : yes
cpuid level : 13
wp : yes
flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ss syscall nx pdpe1gb rdtscp lm constant_tsc rep_good nopl cpuid tsc_known_freq pni pclmulqdq ssse3 cx16 pcid sse4_1 sse4_2 x2apic popcnt tsc_deadline_timer aes xsave avx f16c rdrand hypervisor lahf_lm pti fsgsbase smep erms
bugs : cpu_meltdown spectre_v1 spectre_v2 spec_store_bypass l1tf mds swapgs
bogomips : 4399.99
clflush size : 64
cache_alignment : 64
address sizes : 46 bits physical, 48 bits virtual
power management:
processor : 1
vendor_id : GenuineIntel
cpu family : 6
model : 85
model name : Intel Xeon Processor (Skylake)
stepping : 4
microcode : 0x1
cpu MHz : 2199.998
cache size : 4096 KB
physical id : 1
siblings : 1
core id : 0
cpu cores : 1
apicid : 1
initial apicid : 1
fpu : yes
fpu_exception : yes
cpuid level : 13
wp : yes
flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ss syscall nx pdpe1gb rdtscp lm constant_tsc rep_good nopl cpuid tsc_known_freq pni pclmulqdq ssse3 cx16 pcid sse4_1 sse4_2 x2apic popcnt tsc_deadline_timer aes xsave avx f16c rdrand hypervisor lahf_lm pti fsgsbase smep erms
bugs : cpu_meltdown spectre_v1 spectre_v2 spec_store_bypass l1tf mds swapgs
bogomips : 4399.99
clflush size : 64
cache_alignment : 64
address sizes : 46 bits physical, 48 bits virtual
power management:
processor : 2
vendor_id : GenuineIntel
cpu family : 6
model : 85
model name : Intel Xeon Processor (Skylake)
stepping : 4
microcode : 0x1
cpu MHz : 2199.998
cache size : 4096 KB
physical id : 2
siblings : 1
core id : 0
cpu cores : 1
apicid : 2
initial apicid : 2
fpu : yes
fpu_exception : yes
cpuid level : 13
wp : yes
flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ss syscall nx pdpe1gb rdtscp lm constant_tsc rep_good nopl cpuid tsc_known_freq pni pclmulqdq ssse3 cx16 pcid sse4_1 sse4_2 x2apic popcnt tsc_deadline_timer aes xsave avx f16c rdrand hypervisor lahf_lm pti fsgsbase smep erms
bugs : cpu_meltdown spectre_v1 spectre_v2 spec_store_bypass l1tf mds swapgs
bogomips : 4399.99
clflush size : 64
cache_alignment : 64
address sizes : 46 bits physical, 48 bits virtual
power management:
processor : 3
vendor_id : GenuineIntel
cpu family : 6
model : 85
model name : Intel Xeon Processor (Skylake)
stepping : 4
microcode : 0x1
cpu MHz : 2199.998
cache size : 4096 KB
physical id : 3
siblings : 1
core id : 0
cpu cores : 1
apicid : 3
initial apicid : 3
fpu : yes
fpu_exception : yes
cpuid level : 13
wp : yes
flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ss syscall nx pdpe1gb rdtscp lm constant_tsc rep_good nopl cpuid tsc_known_freq pni pclmulqdq ssse3 cx16 pcid sse4_1 sse4_2 x2apic popcnt tsc_deadline_timer aes xsave avx f16c rdrand hypervisor lahf_lm pti fsgsbase smep erms
bugs : cpu_meltdown spectre_v1 spectre_v2 spec_store_bypass l1tf mds swapgs
bogomips : 4399.99
clflush size : 64
cache_alignment : 64
address sizes : 46 bits physical, 48 bits virtual
power management:
@prokulskiã©ã®ããã«
openblasã¯èªåçã«ã€ã³ã¹ããŒã«ãããŸããïŒäœãã®äŸåé¢ä¿ãšããŠïŒã ç§ã¯ãããåé€ããŠããäžåºŠã€ã³ã¹ããŒã«ããããšããŸããïŒaptinstallãä»ããŠïŒ-å©ãã«ã¯ãªããŸããã§ãã
ãããïŒ np.matrix
代ããã«ïŒéåžžã®é
åã§ã¯ã©ãã·ã¥ãããšæããŸããïŒ éæšå¥šã®ã³ãŒãããããã°ããé€å€ãããšäŸ¿å©ã§ãã ããã¯ã·ã¹ãã äžã§åäœããŸããïŒ
>>> import numpy as np
>>> A = np.array([[1.0], [3.0]])
>>> B = np.array([[2.0, 3.0]])
>>> ret = np.dot(A, B)
ã©ãã§ãã
>>> import numpy as np
>>> A = np.array([[1.0], [3.0]])
>>> B = np.array([[2.0, 3.0]])
>>> ret = np.matmul(A, B)
ãããïŒ
np.matrix
代ããã«ïŒéåžžã®é åã§ã¯ã©ãã·ã¥ãããšæããŸããïŒ éæšå¥šã®ã³ãŒãããããã°ããé€å€ãããšäŸ¿å©ã§ãã ããã¯ã·ã¹ãã äžã§åäœããŸããïŒ>>> import numpy as np >>> A = np.array([[1.0], [3.0]]) >>> B = np.array([[2.0, 3.0]]) >>> ret = np.dot(A, B)
ãéæ³ãªæ瀺ïŒã³ã¢ãã³ãïŒãã®ããCrachesh
>>> import numpy as np >>> A = np.array([[1.0], [3.0]]) >>> B = np.array([[2.0, 3.0]]) >>> ret = np.matmul(A, B)
äžããïŒ
>>> ret
array([[2., 3.],
[6., 9.]])
@prokulskiã©ã®ããã«
openblasã¯èªåçã«ã€ã³ã¹ããŒã«ãããŸããïŒäœãã®äŸåé¢ä¿ãšããŠïŒã ç§ã¯ãããåé€ããŠããäžåºŠã€ã³ã¹ããŒã«ããããšããŸããïŒaptinstallãä»ããŠïŒ-å©ãã«ã¯ãªããŸããã§ãã
ããã§ããããŒãžã§ã³çªå·ã«é¢ãã質åã«ã¯çããããŸããã
圌ãã¯ãã©ã€ãã©ãªãCPUã¿ã€ããæ€åºããæ¹æ³ã«ã€ããŠã·ã¹ãã ãå€æŽããŸããã numpyã¯ã©ã€ãã©ãªã®ã¿ã䜿çšãããããçŽæ¥é£çµ¡ããããšããå§ãããŸãã ããšãã°ãç§ã®åé¡https://github.com/xianyi/OpenBLAS/issues/2067ãåç §ããŠãã ããã
$ apt list *blas* | grep installed
libblas-dev/bionic,now 3.7.1-4ubuntu1 amd64 [installed,automatic]
libblas3/bionic,now 3.7.1-4ubuntu1 amd64 [installed,automatic]
libgslcblas0/bionic,now 2.4+dfsg-6 amd64 [installed,automatic]
libopenblas-devãã€ã³ã¹ããŒã«ããŸããããçŸåšã¯æ¬¡ã®ããã«ãªã£ãŠããŸãã
$ apt list *blas* | grep installed
libblas-dev/bionic,now 3.7.1-4ubuntu1 amd64 [installed,automatic]
libblas3/bionic,now 3.7.1-4ubuntu1 amd64 [installed,automatic]
libgslcblas0/bionic,now 2.4+dfsg-6 amd64 [installed,automatic]
libopenblas-base/bionic,now 0.2.20+ds-4 amd64 [installed,automatic]
libopenblas-dev/bionic,now 0.2.20+ds-4 amd64 [installed]
PythonïŒ
$ python
Python 3.6.8 (default, Oct 9 2019, 14:04:01)
[GCC 8.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import numpy as np
>>> A = np.matrix([[1.0], [3.0]])
>>> B = np.matrix([[2.0, 3.0]])
>>> ret = np.dot(A, B)
Illegal instruction (core dumped)
OPENBLAS_CORETYPE
ããã¹ãã·ã¹ãã ã®CPUã«èšå®ããŠã¿ãŠãã ããã PyPIããpip install
ååŸããnumpyã«ã¯ãOpenBLAS 0.3.7ãå«ãŸããŠããŸããããã«ã¯ãããã«å¯Ÿããä¿®æ£ãå«ãŸããŠããã¯ãã§ãã pip install
ã䜿çšããããšãéžæããvirtualenvã䜿çšããŠããªãå Žåã¯ãã·ã¹ãã ã®pythonãšã®ç«¶åãé¿ããããã«ãå¿
ãpip install --upgrade --user numpy
ã䜿çšããŠãã ããã
OpenBLASã®ããŒãžã§ã³ã確èªããã«ã¯ããã®ã³ãŒãã䜿çšããŠãOpenBLAS0.3.5以éã®ããŒãžã§ã³ãå ±åããŸãã
import numpy
import ctypes
dll = ctypes.CDLL(numpy.core._multiarray_umath.__file__)
get_config = dll.openblas_get_config
get_config.restype=ctypes.c_char_p
res = get_config()
print('OpenBLAS get_config returned', str(res))
@mattipã³ãŒãã¯ããOpenBLASget_configãb'OpenBLAS 0.3.7 DYNAMIC_ARCH NO_AFFINITY Haswell MAX_THREADS = 64 'ãè¿ããŸããããš
OPENBLAS_CORETYPEãHaswellïŒå°æåã倧æåãwhateherïŒã«èšå®ããŠã圹ã«ç«ã¡ãŸãã-ç§ã¯ä»¥åã«ãããè©ŠããŸããã
åé¡ã¯KVMä»®æ³ãã·ã³ãšblasã§ã®CPUæ€åºäžè¯ã«ãããšæããŸãã å¥åŠãªããšã«ãæ°æ¥åã«ãã¹ãŠã®èãã倧äžå€«ã ã£ã...
Haswellã¯ããªãã«ãšã£ãŠééã£ãå€ã ãšæããŸãããã°ãŒã°ã«ã§ãã°ããæ€çŽ¢ããŠããä»®æ³ãã·ã³å ã§ãã¹ãCPUãæ€åºããããã®é©åãªçããåŸãããŸããã
Haswellã¯ããªãã«ãšã£ãŠééã£ãå€ã ãšæããŸãããã°ãŒã°ã«ã§ãã°ããæ€çŽ¢ããŠããä»®æ³ãã·ã³å ã§ãã¹ãCPUãæ€åºããããã®é©åãªçããåŸãããŸããã
ããã Skylakeã®æ¹ãåªããŠããŸããïŒcpuinfoã衚瀺ãããå ŽåïŒã圹ã«ç«ã¡ãŸããã ç§ã¯ç«ã¡åŸçããŠããŸãã
https://github.com/numpy/numpy/milestone/69ã¯åžæãäžããŸã;ïŒ
ããããOpenBLASã«ãŒãã«æå®åãšããŠè©ŠããŠã¿ãŠãã ããããããã®ãããããæ©èœããŸããïŒ
export OPENBLAS_CORETYPE=prescott
ããã³ãã³ããã³ãªã³ãã³ã¢2ãããã¬ã ããµã³ãã£ããªããž
誰ããæ»ã¬ã
KVMã¯CPUã¿ã€ãã®èšå®ãèš±å¯ããŸããïŒ æè¿æŽæ°ãããŸãããïŒ
ã³ã¢ã®èšå®ãæ£ããæ©èœããããšã確èªããããã«ã次ãè¿œå ããŸãã
export OPENBLAS_VERBOSE=2
export OPENBLAS_CORETYPE=prescott
python -c 'import numpy as np; A = np.array([[1.0], [3.0]]); B = np.array([[2.0, 3.0]]); print(np.dot(A, B))'
ç§ã¯åŸãïŒ
Core: Prescott
[[2. 3.]
[6. 9.]]
ãµããŒãã«ãããšãååã¯ããã»ããµã§äœãå€ãã£ãŠããŸããã
ãŸãããã®ãã·ã³ã§docker image jupyter / tensorflow-notebookããã«ããŠéå§ããŸããããJupyterã§å®è¡ãããnp.dotïŒïŒã®äŸãåãããã«å€±æããŸãã ããã§ãããã¯ããŒããŠã§ã¢ã®åé¡ã ãšæããŸããïŒ
@prokulskiäžèšã®Core: Prescott
ãååŸããŸããïŒ
ããã¯ããŒããŠã§ã¢ã«åºæã®ããã§ããããã1.18ãã€ã«ã¹ããŒã³ããåé€ããŸãã
ãCoreïŒPresscotããããã2x2ã®ãããªãã¯ã¹ããããéæ³ãªæ瀺ã¯ãããŸããã
ãexportOPENBLAS_CORETYPE = prescottãè¡ããªããšãäžæ£ãªåœä»€ãããããããªãã¯ã¹ããããŸããã
OpenBLASå ã®CPUãæ€åºããã«ãŒãã³ããKVMã«ãã£ãŠæ··ä¹±ããŠããããã§ãã OpenBLAS課é¡è¿œè·¡ã·ã¹ãã ã§å ±åããŠãäœãèµ·ãã£ãŠããã®ããç解ã§ããããã«ããŠãã ããã
äžèšã®ãã¹ãŠã®ã³ã¢ã¿ã€ãã埪ç°ããã©ããã¯ã©ãã·ã¥ããããèŠã€ããããšã§ãOpenBLASãæ¯æŽã§ããå¯èœæ§ããããŸãã