बेंचमार्किंग (python बनाम c ++ BLAS का उपयोग करके) और (संख्यात्मक)


107

मैं एक प्रोग्राम लिखना चाहूंगा जो कि BLAS और LAPACK रैखिक बीजगणित क्रियाओं का व्यापक उपयोग करता है। चूंकि प्रदर्शन एक ऐसा मुद्दा है, जिसे मैंने कुछ बेंचमार्किंग किया और जानना चाहूंगा, अगर मैंने जो दृष्टिकोण लिया है, वह वैध है।

मेरे पास बोलने के लिए तीन प्रतियोगी हैं और एक साधारण मैट्रिक्स-मैट्रिक्स गुणा के साथ अपने प्रदर्शन का परीक्षण करना चाहते हैं। प्रतियोगी हैं:

  1. ऊबड़, केवल की कार्यक्षमता का उपयोग कर रही है dot
  2. अजगर, एक साझा वस्तु के माध्यम से BLAS कार्यात्मकताओं को बुला रहा है।
  3. सी ++, एक साझा वस्तु के माध्यम से बीएलएएस कार्यात्मकताओं को बुला रहा है।

परिदृश्य

मैंने विभिन्न आयामों के लिए मैट्रिक्स-मैट्रिक्स गुणा लागू किया ii5 से 500 की वृद्धि के साथ 5 और मैट्रिक के साथ चलता है m1और m2इस तरह सेट किया जाता है:

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

1. नम

उपयोग किया गया कोड इस तरह दिखता है:

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

2. अजगर, एक साझा वस्तु के माध्यम से बीएलएएस बुला रहा है

समारोह के साथ

_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 को कॉल करना

अब सी ++ कोड स्वाभाविक रूप से थोड़ा लंबा है, इसलिए मैं जानकारी को कम से कम कर देता हूं।
मैं फ़ंक्शन को लोड करता हूं

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);

जहां jएक लूप 20 बार चल रहा है। मैं समय बीतने की गणना करता हूं

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 दिनचर्या को कॉल करते समय मैं प्रदर्शन को बढ़ाने के लिए क्या कर सकता हूँ?

डाउनलोड

यहां पूरा बेंचमार्क डाउनलोड किया जा सकता है । (जेएफ सेबस्टियन ने उस लिंक को संभव बनाया ^ ^)


आपके ctypes दृष्टिकोण में, आपके पास मापा फ़ंक्शन के अंदर मेमोरी आवंटन है। क्या आपका c ++ कोड इस दृष्टिकोण का अनुसरण करता है? लेकिन मैट्रिक्स गुणन की तुलना में यह एक बड़ा अंतर नहीं होना चाहिए ....
रॉस्पोर्ट्रोकर

@rocksportrocker आप सही हैं। rमैट्रिक्स के लिए मेमोरी आवंटन अनुचित है। मैं अभी "मुद्दा" हल कर रहा हूं और नए परिणाम पोस्ट कर रहा हूं।
वुल्तान

1. सुनिश्चित करें कि सरणियों में एक ही मेमोरी लेआउट है np.ascontiguousarray()(सी बनाम फोरट्रान ऑर्डर पर विचार करें)। 2. सुनिश्चित करें कि np.dot()उसी का उपयोग करता है libblas.so
जॉफ्स

@JFSebastian दोनों को गिरफ्तार करता है m1और m2उनके पास ascontiguousarrayझंडा है True। और numpy सी साझा की गई वस्तु का उपयोग करता है जैसा कि C करता है। सरणी के आदेश के लिए: वर्तमान में मैं अभिकलन के परिणाम में दिलचस्पी नहीं रखता हूं इसलिए आदेश अप्रासंगिक है।
13

1
@Woltan: फ़ाइलफैक्ट का उपयोग न करें सेवा भयानक है। मैंने आपके बेंचमार्क को github: woltan-benchmark में जोड़ दिया है । यदि आप github का उपयोग करते हैं तो मैं आपको सहयोगी के रूप में जोड़ सकता हूं।
jfs

जवाबों:


58

मैंने आपका बेंचमार्क चलाया है । मेरी मशीन पर C ++ और numpy के बीच कोई अंतर नहीं है:

वोल्टन का बेंचमार्क

क्या आपको लगता है कि मेरा दृष्टिकोण उचित है, या कुछ अनावश्यक ओवरहेड्स हैं जिनसे मैं बच सकता हूं?

परिणामों में कोई अंतर नहीं होने के कारण यह उचित लगता है।

क्या आप उम्मीद करेंगे कि परिणाम c ++ और अजगर दृष्टिकोण के बीच इतनी बड़ी विसंगति दिखाएगा? दोनों अपनी गणना के लिए साझा वस्तुओं का उपयोग कर रहे हैं।

नहीं।

चूँकि मैं अपने कार्यक्रम के लिए अजगर का उपयोग करूँगा, तो BLAS या LAPACK दिनचर्या को कॉल करते समय मैं प्रदर्शन को बढ़ाने के लिए क्या कर सकता हूँ?

सुनिश्चित करें कि सुन्न अपने सिस्टम पर BLAS / LAPACK पुस्तकालयों के अनुकूलित संस्करण का उपयोग करता है।


4
तो मूल पोस्टर ने क्या गलत किया? काश उसने इस पोस्ट पर टिप्पणी की होती। क्या वह इस बात की पुष्टि करता है कि Numpy C ++ जितना तेज़ है?
wmac

आप C ++ कोड मूल पोस्टर की तुलना में धीमी गति से चल रहे हैं। क्या आपने अनुकूलन के तहत संकलन किया था?
cdcdcd

@ LCD LCD यह मेरा कोड नहीं है। लिंक पर क्लिक करें और अलग-अलग अनुकूलन विकल्पों के साथ बेंचमार्क को चलाएं (मेकफाइल देखें)। हालांकि कोड recompile नहीं ब्लास और न ही लैपैक है।
jfs

73

अद्यतन (30.07.2014):

मैं हमारे नए एचपीसी पर बेंचमार्क को फिर से चलाता हूं। दोनों हार्डवेयर और साथ ही सॉफ्टवेयर स्टैक मूल उत्तर में सेटअप से बदल गया।

मैंने परिणामों को एक Google स्प्रेडशीट में रखा (मूल उत्तर से भी परिणाम शामिल हैं)।

हार्डवेयर

हमारे एचपीसी के पास इंटेल सैंडी ब्रिज सीपीयू के साथ दो और एक नया आइवी ब्रिज सीपीयू के साथ है।

सैंडी (MKL, OpenBLAS, ATLAS):

  • CPU : 2 x 16 इंटेल (R) Xeon (R) E2560 सैंडी ब्रिज @ 2.00GHz (16 करोड़)
  • रैम : 64 जीबी

आइवी (MKL, OpenBLAS, ATLAS):

  • CPU : 2 x 20 इंटेल (R) Xeon (R) E2680 V2 Ivy Bridge @ 2.80GHz (20 करोड़, HT = 40 करोड़ के साथ)
  • रैम : 256 जीबी

सॉफ्टवेयर

सॉफ्टवेयर स्टैक दोनों नोड्स सैम के लिए है। GotoBLAS2 के बजाय , OpenBLAS का उपयोग किया जाता है और एक बहु-थ्रेडेड ATLAS BLAS भी है जो 8 थ्रेड्स (हार्डकोड) पर सेट है।

  • OS : Suse
  • इंटेल कंपाइलर : ictce-5.3.0
  • नम्पी: 1.8.0
  • OpenBLAS: 0.2.6
  • एटलस: 3.8.4

डॉट-उत्पाद बेंचमार्क

बेंचमार्क-कोड नीचे जैसा है। हालाँकि नई मशीनों के लिए मैंने 5000 और 8000 के मैट्रिक्स आकार के लिए बेंचमार्क भी चलाया ।
नीचे दी गई तालिका में मूल उत्तर (बदला हुआ नाम: MKL -> Nehalem MKL, Netlib Blas -> Nehalem Netlib BLAS, आदि) से बेंचमार्क परिणाम शामिल हैं।

मैट्रिक्स गुणन (आकार = [1000,2000,3000,5000,8000])

एकल पिरोया प्रदर्शन: एकल पिरोया प्रदर्शन

बहु पिरोया प्रदर्शन (8 धागे): बहु-थ्रेडेड (8 थ्रेड्स) प्रदर्शन

धागे बनाम मैट्रिक्स का आकार (आइवी ब्रिज MKL) : मैट्रिक्स-आकार बनाम धागे

बेंचमार्क सुइट

बेंचमार्क सुइट

एकल पिरोया प्रदर्शन: यहां छवि विवरण दर्ज करें

बहु पिरोया (8 सूत्र) प्रदर्शन: यहां छवि विवरण दर्ज करें

निष्कर्ष

नए बेंचमार्क परिणाम मूल उत्तर के समान हैं। OpenBLAS और MKL , एक ही स्तर पर प्रदर्शन के अपवाद के साथ Eigenvalue परीक्षण। Eigenvalue परीक्षण प्रदर्शन केवल काफी अच्छा पर OpenBLAS में एकल थ्रेड मोड । बहु-थ्रेडेड मोड में प्रदर्शन बदतर है।

"द मैट्रिक्स आकार धागे बनाम चार्ट" यह भी पता चलता है कि हालांकि MKL के साथ-साथ OpenBLAS आम तौर पर कोर / धागे की संख्या के साथ अच्छी तरह से बड़े पैमाने में, यह मैट्रिक्स के आकार पर निर्भर करता है। छोटे कोर के लिए अधिक कोर जोड़ने से प्रदर्शन में बहुत सुधार नहीं होगा।

सैंडी ब्रिज से आइवी ब्रिज तक लगभग 30% प्रदर्शन में वृद्धि हुई है, जो या तो घड़ी की उच्च दर (+ 0.8 Ghz) और / या बेहतर वास्तुकला के कारण हो सकती है।


मूल उत्तर (04.10.2011):

कुछ समय पहले मुझे कुछ रेखीय बीजगणित गणनाओं / एल्गोरिदम का अनुकूलन करना पड़ा था जो कि अजगर और संख्या में लिखे गए थे, इसलिए मैंने अलग-अलग संख्याओं / बीएलएएस विन्यासों को बेंचमार्क / परीक्षण किया।

विशेष रूप से मैंने परीक्षण किया:

  • एटलस के साथ नेम्पी
  • गोटो के साथ NumpyBlas2 (1.13)
  • एमकेएल के साथ नम्पी (11.1 / 073)
  • एक्सेलेरेट फ्रेमवर्क के साथ नेम्पी (मैक ओएस एक्स)

मैंने दो अलग-अलग बेंचमार्क चलाए:

  1. विभिन्न आकारों के साथ मैट्रिसेस का सरल डॉट उत्पाद
  2. बेंचमार्क सुइट जो यहाँ पाया जा सकता है

यहाँ मेरे परिणाम हैं:

मशीनें

लिनक्स (MKL, ATLAS, No-MKL, GotoBlas2):

  • OS : उबंटू लुसीड 10.4 64 बिट।
  • CPU : 2 x 4 Intel (R) Xeon (R) E5504 @ 2.00GHz (8 करोड़)
  • रैम : 24 जीबी
  • इंटेल कंपाइलर : 11.1 / 073
  • स्कैपी : 0.8
  • गांठदार : 1.5

मैक बुक प्रो (त्वरित फ्रेमवर्क):

  • ओएस : मैक ओएस एक्स स्नो लेपर्ड (10.6)
  • CPU : 1 Intel Core 2 Duo 2.93 Ghz (2 करोड़)
  • रैम : 4 जीबी
  • स्कैपी : 0.7
  • नम्पी : १.३

मैक सर्वर (त्वरण फ्रेमवर्क):

  • ओएस : मैक ओएस एक्स स्नो लेपर्ड सर्वर (10.6)
  • CPU : 4 X Intel (R) Xeon (R) E5520 @ 2.26 Ghz (8 करोड़)
  • रैम : 4 जीबी
  • स्कैपी : 0.8
  • नम : 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 | 1350 एमएस | 10900 एमएस | 39200 एमएस |    
एटलस (1 सीपीयू) | 314 एमएस | 2560 एमएस | 8700 एमएस |     
MKL (1 सीपीयू) | 268 एमएस | 2110 एमएस | 7120 एमएस |
MKL (2 सीपीयू) | - | - | 3660 एमएस |
MKL (8 सीपीयू) | 39 एमएस | 319 एमएस | 1000 एमएस |
GotoBlas2 (1 सीपीयू) | 266 एमएस | 2100 एमएस | 7280 एमएस |
GotoBlas2 (2 सीपीयू) | 139 एमएस | 1009 एमएस | 3690 एमएस |
GotoBlas2 (8 सीपीयू) | 54 एमएस | 389 एमएस | 1250 एमएस |
मैक ओएस एक्स (1 सीपीयू) | 143 एमएस | 1060 एमएस | 3605 एमएस |
मैक सर्वर (1 सीपीयू) | 92 एमएस | 714 एमएस | 2130 एमएस |

डॉट उत्पाद बेंचमार्क - चार्ट

बेंचमार्क सुइट

कोड :
बेंचमार्क सूट के बारे में अतिरिक्त जानकारी के लिए यहां देखें ।

परिणाम :

    सिस्टम | eigenvalues ​​| svd | हिरासत में | आमंत्रण | डॉट |
netlib BLAS | 1688 एमएस | 13102 एमएस | 438 एमएस | 2155 एमएस | 3522 एमएस |
एटलस (1 सीपीयू) | 1210 एमएस | 5897 एमएस | 170 एमएस | 560 एमएस | 893 एमएस |
MKL (1 सीपीयू) | 691 एमएस | 4475 एमएस | 141 एमएस | 450 एमएस | 736 एमएस |
MKL (2 सीपीयू) | 552 एमएस | 2718 एमएस | 96 एमएस | 267 एमएस | 423 एमएस |
MKL (8 सीपीयू) | 525 एमएस | 1679 एमएस | 60 एमएस | 137 एमएस | 197 एमएस |  
GotoBlas2 (1 सीपीयू) | 2124 एमएस | 4636 एमएस | 147 एमएस | 456 एमएस | 743 एमएस |
GotoBlas2 (2 सीपीयू) | 1560 एमएस | 3278 एमएस | 116 एमएस | 295 एमएस | 460 एमएस |
GotoBlas2 (8 सीपीयू) | 741 एमएस | 2914 एमएस | 82 एमएस | 262 एमएस | 192 एमएस |
मैक ओएस एक्स (1 सीपीयू) | 948 एमएस | 4339 एमएस | 151 एमएस | 318 एमएस | 566 एमएस |
मैक सर्वर (1 सीपीयू) | 1033 एमएस | 3645 एमएस | 99 एमएस | 232 एमएस | 342 एमएस |

बेंचमार्क सुइट - चार्ट

स्थापना

की स्थापना MKL पूरा इंटेल संकलक सुइट जो बहुत सीधे आगे है स्थापित करने के शामिल थे। हालाँकि, कुछ बग्स / मुद्दों के कारण एमकेएल समर्थन के साथ सुन्न को कॉन्फ़िगर करना और संकलन करना थोड़ा परेशानी भरा था।

GotoBlas2 एक छोटा पैकेज है जिसे आसानी से साझा पुस्तकालय के रूप में संकलित किया जा सकता है। हालाँकि, बग के कारण आपको इसे साझा करने के लिए साझा लाइब्रेरी को फिर से बनाना होगा, ताकि इसे खसखस ​​के साथ उपयोग किया जा सके।
इस इमारत के अलावा कई लक्ष्य के लिए यह किसी कारण से काम नहीं कर रहा था। इसलिए मुझे प्रत्येक प्लेटफ़ॉर्म के लिए एक .so फ़ाइल बनानी थी जिसके लिए मैं एक अनुकूलित libgoto2.so फ़ाइल बनाना चाहता हूँ ।

यदि आप Ubuntu के रिपॉजिटरी से numpy स्थापित करते हैं तो यह स्वचालित रूप से ATLAS का उपयोग करने के लिए numpy को स्थापित और कॉन्फ़िगर करेगा । स्रोत से ATLAS स्थापित करने में कुछ समय लग सकता है और कुछ अतिरिक्त चरणों (फोरट्रान, आदि) की आवश्यकता होती है।

यदि आप एक मैक ओएस एक्स मशीन पर फिंक या मैक पोर्ट्स के साथ numpy स्थापित करते हैं, तो यह ATLAS या Apple के एक्सेलेरेट फ्रेमवर्क का उपयोग करने के लिए या तो numpy कॉन्फ़िगर करेगा । आप numpy.core._dotblas फ़ाइल पर कॉल चलाकर या numpy.show_config () कॉल करके जाँच कर सकते हैं ।

निष्कर्ष

MKL गोटोब्लास 2 के बाद सबसे अच्छा प्रदर्शन करता है ।
में eigenvalue परीक्षण GotoBlas2 आश्चर्यजनक रूप से भी बदतर उम्मीद से प्रदर्शन करती है। यकीन नहीं होता कि ऐसा क्यों है।
Apple का एक्सेलेरेट फ्रेमवर्क विशेष रूप से सिंगल थ्रेडेड मोड (अन्य BLAS कार्यान्वयनों की तुलना में) में बहुत अच्छा करता है।

दोनों GotoBlas2 और MKL धागे की संख्या के साथ बहुत अच्छी तरह से पैमाने। इसलिए अगर आपको कई धागों पर चलने वाले बड़े मेट्रिक्स से निपटना है तो इससे बहुत मदद मिलेगी।

किसी भी मामले में डिफ़ॉल्ट नेटलिब ब्लास कार्यान्वयन का उपयोग न करें क्योंकि यह किसी भी गंभीर कम्प्यूटेशनल कार्य के लिए बहुत धीमा है।

हमारे क्लस्टर पर मैंने AMD का ACML भी स्थापित किया और प्रदर्शन MKL और GotoBlas2 के समान था । मेरे पास कोई संख्या कठिन नहीं है।

मैं व्यक्तिगत रूप से GotoBlas2 का उपयोग करने की सलाह दूंगा क्योंकि इसे स्थापित करना आसान है और यह मुफ़्त है।

यदि आप C ++ / C में कोड डालना चाहते हैं, तो Eigen3 को देखें जो कि कुछ मामलों में MKL / GotoBlas2 को बेहतर बनाने वाला है और इसका उपयोग करना बहुत आसान है।


इस विस्तृत जवाब के लिए बहुत-बहुत धन्यवाद!
9

बहुत व्यापक, धन्यवाद! मुझे आश्चर्य है कि तीन साल बाद, चाहे ओपनब्लस (जहां तक ​​मुझे पता है, यह गोटोब्लास का वंशज है) बेहतर प्रदर्शन करेगा। मैंने कहीं पढ़ा है कि यह एमकेएल को बेहतर बनाता है, लेकिन अभी स्रोत नहीं मिल रहा है।

धन्यवाद! यह मेरा इंप्रेशन to0 है (मैं सोच रहा था कि क्या यह मेरा इंस्टॉलेशन था): OpenBLAS मल्टी-थ्रेडेड मोड में इतना अच्छा प्रदर्शन नहीं करता है, जब यह मैट्रिलेजिंग डायग्नोलाइज़ होता है (I scagony in scipy, जो OpenBLAS से जुड़ा होता है)।

@William: आमतौर पर आपको विशेष रूप से स्केपी को ओपनब्लास से जोड़ने की आवश्यकता नहीं होती है क्योंकि यह इंस्टॉल के दौरान सुन्न विन्यास का उपयोग करेगा और वास्तव में अधिकांश BLAS / लापैक कॉल को किसी भी तरह से सुधारा जाएगा। इसलिए यदि ओपनबिल के खिलाफ सुन्न को ठीक से जोड़ा जाता है, तो सब कुछ ठीक काम करना चाहिए।
Ü

@ @मित: धन्यवाद! मैं एमकेएल के खिलाफ लिंक करने के लिए अब खतना को सेटअप करने की कोशिश कर रहा हूं।

20

यहाँ एक और बेंचमार्क है (लिनक्स पर, बस टाइप करें make): http://dl.dropbox.com/u/5453551/blas_call_benchmark.zip

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

मैं बड़े मैट्रिस के लिए अलग-अलग तरीकों के बीच अनिवार्य रूप से कोई अंतर नहीं देखता हूं, नम्पी, सीटीपीज़ और फोरट्रान के बीच। (सी ++ के बजाय फोरट्रान --- और यदि यह मायने रखता है, तो शायद आपका बेंचमार्क टूट गया है।)

CalcTimeलगता है कि C ++ में आपका कार्य एक त्रुटि है। ... + ((double)start.tv_usec))इसके बजाय होना चाहिए ... - ((double)start.tv_usec))शायद आपके बेंचमार्क में अन्य बग भी हैं, जैसे, अलग-अलग BLAS लाइब्रेरी, या अलग-अलग BLAS सेटिंग्स, जैसे थ्रेड्स की संख्या, या वास्तविक समय और CPU समय के बीच तुलना?

संपादित करें : CalcTimeफ़ंक्शन में ब्रेसिज़ की गणना करने में विफल रहा - यह ठीक है।

एक दिशानिर्देश के रूप में: यदि आप एक बेंचमार्क करते हैं, तो कृपया हमेशा कहीं न कहीं सभी कोड पोस्ट करें । बेंचमार्क पर टिप्पणी करना, खासकर जब आश्चर्य की बात है, बिना पूर्ण कोड आमतौर पर उत्पादक नहीं होता है।


यह जानने के लिए कि BLAS Numpy किसके साथ जुड़ा हुआ है, करें:

$ अजगर
पायथन 2.7.2+ (डिफ़ॉल्ट, 16 अगस्त 2011, 07:24:41) 
[जीसीसी 4.6.1] linux2 पर
अधिक जानकारी के लिए "सहायता", "कॉपीराइट", "क्रेडिट" या "लाइसेंस" टाइप करें।
>>> आयात 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 => /us/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 ATLAS के साथ अधिकांश लिनक्स वितरण जहाज, इसलिए सबसे अच्छा विकल्प आपके libatlas-devपैकेज को स्थापित करना है (नाम भिन्न हो सकता है) ।


मैंने आपका बेंचमार्क चलाया है; परिणाम वही हैं
22

आपकी पोस्टिंग के लिए बहुत-बहुत धन्यवाद। मैंने इस परिणाम के साथ आपके बेंचमार्क को चलाया । इसलिए मैं तुम्हारा पुनरुत्पादन नहीं कर सकता। यह जांचने के लिए कि कौन सा BLAS मेरा सुपाची उपयोग कर रहा है: मैं नहीं कर सकता import numpy.core._dotblas। यहां क्या समस्या हो सकती थी? मैं अपने बेंचमार्क को लिखने के लिए साफ करने का प्रयास करूंगा ताकि दूसरे इसे परख सकें।
वुल्तान

2
@Woltan: तथ्य यह है कि आप numpy.core._dotblas को आयात नहीं कर सकते हैं, इसका मतलब है कि आपका Numpy BLAS की अपनी आंतरिक कमबैक प्रतिलिपि का उपयोग कर रहा है ( धीमा है , और इसका उपयोग प्रदर्शन कंप्यूटिंग में उपयोग करने के लिए नहीं है!), आपके पास BLI लाइब्रेरी के बजाय। आपके सिस्टम पर। यह आपको बेंचमार्क से प्राप्त परिणामों की व्याख्या करता है। स्थिति को ठीक करने के लिए, आपको एक BLAS संस्करण स्थापित करना होगा Numpy के साथ काम कर सकते हैं --- जिसका अर्थ है ATLAS या MKL। यहाँ निर्देशों का एक सेट है: scipy.org/Installing_SciPy/Linux
pv।

@pv: परिणाम की तुलना करने के लिए आप वुल्तान के बेंचमार्क को चला सकते हैं ।
18

1
मैक पर, आप उपयोग कर सकते हैं otool -Lके बजाय lddलिनक्स पर
RichVel

9

आपने अपने विश्लेषण से जो कठोरता दिखाई है, उसे देखते हुए, मैं इस प्रकार अब तक के परिणामों से हैरान हूं। मैंने इसे एक 'उत्तर' के रूप में रखा, लेकिन केवल इसलिए कि यह एक टिप्पणी के लिए बहुत लंबा है और एक संभावना प्रदान करता है (हालांकि मुझे उम्मीद है कि आपने इसे माना है)।

मुझे लगा कि सुन्न / अजगर दृष्टिकोण उचित जटिलता के एक मैट्रिक्स के लिए बहुत अधिक उपरि नहीं जोड़ेगा, क्योंकि जटिलता बढ़ने के बाद, अजगर जिस अनुपात में भाग लेता है वह छोटा होना चाहिए। मैं ग्राफ़ के दाहिने हाथ की ओर परिणामों में अधिक रुचि रखता हूं, लेकिन वहां दिखाए गए परिमाण विसंगति के आदेश परेशान करते होंगे।

मुझे आश्चर्य है कि यदि आप सबसे अच्छा एल्गोरिदम का उपयोग कर रहे हैं जो कि खस्ता हो सकता है। लिनक्स के लिए संकलन गाइड से:

"बिल्ड FFTW (3.1.2): SciPy संस्करण> = 0.7 और Numpy> = 1.2: लाइसेंस, कॉन्फ़िगरेशन और रखरखाव के मुद्दों के कारण FFTW के लिए समर्थन SciPy> = 0.7 और NumPy> - 1.2 के संस्करणों में हटा दिया गया था। इसके बजाय अब उपयोग करता है। Fftpack का एक अंतर्निहित संस्करण। आपके विश्लेषण के लिए आवश्यक होने पर FFTW की गति का लाभ उठाने के लिए कुछ तरीके हैं। एक Numpy / Scipy संस्करण में अपग्रेड करें जिसमें समर्थन शामिल है। FFTW का अपना स्वयं का आवरण स्थापित करें या बनाएँ। http: //developer.berlios.de/projects/pyfftw/ एक संयुक्त राष्ट्र के उदाहरण के रूप में। "

क्या आपने mkl के साथ सुन्न संकलन किया? ( http://software.intel.com/en-us/articles/intel-mkl/ )। यदि आप linux पर चल रहे हैं, तो mkl के साथ numpy संकलन करने के निर्देश यहाँ दिए गए हैं: http://www.scipy.org/Installing_SciPy/Linux#head-7ce43956a69ec51c6f2cedu894a4715d5bfff974 (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 

यदि आप खिड़कियों पर हैं, तो आप mkl के साथ संकलित बाइनरी प्राप्त कर सकते हैं, (और साथ ही pyfftw, और कई अन्य संबंधित एल्गोरिदम भी प्राप्त कर सकते हैं): http://www.lfd.uci.edu/~gohlke/pythonlibs/ के साथ, प्रतिदीप्ति डायनेमिक्स, यूसी इरविन के लिए प्रयोगशाला में क्रिस्टोफ गोहले का आभार।

कैविट, या तो मामले में, कई लाइसेंसिंग मुद्दे हैं और इतने पर जागरूक होने के लिए, लेकिन इंटेल पेज उन लोगों को समझाता है। फिर से, मुझे लगता है कि आपने इस पर विचार किया है, लेकिन यदि आप लाइसेंसिंग आवश्यकताओं को पूरा करते हैं (जो कि लिनक्स पर करना बहुत आसान है), तो यह एफपीडब्ल्यूडब्ल्यू के बिना, एक साधारण स्वचालित निर्माण का उपयोग करने के सापेक्ष एक महान सौदे को गति देगा। मुझे इस धागे का अनुसरण करने में दिलचस्पी होगी और देखूंगा कि दूसरे क्या सोचते हैं। भले ही, उत्कृष्ट कठोरता और उत्कृष्ट प्रश्न। इसे पोस्ट करने के लिए धन्यवाद।


अपनी विस्तृत "टिप्पणी" ^ ^ के लिए धन्यवाद। मेरे अजगर / सुन्न / BLAS सेटअप को स्पष्ट करने के लिए: मैंने इस इंस्टॉलेशन गाइड का पालन ​​किया । मैं एक लिनक्स ओएस पर हूं और संस्करण हैं: पायथन 2.7, स्किपी 0.9 नम्पी 1.6। दुर्भाग्य से मैंने हाथ से पहले FFTW का निर्माण नहीं किया था, न ही मैंने mkl का उपयोग किया था ...
वुल्तान

एक तरह से यह सौभाग्यशाली है। इसका मतलब है कि अजगर के परिणामों में सुधार के लिए बहुत जगह है और ऐसा लगता है कि आप अजगर का उपयोग करना चाहते हैं। मुझे लगता है कि यदि आप लिंक पर दिखाए गए अपने निर्माण को संशोधित करते हैं, तो आप सुपीरियर की गति के साथ बहुत खुश होंगे, हालांकि मैं अभी भी यह देखने के लिए रोमांचित हूं कि यह आपके सी ++ कार्यान्वयन की तुलना में कैसा है।
प्रोफेन

आप ATLAS को भी बनाने की कोशिश कर सकते हैं, लेकिन मेरे प्रदर्शन की ज़रूरतों के लिए बहुत अधिक सिरदर्द की तरह लग रहा था, इसलिए मुझे कोई अनुभव नहीं है। मुझे लगता है कि अगर आप अजगर का उपयोग करने में रुचि रखते हैं, लेकिन C ++ का उपयोग करने में सक्षम हैं, तो कुछ बिंदु होंगे, जिस पर बहुत सारे विशेष संकलन करने की सेटअप लागत भाषा की बचत से आगे निकल जाएगी, और यह c ++ करना आसान होगा। लेकिन mkl और fftw दोनों बहुत ही सीधे होने चाहिए।
Profane

1
वर्तमान में एमकेएल, एक्सिलरेट और ओपनबीएलएएस प्रदर्शन में समान हैं। OpenBLAS MKL की तुलना में अधिक स्केलेबल है, हालांकि।
स्टर्ला मोलडेन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.