벤치마킹 (Python 대 BLAS를 사용하는 C ++) 및 (numpy)


107

BLAS 및 LAPACK 선형 대수 기능을 광범위하게 사용하는 프로그램을 작성하고 싶습니다. 성능이 문제이기 때문에 몇 가지 벤치마킹을 수행했으며 내가 취한 접근 방식이 합법적인지 알고 싶습니다.

말하자면 3 명의 참가자가 있고 간단한 행렬-행렬 곱셈으로 그들의 성능을 테스트하고 싶습니다. 참가자는 다음과 같습니다.

  1. NumPy와 만의 기능을 활용 dot.
  2. 공유 객체를 통해 BLAS 기능을 호출하는 Python.
  3. C ++, 공유 객체를 통해 BLAS 기능을 호출합니다.

대본

다른 차원에 대한 행렬-행렬 곱셈을 구현했습니다 i. i5 개에서 500 개까지 5 개 단위로 실행되며 다음 m1m2같이 설정됩니다.

m1 = numpy.random.rand(i,i).astype(numpy.float32)
m2 = numpy.random.rand(i,i).astype(numpy.float32)

1. Numpy

사용 된 코드는 다음과 같습니다.

tNumpy = timeit.Timer("numpy.dot(m1, m2)", "import numpy; from __main__ import m1, m2")
rNumpy.append((i, tNumpy.repeat(20, 1)))

2. Python, 공유 객체를 통해 BLAS 호출

기능으로

_blaslib = ctypes.cdll.LoadLibrary("libblas.so")
def Mul(m1, m2, i, r):

    no_trans = c_char("n")
    n = c_int(i)
    one = c_float(1.0)
    zero = c_float(0.0)

    _blaslib.sgemm_(byref(no_trans), byref(no_trans), byref(n), byref(n), byref(n), 
            byref(one), m1.ctypes.data_as(ctypes.c_void_p), byref(n), 
            m2.ctypes.data_as(ctypes.c_void_p), byref(n), byref(zero), 
            r.ctypes.data_as(ctypes.c_void_p), byref(n))

테스트 코드는 다음과 같습니다.

r = numpy.zeros((i,i), numpy.float32)
tBlas = timeit.Timer("Mul(m1, m2, i, r)", "import numpy; from __main__ import i, m1, m2, r, Mul")
rBlas.append((i, tBlas.repeat(20, 1)))

3. C ++, 공유 객체를 통해 BLAS 호출

이제 C ++ 코드는 자연스럽게 조금 더 길어 지므로 정보를 최소한으로 줄입니다.
함수를로드합니다.

void* handle = dlopen("libblas.so", RTLD_LAZY);
void* Func = dlsym(handle, "sgemm_");

다음과 gettimeofday같이 시간을 측정합니다 .

gettimeofday(&start, NULL);
f(&no_trans, &no_trans, &dim, &dim, &dim, &one, A, &dim, B, &dim, &zero, Return, &dim);
gettimeofday(&end, NULL);
dTimes[j] = CalcTime(start, end);

j20 번 실행되는 루프는 어디에 있습니까 ? 나는 지나간 시간을 계산한다

double CalcTime(timeval start, timeval end)
{
double factor = 1000000;
return (((double)end.tv_sec) * factor + ((double)end.tv_usec) - (((double)start.tv_sec) * factor + ((double)start.tv_usec))) / factor;
}

결과

결과는 아래 플롯에 나와 있습니다.

여기에 이미지 설명 입력

질문

  1. 내 접근 방식이 공정하다고 생각합니까, 아니면 피할 수있는 불필요한 오버 헤드가 있습니까?
  2. 결과가 C ++와 파이썬 접근 방식 사이에 엄청난 불일치를 보일 것이라고 기대하십니까? 둘 다 계산을 위해 공유 객체를 사용하고 있습니다.
  3. 내 프로그램에 파이썬을 사용하고 싶기 때문에 BLAS 또는 LAPACK 루틴을 호출 할 때 성능을 향상시키기 위해 무엇을 할 수 있습니까?

다운로드

전체 벤치 마크는 여기에서 다운로드 할 수 있습니다 . (JF Sebastian이 그 링크를 가능하게 만들었습니다 ^^)


ctypes 접근 방식에서는 측정 된 함수 내부에 메모리 할당이 있습니다. C ++ 코드가이 접근 방식을 따르나요? 그러나 행렬 곱셈에 비해이 .... 큰 차이를 만들 안
rocksportrocker

@rocksportrocker 맞습니다. r매트릭스에 대한 메모리 할당 이 불공평합니다. 지금 "문제"를 해결하고 새로운 결과를 게시합니다.
Woltan 2011 년

1. 어레이의 메모리 레이아웃이 동일한 지 확인합니다 np.ascontiguousarray()(C 대 Fortran 순서 고려). 2. np.dot()동일한 libblas.so.
jfs

@JFSebastian 모두 배열 m1m2ascontiguousarray같은 플래그를 True. 그리고 numpy는 C와 동일한 공유 객체를 사용합니다. 배열의 순서에 관해서는 : 현재 계산 결과에 관심이 없으므로 순서는 관련이 없습니다.
Woltan 2011 년

1
@Woltan : filefactory를 사용하지 마십시오. 서비스가 끔찍합니다. 벤치 마크를 github : woltan-benchmark에 추가했습니다 . github를 사용하면 공동 작업자로 추가 할 수 있습니다.
jfs

답변:


58

벤치 마크를 실행했습니다 . 내 컴퓨터에서 C ++와 numpy 사이에는 차이가 없습니다.

월탄의 벤치 마크

내 접근 방식이 공정하다고 생각합니까, 아니면 피할 수있는 불필요한 오버 헤드가 있습니까?

결과에 차이가 없기 때문에 공정 해 보입니다.

결과가 C ++와 파이썬 접근 방식 사이에 엄청난 불일치를 보일 것이라고 기대하십니까? 둘 다 계산을 위해 공유 객체를 사용하고 있습니다.

아니.

내 프로그램에 파이썬을 사용하고 싶기 때문에 BLAS 또는 LAPACK 루틴을 호출 할 때 성능을 향상시키기 위해 무엇을 할 수 있습니까?

numpy가 시스템에서 최적화 된 버전의 BLAS / LAPACK 라이브러리를 사용하는지 확인하십시오.


4
그렇다면 원래 포스터가 잘못한 것은 무엇입니까? 나는 그가이 게시물에 댓글을 달았 으면 좋겠다. 그는 Numpy가 C ++만큼 빠르다는 것을 확인합니까?
wmac

당신은 C ++ 코드가 원래 포스터보다 느리게 실행되고 있습니다. 최적화 된 상태에서 컴파일 했습니까?
cdcdcd

@cdcdcd 내 코드가 아닙니다. 링크를 클릭하고 다른 최적화 옵션으로 벤치 마크를 직접 실행하십시오 (Makefile 참조). 코드는 blas도 lapack도 재 컴파일하지 않습니다.
jfs

73

업데이트 (2014 년 7 월 30 일) :

새로운 HPC에서 벤치 마크를 다시 실행합니다. 하드웨어와 소프트웨어 스택 모두 원래 답변의 설정에서 변경되었습니다.

결과를 Google 스프레드 시트 에 넣었습니다 (원래 답변의 결과도 포함).

하드웨어

HPC에는 Intel Sandy Bridge CPU가있는 노드와 최신 Ivy Bridge CPU가있는 노드가 있습니다.

Sandy (MKL, OpenBLAS, ATLAS) :

  • CPU : 2 x 16 Intel (R) Xeon (R) E2560 Sandy Bridge @ 2.00GHz (16 코어)
  • RAM : 64GB

Ivy (MKL, OpenBLAS, ATLAS) :

  • CPU : 2 x 20 Intel (R) Xeon (R) E2680 V2 Ivy Bridge @ 2.80GHz (20 코어, HT = 40 코어)
  • RAM : 256GB

소프트웨어

소프트웨어 스택은 두 노드 모두 sam입니다. 대신 GotoBLAS2 , OpenBLAS가 사용되며, 또한이 멀티 스레드 ATLAS 8 개 스레드로 설정되어 BLAS (하드 코딩).

  • OS : 수세
  • 인텔 컴파일러 : ictce-5.3.0
  • Numpy : 1.8.0
  • OpenBLAS : 0.2.6
  • 아틀라스 : 3.8.4

내적 벤치 마크

벤치 마크 코드는 아래와 같습니다. 그러나 새 컴퓨터의 경우 매트릭스 크기 50008000에 대한 벤치 마크도 실행했습니다 .
아래 표에는 원래 답변의 벤치 마크 결과가 포함되어 있습니다 (이름 : MKL-> Nehalem MKL, Netlib Blas-> Nehalem Netlib BLAS 등).

행렬 곱셈 (크기 = [1000,2000,3000,5000,8000])

단일 스레드 성능 : 단일 스레드 성능

다중 스레드 성능 (8 스레드) : 멀티 스레드 (8 스레드) 성능

스레드 대 매트릭스 크기 (Ivy Bridge MKL) : 매트릭스 크기 대 스레드

벤치 마크 스위트

벤치 마크 제품군

단일 스레드 성능 : 여기에 이미지 설명 입력

다중 스레드 (8 스레드) 성능 : 여기에 이미지 설명 입력

결론

새로운 벤치 마크 결과는 원래 답변의 결과와 유사합니다. OpenBLASMKL고유 값 테스트를 제외하고 동일한 수준에서 수행됩니다 . 고유치 테스트만을 수행 합리적으로 잘에 OpenBLAS 에서 단일 스레드 모드 . 다중 스레드 모드에서는 성능이 저하됩니다.

"스레드 차트 대 매트릭스 크기" 또한 MKL OpenBLAS뿐만 아니라 일반적으로 코어 / 스레드 수와 잘 확장하지만, 행렬의 크기에 의존한다는 것을 보여준다. 작은 매트릭스의 경우 더 많은 코어를 추가해도 성능이 크게 향상되지 않습니다.

또한 더 높은 클럭 속도 (+ 0.8Ghz) 및 / 또는 더 나은 아키텍처로 인해 Sandy Bridge 에서 Ivy Bridge 로의 성능이 약 30 % 향상 됩니다.


원문 답변 (2011 년 4 월 10 일) :

얼마 전에 numpy와 BLAS를 사용하여 파이썬으로 작성된 선형 대수 계산 / 알고리즘을 최적화해야했기 때문에 다른 numpy / BLAS 구성을 벤치마킹 / 테스트했습니다.

구체적으로 테스트했습니다.

  • ATLAS로 Numpy
  • GotoBlas2 (1.13)로 Numpy
  • MKL로 Numpy (11.1 / 073)
  • Accelerate Framework가있는 Numpy (Mac OS X)

두 가지 다른 벤치 마크를 실행했습니다.

  1. 크기가 다른 행렬의 단순 내적
  2. 여기 에서 찾을 수있는 벤치 마크 제품군 .

내 결과는 다음과 같습니다.

기계

Linux (MKL, ATLAS, No-MKL, GotoBlas2) :

  • 운영체제 : Ubuntu Lucid 10.4 64 Bit.
  • CPU : 2 x 4 Intel (R) Xeon (R) E5504 @ 2.00GHz (8 코어)
  • RAM : 24GB
  • 인텔 컴파일러 : 11.1 / 073
  • Scipy : 0.8
  • Numpy : 1.5

Mac Book Pro (Accelerate Framework) :

  • 운영체제 : Mac OS X Snow Leopard (10.6)
  • CPU : 1 Intel Core 2 Duo 2.93 Ghz (2 코어)
  • RAM : 4GB
  • Scipy : 0.7
  • Numpy : 1.3

Mac 서버 (Accelerate Framework) :

  • 운영체제 : Mac OS X Snow Leopard Server (10.6)
  • CPU : 4 X Intel (R) Xeon (R) E5520 @ 2.26Ghz (8 코어)
  • RAM : 4GB
  • Scipy : 0.8
  • Numpy : 1.5.1

내적 벤치 마크

코드 :

import numpy as np
a = np.random.random_sample((size,size))
b = np.random.random_sample((size,size))
%timeit np.dot(a,b)

결과 :

    시스템 | 크기 = 1000 | 크기 = 2000 | 크기 = 3000 |
netlib BLAS | 1350ms | 10900ms | 39200ms |    
ATLAS (1 CPU) | 314ms | 2560ms | 8700ms |     
MKL (1 CPU) | 268ms | 2110ms | 7120ms |
MKL (2 CPU) | -| -| 3660ms |
MKL (8 CPU) | 39ms | 319ms | 1000ms |
GotoBlas2 (CPU 1 개) | 266ms | 2100ms | 7280ms |
GotoBlas2 (CPU 2 개) | 139ms | 1009ms | 3690ms |
GotoBlas2 (CPU 8 개) | 54ms | 389ms | 1250ms |
Mac OS X (CPU 1 개) | 143ms | 1060ms | 3605ms |
Mac 서버 (1 CPU) | 92ms | 714ms | 2130ms |

내적 벤치 마크-차트

벤치 마크 스위트

코드 :
벤치 마크 제품군에 대한 추가 정보는 여기를 참조 하십시오 .

결과 :

    시스템 | 고유 값 | svd | det | inv | 점 |
netlib BLAS | 1688ms | 13102ms | 438ms | 2155ms | 3522ms |
ATLAS (1 CPU) | 1210ms | 5897ms | 170ms | 560ms | 893ms |
MKL (1 CPU) | 691ms | 4475ms | 141ms | 450ms | 736ms |
MKL (2 CPU) | 552ms | 2718ms | 96ms | 267ms | 423ms |
MKL (8 CPU) | 525ms | 1679ms | 60ms | 137ms | 197ms |  
GotoBlas2 (CPU 1 개) | 2124ms | 4636ms | 147ms | 456ms | 743ms |
GotoBlas2 (CPU 2 개) | 1560ms | 3278ms | 116ms | 295ms | 460ms |
GotoBlas2 (CPU 8 개) | 741ms | 2914ms | 82ms | 262ms | 192ms |
Mac OS X (CPU 1 개) | 948ms | 4339ms | 151ms | 318ms | 566ms |
Mac 서버 (1 CPU) | 1033ms | 3645ms | 99ms | 232ms | 342ms |

벤치 마크 제품군-차트

설치

설치 MKL은 매우 정직 전체 인텔 컴파일러 스위트를 설치 포함되어 있습니다. 그러나 MKL 지원으로 numpy를 구성하고 컴파일하는 일부 버그 / 문제로 인해 약간의 번거 로움이있었습니다.

GotoBlas2 는 공유 라이브러리로 쉽게 컴파일 할 수있는 작은 패키지입니다. 그러나 버그 때문에 numpy와 함께 사용하려면 공유 라이브러리를 빌드 한 후 다시 만들어야합니다.
이 건물 외에도 여러 대상 플랫폼에 대해 어떤 이유로 작동하지 않았습니다. 그래서 최적화 된 libgoto2.so 파일 을 갖고 싶은 각 플랫폼에 대해 .so 파일 을 만들어야했습니다 .

Ubuntu의 저장소에서 numpy를 설치하면 ATLAS 를 사용하도록 자동으로 numpy를 설치하고 구성합니다 . 소스에서 ATLAS 를 설치하는 데 시간이 걸릴 수 있으며 몇 가지 추가 단계 (fortran 등)가 필요합니다.

Fink 또는 Mac Ports가 있는 Mac OS X 컴퓨터에 numpy를 설치하면 ATLAS 또는 Apple의 Accelerate Framework 를 사용하도록 numpy를 구성합니다 . numpy.core._dotblas 파일 에서 ldd를 실행 하거나 numpy.show_config ()를 호출 하여 확인할 수 있습니다 .

결론

MKLGotoBlas2 다음에 가장 잘 수행됩니다 .
에서 고유 테스트 GotoBlas2 예상보다 놀라 울 정도로 악화 수행한다. 왜 이것이 사실인지 확실하지 않습니다.
Apple의 Accelerate Framework는 특히 단일 스레드 모드 (다른 BLAS 구현과 비교할 때)에서 정말 잘 수행됩니다.

GotoBlas2MKL은 모두 스레드 수에 따라 매우 잘 확장됩니다. 따라서 큰 행렬을 처리해야하는 경우 여러 스레드에서 실행하면 많은 도움이됩니다.

어떤 경우에도 기본 netlib blas 구현을 사용하지 마십시오 . 심각한 계산 작업에는 너무 느리기 때문입니다.

클러스터에 AMD의 ACML 도 설치 했고 성능은 MKLGotoBlas2비슷했습니다 . 어려운 숫자가 없습니다.

개인적으로 GotoBlas2 를 사용하는 것이 좋습니다 . 설치가 더 쉽고 무료이기 때문입니다.

C ++ / C로 코딩하고 싶다면 어떤 경우에는 MKL / GotoBlas2 보다 성능이 뛰어나고 사용하기 매우 쉬운 Eigen3 도 확인하십시오 .


이 정교한 답변에 감사드립니다!
Woltan

매우 포괄적입니다. 감사합니다! 3 년 후 OpenBLAS (내가 아는 한 GotoBLAS의 후손)가 더 잘 수행 될지 궁금합니다. MKL을 능가하는 어딘가를 읽었지만 지금은 소스를 찾을 수 없습니다.

감사! 이것이 내 인상입니다. (이것이 단지 내 설치인지 궁금합니다) : OpenBLAS는 행렬을 대각화할 때 다중 스레드 모드에서 잘 수행되지 않습니다 (OpenBLAS에 연결된 scipy에서 대각 화).

@William : 설치 중에 numpy 구성을 사용하고 실제로 대부분의 BLAS / Lapack 호출이 어쨌든 numpy로 전달되기 때문에 일반적으로 scipy를 openblas에 특별히 연결할 필요가 없습니다. 따라서 numpy가 openblas에 제대로 연결되면 모든 것이 잘 작동합니다.
Ümit

@ Ümit : 감사합니다! 지금 MKL에 연결하도록 numpy를 설정하려고합니다.

20

다음은 또 다른 벤치 마크입니다 (Linux에서는 입력 만하면됩니다 make). http://dl.dropbox.com/u/5453551/blas_call_benchmark.zip

http://dl.dropbox.com/u/5453551/blas_call_benchmark.png

나는 Numpy, Ctypes 및 Fortran 사이의 큰 행렬에 대한 다른 방법 사이의 차이점을 본질적으로 보지 못했습니다. (C ++ 대신 Fortran --- 그리고 이것이 중요한 경우 벤치 마크가 손상되었을 수 있습니다.)

CalcTimeC ++ 의 함수에 부호 오류가있는 것 같습니다. ... + ((double)start.tv_usec))대신이어야합니다 ... - ((double)start.tv_usec)). 아마도 벤치 마크에 다른 BLAS 라이브러리 간 비교 또는 스레드 수와 같은 다른 BLAS 설정 또는 실시간과 CPU 시간 간 비교와 같은 다른 버그가있을 수 있습니다.

편집 : CalcTime함수 에서 중괄호를 계산하지 못했습니다 . 괜찮습니다.

지침 : 벤치 마크를 수행하는 경우 항상 모든 코드를 어딘가에 게시 하십시오 . 특히 놀라 울 때 전체 코드없이 벤치 마크에 대한 주석을다는 것은 일반적으로 생산적이지 않습니다.


연결된 BLAS Numpy를 찾으려면 다음을 수행하십시오.

$ 파이썬
Python 2.7.2 이상 (기본값, 2011 년 8 월 16 일, 07:24:41) 
linux2의 [GCC 4.6.1]
자세한 내용을 보려면 "도움말", "저작권", "크레딧"또는 "라이선스"를 입력하십시오.
>>> numpy.core._dotblas 가져 오기
>>> numpy.core._dotblas .__ file__
'/usr/lib/pymodules/python2.7/numpy/core/_dotblas.so'
>>> 
$ ldd /usr/lib/pymodules/python2.7/numpy/core/_dotblas.so
    linux-vdso.so.1 => (0x00007fff5ebff000)
    libblas.so.3gf => /usr/lib/libblas.so.3gf (0x00007fbe618b3000)
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fbe61514000)

업데이트 : numpy.core._dotblas를 가져올 없다면 Numpy는 BLAS의 내부 대체 사본을 사용하고 있습니다. 이는 더 느리고 성능 컴퓨팅에 사용되지 않습니다! 아래 @Woltan의 답변은 이것이 Numpy와 Ctypes + BLAS에서 보는 차이점에 대한 설명임을 나타냅니다.

상황을 해결하려면 ATLAS 또는 MKL이 필요합니다 --- 다음 지침을 확인하십시오 : http://scipy.org/Installing_SciPy/Linux 대부분의 Linux 배포판은 ATLAS와 함께 제공되므로 가장 좋은 방법은 libatlas-dev패키지 를 설치하는 것입니다 (이름은 다를 수 있음). .


나는 당신의 벤치 마크를 실행했습니다. 결과는 동일
JFS

게시 해 주셔서 대단히 감사합니다. 결과로 벤치 마크를 실행했습니다 . 그래서 나는 당신을 재현 할 수 없습니다. 내 numpy가 사용중인 BLAS를 확인하려면 : 할 수 없습니다 import numpy.core._dotblas. 여기서 문제는 무엇일까요? 다른 사람이 테스트 할 수 있도록 내 벤치 마크를 정리하고 makefile을 작성하려고합니다.
Woltan 2011 년

2
@Woltan : numpy.core._dotblas를 가져올 수 없다는 사실은 Numpy가 보유한 BLAS 라이브러리가 아닌 BLAS의 내부 대체 사본 ( 느리고 성능 컴퓨팅에 사용되지 않음)을 사용하고 있음을 의미합니다. 시스템에서. 이것은 벤치 마크에서 얻은 결과를 설명합니다. 상황을 해결하려면 Numpy와 함께 작동 할 수있는 BLAS 버전을 설치해야합니다. 이는 ATLAS 또는 MKL을 의미합니다. 다음은 일련의 지침입니다. scipy.org/Installing_SciPy/Linux
pv.

@pv .: Woltan 의 벤치 마크 를 실행 하여 결과를 비교할 수 있습니까 ?
jfs

1
Mac에서는 Linux otool -L대신 사용할 수 있습니다.ldd
RichVel 2013 년

9

분석을 통해 보여준 엄격함을 감안할 때 지금까지의 결과에 놀랐습니다. 나는 이것을 '답변'으로 넣었지만 그것은 코멘트에 너무 길고 가능성을 제공하기 때문입니다 (당신이 그것을 고려했을 것이라고 예상하지만).

복잡성이 증가함에 따라 파이썬이 참여하는 비율이 작아야하기 때문에 numpy / python 접근 방식이 합리적인 복잡성의 매트릭스에 많은 오버 헤드를 추가하지 않을 것이라고 생각했을 것입니다. 그래프의 오른쪽에있는 결과에 더 관심이 있지만 몇 자릿수 차이가 있으면 혼란 스러울 것입니다.

numpy가 활용할 수있는 최고의 알고리즘을 사용하고 있는지 궁금합니다. Linux 용 컴파일 가이드에서 :

"Build FFTW (3.1.2) : SciPy 버전> = 0.7 및 Numpy> = 1.2 : 라이선스, 구성 및 유지 관리 문제로 인해 SciPy> = 0.7 및 NumPy> = 1.2 버전에서 FFTW에 대한 지원이 제거되었습니다. 대신 이제 fftpack의 기본 제공 버전입니다. 분석에 필요한 경우 FFTW의 속도를 활용할 수있는 몇 가지 방법이 있습니다. 지원이 포함 된 Numpy / Scipy 버전으로 다운 그레이드합니다. FFTW의 자체 래퍼를 설치하거나 만듭니다. http :를 참조 하십시오. //developer.berlios.de/projects/pyfftw/ 는 승인되지 않은 예입니다. "

mkl로 numpy를 컴파일 했습니까? ( http://software.intel.com/en-us/articles/intel-mkl/ ). Linux에서 실행중인 경우 mkl로 numpy를 컴파일하는 방법은 http://www.scipy.org/Installing_SciPy/Linux#head-7ce43956a69ec51c6f2cedd894a4715d5bfff974(url 에도 불구하고)에 있습니다. 핵심 부분은 다음과 같습니다.

[mkl]
library_dirs = /opt/intel/composer_xe_2011_sp1.6.233/mkl/lib/intel64
include_dirs = /opt/intel/composer_xe_2011_sp1.6.233/mkl/include
mkl_libs = mkl_intel_lp64,mkl_intel_thread,mkl_core 

Windows를 사용하는 경우 mkl을 사용하여 컴파일 된 바이너리를 얻을 수 있습니다 (또한 pyfftw 및 기타 관련 알고리즘도 얻을 수 있음) : http://www.lfd.uci.edu/~gohlke/pythonlibs/ 에서 UC Irvine의 Fluorescence Dynamics 연구소의 Christoph Gohlke에게 감사의 뜻을 전합니다.

두 경우 모두 라이센싱 문제 등을 알고 있어야하지만 인텔 페이지에서 이에 대해 설명합니다. 다시 말하지만, 당신이 이것을 고려했다고 생각하지만 라이센스 요구 사항 (리눅스에서는 매우 쉽습니다)을 충족한다면 FFTW 없이도 간단한 자동 빌드를 사용하는 것에 비해 numpy 부분의 속도가 상당히 빨라질 것입니다. 이 스레드를 팔로우하고 다른 사람들이 어떻게 생각하는지보고 싶습니다. 그럼에도 불구하고 탁월한 엄격함과 훌륭한 질문입니다. 게시 해 주셔서 감사합니다.


정성껏 "코멘트"해주셔서 감사합니다 ^^. 내 python / numpy / BLAS 설정을 명확히하기 위해 : 설치 가이드를 따랐습니다 . 저는 Linux OS를 사용 중이며 버전은 Python 2.7, Scipy 0.9 Numpy 1.6입니다. 불행하게도 나는 어느 쪽도 아니 내가 MKL 사용하지 않은, 손 전 FFTW 구축하지 않았다 ...
Woltan

어떤면에서는 다행입니다. 그것은 파이썬 결과에 개선의 여지가 매우 크다는 것을 의미하며 파이썬을 사용하고 싶은 것처럼 들립니다. 링크에 표시된 빌드로 빌드를 수정하면 numpy의 속도에 훨씬 더 만족할 것이라고 생각합니다. 그래도 C ++ 구현과 비교할 때 매력적일 것입니다.
Profane

ATLAS도 구축 할 수 있지만, 성능 요구 사항에 비해 너무 많은 골칫거리처럼 들렸 기 때문에 경험이 없습니다. 파이썬을 사용하는 데 관심이 있지만 C ++를 사용할 수 있다면, 많은 특수 컴파일을 수행하는 설정 비용이 언어 절약을 능가하는 시점이있을 것이며 C ++를 수행하는 것이 더 쉬울 것입니다. 그러나 mkl과 fftw는 모두 매우 간단해야합니다.
Profane 2011-09-29

1
현재 MKL, Accelerate 및 OpenBLAS는 성능면에서 유사합니다. 하지만 OpenBLAS는 MKL보다 확장 성이 뛰어납니다.
Sturla Molden 15.01.05
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.