বেঞ্চমার্কিং (অজগর বনাম সি ++ বিএলএএস ব্যবহার করে) এবং (অদ্ভুত)


107

আমি এমন একটি প্রোগ্রাম লিখতে চাই যা বিএএলএএস এবং ল্যাপ্যাক লিনিয়ার বীজগণিতের কার্যকারিতা ব্যাপকভাবে ব্যবহার করে। পারফরম্যান্স যেহেতু একটি সমস্যা তাই আমি কিছু বেঞ্চমার্কিং করেছি এবং জানতে চাই, যদি আমি গ্রহণ করা পদ্ধতিটি বৈধ হয় তবে।

আমার কাছে তিনটি প্রতিযোগীর কথা বলতে হবে এবং একটি সাধারণ ম্যাট্রিক্স-ম্যাট্রিক্স গুণনের সাথে তাদের পারফরম্যান্স পরীক্ষা করতে চাই। প্রতিযোগীরা হলেন:

  1. নম্পি, এর কার্যকারিতা কেবলমাত্র ব্যবহার করে dot
  2. পাইথন, একটি ভাগ করা অবজেক্টের মাধ্যমে বিএলএএস কার্যকারিতা কল করে।
  3. সি ++, একটি ভাগ করা অবজেক্টের মাধ্যমে BLAS কার্যকারিতা কল করে calling

দৃশ্যপট

আমি বিভিন্ন মাত্রার জন্য একটি ম্যাট্রিক্স-ম্যাট্রিক্স গুণকে প্রয়োগ করেছি ii5 এবং ম্যাট্রিকগুলির বর্ধনের সাথে 5 থেকে 500 পর্যন্ত চলে 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)))

২. পাইথন, ভাগ করা অবজেক্টের মাধ্যমে বিএলএএস-কে কল করে

ফাংশন সহ

_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. সি ++, একটি ভাগ করা অবজেক্টের মাধ্যমে 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);

যেখানে 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. আপনি কি আশা করতে পারেন যে ফলাফলটি সি ++ এবং পাইথন পদ্ধতির মধ্যে এত বিশাল তাত্পর্য দেখায়? উভয়ই তাদের গণনার জন্য ভাগ করা অবজেক্ট ব্যবহার করছে।
  3. যেহেতু আমি বরং আমার প্রোগ্রামের জন্য অজগর ব্যবহার করব, তাই বিএলএএস বা ল্যাপ্যাক রুটিনগুলিতে কল করার সময় আমি কার্যকারিতা বাড়ানোর জন্য কী করতে পারি?

ডাউনলোড

সম্পূর্ণ বেঞ্চমার্কটি এখানে ডাউনলোড করা যায় । (জেএফ সেবাস্তিয়ান সেই লিঙ্কটি সম্ভব করেছেন ^^)


আপনার টাইপ পদ্ধতির মধ্যে, আপনার পরিমাপ করা ফাংশনের ভিতরে মেমরির বরাদ্দ রয়েছে। আপনার সি ++ কোড কি এই পদ্ধতির অনুসরণ করে? তবে ম্যাট্রিক্স গুণনের তুলনায় এটি কোনও বড় পার্থক্য করা উচিত নয় ....
রকসপোর্টার্কার

আপনি সঠিক আছেন rম্যাট্রিক্সের জন্য মেমরির বরাদ্দ অন্যায্য। আমি এখনই "সমস্যা" সমাধান করছি এবং নতুন ফলাফল পোস্ট করছি।
ওল্টন

1. নিশ্চিত করুন যে অ্যারেগুলির একই মেমরি লেআউট রয়েছে np.ascontiguousarray()(সি বনাম ফোর্টরান ক্রম বিবেচনা করুন)। ২. np.dot()এটি একই ব্যবহার করে তা নিশ্চিত করুন libblas.so
jfs

@JFSebastian উভয় অ্যারে m1এবং m2আছে ascontiguousarrayহিসেবে ফ্ল্যাগ True। এবং নম্পি সি'র মতো ভাগ করা বস্তুটি ব্যবহার করে। অ্যারের ক্রম হিসাবে: বর্তমানে আমি গণনার ফলাফলের জন্য আগ্রহী নই সুতরাং আদেশটি অপ্রাসঙ্গিক।
ওল্টন

1
@ ওল্টন: ফাইলফ্যাক্টরি ব্যবহার করবেন না পরিষেবাটি ভয়াবহ। আমি আপনার বেঞ্চমার্ককে গিথুব : ওল্টন-বেঞ্চমার্কে যুক্ত করেছি । আপনি যদি গিথুব ব্যবহার করেন তবে আমি আপনাকে সহযোগী হিসাবে যুক্ত করতে পারি।
jfs

উত্তর:


58

আমি আপনার মানদণ্ড চালিয়েছি । আমার মেশিনে সি ++ এবং নমপির মধ্যে কোনও পার্থক্য নেই:

ওল্টনের বেঞ্চমার্ক

আপনি কি মনে করেন যে আমার দৃষ্টিভঙ্গিটি ন্যায্য, বা এমন কিছু অপ্রয়োজনীয় ওভারহেডগুলি এড়ানো যায়?

ফলাফলের মধ্যে কোনও পার্থক্য না থাকার কারণে এটি ন্যায্য বলে মনে হচ্ছে।

আপনি কি আশা করতে পারেন যে ফলাফলটি সি ++ এবং পাইথন পদ্ধতির মধ্যে এত বিশাল তাত্পর্য দেখায়? উভয়ই তাদের গণনার জন্য ভাগ করা অবজেক্ট ব্যবহার করছে।

না।

যেহেতু আমি বরং আমার প্রোগ্রামের জন্য অজগর ব্যবহার করব, তাই বিএলএএস বা ল্যাপ্যাক রুটিনগুলিতে কল করার সময় আমি কার্যকারিতা বাড়ানোর জন্য কী করতে পারি?

নিশ্চিত করুন যে নম্পী আপনার সিস্টেমে BLAS / LAPACK লাইব্রেরির অনুকূলিত সংস্করণ ব্যবহার করে।


4
তাহলে মূল পোস্টারটি কী ভুল করেছে? আমি আশা করি তিনি এই পোস্টে মন্তব্য করেছেন। সে কি নিশ্চিত করে যে নম্পি সি ++ এর মতো তত দ্রুত?
wmac

আপনার সি ++ কোডটি মূল পোস্টারগুলির চেয়ে ধীরে চলছে। আপনি কি অপ্টিমাইজেশনের অধীনে সংকলন করেছেন?
সিডিসিডিসিডি

@ cdcdcd এটি আমার কোড নয়। লিঙ্কটি ক্লিক করুন এবং বিভিন্ন অপ্টিমাইজেশান বিকল্পগুলি দিয়ে নিজেকে মাপদণ্ড চালান (মেকফিল দেখুন)। যদিও কোডটি ব্লাড বা ল্যাপকে না পুনরায় সংকলন করে।
jfs

73

আপডেট (30.07.2014):

আমি আমাদের নতুন এইচপিসিতে মানদণ্ডটি পুনরায় চালাচ্ছি। হার্ডওয়্যার পাশাপাশি সফ্টওয়্যার স্ট্যাক উভয়ই মূল উত্তরে সেটআপ থেকে পরিবর্তিত হয়েছিল।

আমি ফলাফলগুলি গুগল স্প্রেডশিটে রেখেছি (মূল উত্তর থেকে ফলাফলগুলিও রয়েছে)।

হার্ডওয়্যারের

আমাদের এইচপিসির দুটি পৃথক নোড রয়েছে একটি ইন্টেল স্যান্ডি ব্রিজ সিপিইউ সহ এবং একটি নতুন আইভি ব্রিজ সিপিইউ সহ:

স্যান্ডি (এমকেএল, ওপেনবিএলএস, আটলাস):

  • সিপিইউ : 2 এক্স 16 ইন্টেল (আর) জিয়ন (আর) E2560 স্যান্ডি ব্রিজ @ 2.00GHz (16 কোর)
  • র‌্যাম : 64 জিবি

আইভী (এমকেএল, ওপেনবিএলএস, আটলাস):

  • সিপিইউ : 2 এক্স 20 ইন্টেল (আর) জিয়ন (আর) E2680 ভি 2 আইভি ব্রিজ @ 2.80GHz (এইচটি = 40 কোর সহ 20 টি কোর্স)
  • র‌্যাম : 256 জিবি

সফটওয়্যার

সফটওয়্যার স্ট্যাক দুটি নোড স্যামের জন্য। পরিবর্তে GotoBLAS2 , OpenBLAS ব্যবহার করা হয় এবং সেখানে একটি হল বহু-থ্রেডেড এটলাস Blas যে 8 থ্রেড সেট করা হয় (হার্ডকোডেড)।

  • ওএস : সুস
  • ইন্টেল সংকলক: ictce-5.3.0
  • Numpy: 1.8.0
  • ওপেনবিএলএস: 0.2.6
  • এটলাস: : 3.8.4

ডট-প্রোডাক্ট বেঞ্চমার্ক

বেঞ্চমার্ক-কোড নীচের মত একই। তবে নতুন মেশিনগুলির জন্য আমি 5000 এবং 8000 ম্যাট্রিক্স মাপের মানদণ্ডও চালিয়েছি
নীচের সারণীতে মূল উত্তরের মানদণ্ডের ফলাফল অন্তর্ভুক্ত করা হয়েছে (নামকরণ করা হয়েছে: এমকেএল -> নেহালেম এমকেএল, নেটলিব ব্লেস -> নেহালেম নেটলিব বিএলএস, ইত্যাদি)

ম্যাট্রিক্সের গুণন (আকার = [1000,2000,3000,5000,8000])

একক থ্রেডেড পারফরম্যান্স: একক থ্রেডেড পারফরম্যান্স

মাল্টি থ্রেডেড পারফরম্যান্স (8 টি থ্রেড): মাল্টি থ্রেডেড (8 থ্রেড) পারফরম্যান্স

থ্রেডস বনাম ম্যাট্রিক্স আকার (আইভি ব্রিজ এমকেএল) : ম্যাট্রিক্স-আকার বনাম থ্রেড

বেঞ্চমার্ক স্যুট

মানদণ্ড স্যুট

একক থ্রেডেড পারফরম্যান্স: এখানে চিত্র বর্ণনা লিখুন

একাধিক থ্রেডযুক্ত (8 থ্রেড) সম্পাদনা: এখানে চিত্র বর্ণনা লিখুন

উপসংহার

নতুন বেঞ্চমার্কের ফলাফলগুলি মূল উত্তরের মতোই। OpenBLAS এবং MKL , একই স্তরের উপর সঞ্চালন ছাড়া Eigenvalue পরীক্ষা। Eigenvalue পরীক্ষা সঞ্চালিত শুধুমাত্র যুক্তিসঙ্গতভাবে ভাল উপর OpenBLAS মধ্যে একক থ্রেডেড মোড । মাল্টি-থ্রেড মোডে কর্মক্ষমতা আরও খারাপ।

"ম্যাট্রিক্স আকার থ্রেড বনাম চার্ট" এছাড়াও দেখায় যে যদিও MKL সেইসাথে OpenBLAS সাধারণত কোর / থ্রেডের সংখ্যা সঙ্গে ভাল স্কেল, এটা ম্যাট্রিক্স আকারের উপর নির্ভর করে। ছোট ম্যাট্রিকের জন্য আরও বেশি কোর যুক্ত করা পারফরম্যান্সের খুব বেশি উন্নতি করবে না।

স্যান্ডি ব্রিজ থেকে আইভি ব্রিজ পর্যন্ত প্রায় 30% পারফরম্যান্স বৃদ্ধি পেয়েছে যা হয় বেশি ক্লক রেট (+ 0.8 গিগাহার্টজ) এবং / অথবা আরও ভাল আর্কিটেকচারের কারণে হতে পারে।


আসল উত্তর (04.10.2011):

কিছু সময় আগে আমাকে কিছু লিনিয়ার বীজগণিত গণনা / অ্যালগোরিদমগুলি অপ্টিমাইজ করতে হয়েছিল যা ন্যাপি এবং বিএলএএস ব্যবহার করে পাইথনে লেখা হয়েছিল তাই আমি বিভিন্ন নম্পী / বিএলএএস কনফিগারেশনগুলি বেঞ্চমার্ক / পরীক্ষা করেছি।

বিশেষত আমি পরীক্ষা করেছি:

  • আটলাসের সাথে নম্পু
  • গোটোব্লাস 2 (1.13) সহ নমিত
  • এমকেএল (11.1 / 073) সহ নম্পি
  • এক্সিলারেট ফ্রেমওয়ার্ক (ম্যাক ওএস এক্স) সহ নমিত

আমি দুটি পৃথক মানদণ্ড চালিয়েছি:

  1. বিভিন্ন মাপের ম্যাট্রিকের সাধারণ ডট পণ্য
  2. বেঞ্চমার্ক স্যুট যা এখানে পাওয়া যাবে

আমার ফলাফলগুলি এখানে:

মেশিন

লিনাক্স (এমকেএল, আটলাস, নো-এমকেএল, গোটোব্লাস ২):

  • ওএস : উবুন্টু লুসিড 10.4 64 বিট।
  • সিপিইউ : 2 এক্স 4 ইন্টেল (আর) জিয়ন (আর) E5504 @ 2.00GHz (8 টি কোর)
  • র‌্যাম : 24 জিবি
  • ইন্টেল সংকলক : 11.1 / 073
  • স্কিপি : 0.8
  • নম্পি : 1.5.০

ম্যাক বুক প্রো (ফ্রেমওয়ার্ক ত্বরান্বিত):

  • ওএস : ম্যাক ওএস এক্স স্নো চিতা (10.6)
  • সিপিইউ : 1 ইন্টেল কোর 2 ডুও 2.93 গিগাহার্টজ (2 কোর)
  • র‌্যাম : 4 জিবি
  • স্কিপি : 0.7
  • নম্পি : ১.৩

ম্যাক সার্ভার (ফ্রেমওয়ার্ক ত্বরণ):

  • ওএস : ম্যাক ওএস এক্স স্নো লেপার্ড সার্ভার (10.6)
  • সিপিইউ : 4 এক্স ইন্টেল (আর) জিয়ন (আর) E5520 @ 2.26 গিগাহার্টজ (8 টি কোর)
  • র‌্যাম : 4 জিবি
  • স্কিপি : 0.8
  • নম্পি : ১.০.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 |
নেটলিব বিএলএএস | 1350 এমএস | 10900 এমএস | 39200 এমএস |    
আটলাস (1 সিপিইউ) | 314 এমএস | 2560 এমএস | 8700 এমএস |     
এমকেএল (1 সিপিইউ) | 268 এমএস | 2110 এমএস | 7120 এমএস |
এমকেএল (2 সিপিইউ) | - | - | 3660 এমএস |
এমকেএল (8 সিপিইউ) | 39 এমএস | 319 এমএস | 1000 এমএস |
গোটোব্লাস 2 (1 সিপিইউ) | 266 এমএস | 2100 এমএস | 7280 এমএস |
গোটোব্লাস 2 (2 সিপিইউ) | 139 এমএস | 1009 এমএস | 3690 এমএস |
গোটোব্লাস 2 (8 সিপিইউ) | 54 এমএস | 389 এমএস | 1250 এমএস |
ম্যাক ওএস এক্স (1 সিপিইউ) | 143 এমএস | 1060 এমএস | 3605 এমএস |
ম্যাক সার্ভার (1 সিপিইউ) | 92 এমএস | 714 এমএস | 2130 এমএস |

বিন্দু পণ্য বেঞ্চমার্ক - চার্ট

বেঞ্চমার্ক স্যুট

কোড :
মাপদণ্ডের স্যুট সম্পর্কে অতিরিক্ত তথ্যের জন্য এখানে দেখুন

ফলাফল :

    সিস্টেম | eigenvalues ​​| এসভিডি | ডিট | inv | বিন্দু |
নেটলিব বিএলএএস | 1688 এমএস | 13102 এমএস | 438 এমএস | 2155 এমএস | 3522 এমএস |
আটলাস (1 সিপিইউ) | 1210 এমএস | 5897 এমএস | 170 এমএস | 560 এমএস | 893 এমএস |
এমকেএল (1 সিপিইউ) | 691 এমএস | 4475 এমএস | 141 এমএস | 450 এমএস | 736 এমএস |
এমকেএল (2 সিপিইউ) | 552 এমএস | 2718 এমএস | 96 এমএস | 267 এমএস | 423 এমএস |
এমকেএল (8 সিপিইউ) | 525 এমএস | 1679 এমএস | 60 এমএস | 137 এমএস | 197 এমএস |  
গোটোব্লাস 2 (1 সিপিইউ) | 2124 এমএস | 4636 এমএস | 147 এমএস | 456 এমএস | 743 এমএস |
গোটোব্লাস 2 (2 সিপিইউ) | 1560 এমএস | 3278 এমএস | 116 এমএস | 295 এমএস | 460 এমএস |
গোটোব্লাস 2 (8 সিপিইউ) | 741 এমএস | 2914 এমএস | 82 এমএস | 262 এমএস | 192 এমএস |
ম্যাক ওএস এক্স (1 সিপিইউ) | 948 এমএস | 4339 এমএস | 151 এমএস | 318 এমএস | 566 এমএস |
ম্যাক সার্ভার (1 সিপিইউ) | 1033 এমএস | 3645 এমএস | 99 এমএস | 232 এমএস | 342 এমএস |

বেঞ্চমার্ক স্যুট - চার্ট

স্থাপন

ইনস্টলেশন MKL সম্পূর্ণ ইন্টেল কম্পাইলার সুইট যা বেশ সহজ ইনস্টল অন্তর্ভুক্ত করা হয়েছে। তবে কিছু বাগ / ইস্যুগুলির কারণে এমকেএল সমর্থনের সাথে নম্পিকে কনফিগার এবং সংকলনটি বেশ ঝামেলা হয়েছিল was

গোটোব্লাস 2 একটি ছোট প্যাকেজ যা সহজেই ভাগ করা লাইব্রেরি হিসাবে সংকলন করা যায়। তবে কোনও বাগের কারণে আপনাকে ভাগ করে নেওয়া লাইব্রেরিটি নম্পটি দিয়ে ব্যবহার করার জন্য এটি নির্মাণের পরে পুনরায় তৈরি করতে হবে।
এই বিল্ডিংয়ের পাশাপাশি এটি একাধিক লক্ষ্য প্ল্যাটফর্মের কারণে কোনও কারণে কার্যকর হয়নি। সুতরাং আমাকে প্রতিটি প্ল্যাটফর্মের জন্য একটি .so ফাইল তৈরি করতে হয়েছিল যার জন্য আমি একটি অনুকূলিত libgoto2.so ফাইল রাখতে চাই।

আপনি উবুন্টু এর সংগ্রহস্থল থেকে numpy ইনস্টল করা হলে এটি স্বয়ংক্রিয়ভাবে ইনস্টল করবে ও কনফিগার numpy ব্যবহার করতে এটলাস । উত্স থেকে আটলাস ইনস্টল করতে কিছু সময় নিতে পারে এবং কিছু অতিরিক্ত পদক্ষেপের প্রয়োজন (ফোর্ট্রান ইত্যাদি)।

আপনার সাথে একটি Mac OS X এর মেশিনে numpy ইনস্টল করা হলে Fink বা ম্যাক বন্দর এটা হয় কনফিগার numpy ব্যবহার করতে হবে এটলাস বা অ্যাপলের ত্বরান্বিত ফ্রেমওয়ার্ক । আপনি numpy.core._dotblas ফাইলে ldd চালিয়ে বা numpy.show_config () এ কল করে পরীক্ষা করতে পারেন ।

উপসংহার

MKL সঞ্চালিত সেরা ঘনিষ্ঠভাবে অনুসরণ GotoBlas2
ইন eigenvalue পরীক্ষা GotoBlas2 আশ্চর্যজনক খারাপ প্রত্যাশিত সময়ের চেয়ে বেশি সম্পাদন করে। কেন জানি এটি নিশ্চিত নয়।
অ্যাপলের এক্সিলারেট ফ্রেমওয়ার্ক বিশেষত একক থ্রেড মোডে (অন্যান্য বিএলএএস বাস্তবায়নের তুলনায়) খুব ভাল অভিনয় করে।

উভয় GotoBlas2 এবং MKL থ্রেডের সংখ্যা সঙ্গে খুব ভাল স্কেল। সুতরাং যদি আপনাকে একাধিক থ্রেডে চালানো বড় ম্যাট্রিকগুলি মোকাবেলা করতে হয় তবে অনেক সাহায্য করবে।

যে কোনও ক্ষেত্রে ডিফল্ট নেটলিব ব্লাস বাস্তবায়ন ব্যবহার করবেন না কারণ এটি কোনও গুরুতর গণনামূলক কাজের জন্য খুব ধীর।

আমাদের ক্লাস্টার আমি এগুলিও ইনস্টল এএমডির এর ACML এবং কর্মক্ষমতা অনুরূপ ছিল MKL এবং GotoBlas2 । আমার কোন নম্বর শক্ত নেই।

আমি ব্যক্তিগতভাবে গোটোব্লাস 2 ব্যবহার করার পরামর্শ দেব কারণ এটি ইনস্টল করা সহজ এবং এটি নিখরচায়।

আপনি যদি সি ++ / সি কোড করতে চান তবে ইগিন 3 যা কিছু ক্ষেত্রে এমকেএল / গোটোব্লাস 2 কে ছাড়িয়ে যায় এবং এটি ব্যবহার করাও সহজ pretty


এই বিস্তৃত উত্তরের জন্য আপনাকে অনেক ধন্যবাদ!
ওল্টন

খুব ব্যাপক, আপনাকে ধন্যবাদ! আমি অবাক হয়েছি, তিন বছর পরেও, ওপেনব্ল্যাএলএস (যতদূর আমি জানি, এটি গোটোব্ল্যাসের বংশধর) আরও ভাল পারফর্ম করবে। আমি কোথাও পড়েছি যে এটি এমকেএলকে ছাড়িয়ে যায় তবে এখনই উত্সটি খুঁজে পাচ্ছে না।

ধন্যবাদ! এটি আমার ইমপ্রেশন টো 0 (আমি ভাবছিলাম যে এটি কেবল আমার ইনস্টলেশন ছিল কিনা): মাইক্রিসগুলি যখন ডায়াগোনালাইজিংয়ের কথা আসে তখন ওপেনবিএলএস মাল্টি-থ্রেডেড মোডে এত ভাল পারফর্ম করে না (আমি ওপেনবিএলএসের সাথে সংযুক্ত যা স্কিপিতে তির্যক আকার ধারণ করে)।

@ উইলিয়াম: সাধারণত আপনাকে স্কিপিটিকে ওপেনব্লাসের সাথে বিশেষভাবে লিঙ্ক করার প্রয়োজন হয় না কারণ এটি ইনস্টলের সময় নম্পি কনফিগারেশন ব্যবহার করবে এবং বেশিরভাগ বিএলএএস / ল্যাপাক কলগুলি যেভাবেই অলস দিকে ফরোয়ার্ড করা হবে। সুতরাং যদি উদাসীনগুলি ওপেনব্লাসের বিরুদ্ধে সঠিকভাবে সংযুক্ত থাকে তবে সবকিছু ঠিকঠাক করা উচিত।
মিট

@ Üমিট: ধন্যবাদ! আমি এখন এমকেএল এর সাথে লিঙ্ক করতে নাম্পি সেটআপ করার চেষ্টা করছি।

20

এখানে আরও একটি মাপদণ্ড রয়েছে (লিনাক্সে, কেবল টাইপ করুন make): http://dl.roidbox.com/u/5453551/blas_call_benchmark.zip

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

আমি বড় ম্যাট্রিক্সের বিভিন্ন পদ্ধতির মধ্যে নম্পি, সিটিপস এবং ফোর্টরানের মধ্যে মূলত কোনও পার্থক্য দেখতে পাচ্ছি না। (সি ++ এর পরিবর্তে ফোর্টরান --- এবং এটি যদি গুরুত্বপূর্ণ হয় তবে আপনার মানদণ্ডটি সম্ভবত ভেঙে গেছে))

CalcTimeC ++ এ আপনার ফাংশনে মনে হচ্ছে একটি চিহ্নের ত্রুটি রয়েছে। ... + ((double)start.tv_usec))পরিবর্তে হওয়া উচিত ... - ((double)start.tv_usec))সম্ভবত আপনার বেঞ্চমার্কে অন্যান্য বাগ রয়েছে, যেমন, বিভিন্ন বিএলএএস লাইব্রেরি বা বিভিন্ন বিএলএএস সেটিংসের সাথে তুলনা করে যেমন থ্রেডের সংখ্যা, বা আসল সময় এবং সিপিইউ সময়ের মধ্যে?

সম্পাদনা : ফাংশনটিতে ধনুর্বন্ধনী গণনা করতে ব্যর্থ CalcTime- এটি ঠিক আছে।

গাইডলাইন হিসাবে: আপনি যদি কোনও মানদণ্ড করেন, দয়া করে সর্বদা কোথাও কোথাও সমস্ত কোড পোস্ট করুন । পূর্ণাঙ্গ কোড না রেখে বিশেষত অবাক হওয়ার সময়, মানদণ্ডে মন্তব্য করা সাধারণত ফলদায়ক হয় না।


কোন BLAS Numpy এর সাথে যুক্ত রয়েছে তা খুঁজে পেতে, করুন:

y পাইথন
পাইথন ২.7.২++ (ডিফল্ট, আগস্ট 16 2011, 07:24:41) 
[জিসিসি 4.6.1] লিনাক্স 2 এ
আরও তথ্যের জন্য "সহায়তা", "কপিরাইট", "ক্রেডিট" বা "লাইসেন্স" টাইপ করুন।
>>> numpy.core._dotblas আমদানি করুন
>>> numpy.core._dotblas .__ ফাইল__
'/Usr/lib/pymodules/python2.7/numpy/core/_dotblas.so'
>>> 
d এলডিডি / ওএসআর / লিব / অ্যাপোডিউলস / স্পিথন ২..7/নম্পি / কোর /_ডটব্লাস.সো
    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 আমদানি করতে না পারলে, আপনার নম্পি তার BLAS এর অভ্যন্তরীণ ফ্যালব্যাক অনুলিপিটি ব্যবহার করছেন, যা ধীর, এবং পারফরম্যান্স কম্পিউটিংয়ে ব্যবহৃত হবে না! নীচে @ ওোল্টানের উত্তরটি ইঙ্গিত দেয় যে তিনি নম্পি বনাম সিটিপস + বিএলএএস-তে যে পার্থক্য দেখেন তার ব্যাখ্যা এটি।

পরিস্থিতি সমাধানের জন্য আপনার প্রয়োজন হয় আটলাস বা এমকেএল --- এই নির্দেশাবলী যাচাই করুন: http://scipy.org/Installing_SciPy/Linux বেশিরভাগ লিনাক্স ডিস্ট্রিবিউশনগুলি এ্যাটলাস সহ শিপ করা হয়, তাই সর্বোত্তম বিকল্পটি তাদের libatlas-devপ্যাকেজ ইনস্টল করা (নাম পরিবর্তিত হতে পারে) ।


আমি তোমার মানদণ্ড চালিয়েছি; ফলাফলগুলি একই
jfs

আপনার পোস্টের জন্য আপনাকে অনেক ধন্যবাদ। আমি এই ফলাফল সঙ্গে আপনার মানদণ্ড চালানো । সুতরাং আমি আপনার পুনরুত্পাদন করতে পারবেন না। আমার নিম্পি কোনটি BLAS ব্যবহার করছে তা যাচাই করতে: আমি পারছি না import numpy.core._dotblas। এখানে সমস্যা কি হতে পারে? অন্যের পরীক্ষা করার জন্য আমি আমার বেঞ্চমার্কটিকে একটি মেকফাইল লেখার বিষয়টি পরিষ্কার করার চেষ্টা করব।
ওল্টন

2
@ ওল্টান: আপনি numpy.core আমদানি করতে পারবেন না এই কথাটি ।_ডটব্লাসের অর্থ হ'ল আপনার নিম্পি আপনার BLAS লাইব্রেরির চেয়ে BLAS এর অভ্যন্তরীণ ফ্যালব্যাক অনুলিপি ( ধীর , এবং পারফরম্যান্স কম্পিউটিংয়ে ব্যবহার করার উদ্দেশ্যে নয়!) ব্যবহার করছেন means আপনার সিস্টেমে এটি বেঞ্চমার্ক থেকে প্রাপ্ত ফলাফলগুলি ব্যাখ্যা করে। পরিস্থিতি সমাধানের জন্য, আপনাকে একটি বিএলএএস সংস্করণ ইনস্টল করতে হবে নম্পি --- এর সাথে কাজ করতে পারে --- যার অর্থ এটি এ্যাটলাস বা এমকেএল। এখানে নির্দেশাবলীর একটি সেট রয়েছে: scipy.org/Installing_SciPy/Linux
pv।

@ পিভি .: আপনি ফলাফল তুলনা করতে ওল্টনের বেঞ্চমার্ক চালাতে পারেন?
jfs

1
ম্যাক এ, আপনি লিনাক্সotool -Lldd
রিচভেল

9

আপনার বিশ্লেষণের সাথে আপনি যে কঠোরতা দেখিয়েছেন তা দেখে আমি এখন পর্যন্ত প্রাপ্ত ফলাফল দেখে অবাক হয়েছি। আমি এটিকে একটি 'উত্তর' হিসাবে রেখেছি তবে কেবলমাত্র মন্তব্যটির জন্য এটি অনেক দীর্ঘ এবং একটি সম্ভাবনা সরবরাহ করে (যদিও আমি আশা করি আপনি এটি বিবেচনা করেছেন)।

আমি ভেবে দেখেছি যে নপি / পাইথন পদ্ধতির যুক্তিসঙ্গত জটিলতার ম্যাট্রিক্সের জন্য খুব বেশি ওভারহেড যুক্ত হবে না, যেহেতু জটিলতা বাড়ায়, অজগর অংশ নেওয়ার অনুপাতটি কম হওয়া উচিত। আমি গ্রাফের ডানদিকে ফলাফলগুলিতে আরও আগ্রহী, তবে সেখানে দেখানো প্রস্থের তাত্পর্যপূর্ণ হওয়ার ক্রম বিরক্তিকর হবে।

আমি অবাক হয়েছি আপনি যদি সেরা অ্যালগরিদম ব্যবহার করেন যা নম্পুদের পক্ষে উত্সাহ অর্জন করতে পারে। লিনাক্সের জন্য সংকলন গাইড থেকে:

"এফএফটিডাব্লু (৩.১.২) তৈরি করুন: সাইপপি সংস্করণ> = 0.7 এবং নম্পি> = 1.2: লাইসেন্স, কনফিগারেশন এবং রক্ষণাবেক্ষণ সমস্যার কারণে এফএফটিডাব্লু'র বিজ্ঞান বিজ্ঞান> = 0.7 এবং নুমপি> = 1.2 এর সংস্করণগুলিতে সরানো হয়েছে Instead পরিবর্তে এখন ব্যবহার হয় ।। একটি বিল্ট-ইন fftpack সংস্করণ একটি দম্পতি উপায়ে FFTW গতি যদি আপনার বিশ্লেষণ ডাউনগ্রেড একটি Numpy / Scipy সংস্করণ যা সমর্থন করার জন্য প্রয়োজনীয় সুবিধা গ্রহণ করতে আছে ইনস্টল করুন অথবা FFTW আপনার নিজস্ব মোড়কের তৈরি দেখুন।। HTTP: একটি অনুমোদনহীন উদাহরণ হিসাবে //developer.berlios.de/projects/pyfftw/ । "

আপনি কি এমপিএল দিয়ে আকাঙ্ক্ষা সঙ্কলন করেছেন? ( http://software.intel.com/en-us/articles/intel-mkl/ )। আপনি যদি লিনাক্সের উপর চালিয়ে যাচ্ছেন তবে এমকিএল দিয়ে নম্পি সংকলনের জন্য নির্দেশাবলী এখানে রয়েছে: 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 

আপনি যদি উইন্ডোতে থাকেন তবে আপনি এমকেএল সহ একটি সংকলিত বাইনারি পেতে পারেন, (এবং পাইফটডাব্লু এবং আরও অনেক সম্পর্কিত আলগোরিদিমও পেতে পারেন): http://www.lfd.uci.edu/~gohlke/pythonlibs/ এর সাথে ফ্লুরোসেন্স ডায়নামিক্স, ইউসি ইরভিনের ল্যাবরেটরিতে ক্রিস্টোফ গহলকের প্রতি কৃতজ্ঞতার debtণ।

ক্যাভ্যাট, উভয় ক্ষেত্রেই অনেক লাইসেন্সিং ইস্যু এবং সে সম্পর্কে সচেতন থাকতে হবে, তবে ইন্টেল পৃষ্ঠা সেগুলি ব্যাখ্যা করে। আবার, আমি কল্পনা করে নিয়েছি আপনি এটি বিবেচনা করেছেন, তবে যদি আপনি লাইসেন্সিং প্রয়োজনীয়তাগুলি পূরণ করেন (যা লিনাক্সের উপর করা খুব সহজ), তবে এফএফটিডাব্লু ছাড়াই একটি সহজ স্বয়ংক্রিয় বিল্ড ব্যবহারের সাথে তুলনামূলকভাবে অদ্ভুত অংশটিকে গতিময় করে তুলবে। আমি এই থ্রেডটি অনুসরণ করতে আগ্রহী এবং অন্যরা কী ভাববে তা দেখতে আগ্রহী। নির্বিশেষে, দুর্দান্ত কঠোরতা এবং দুর্দান্ত প্রশ্ন। এটি পোস্ট করার জন্য ধন্যবাদ।


আপনার বিস্তৃত "মন্তব্য" করার জন্য আপনাকে ধন্যবাদ ^^। আমার অজগর / নম্পি / বিএলএএস সেটআপটি পরিষ্কার করতে: আমি এই ইনস্টলেশন গাইডটি অনুসরণ করেছি followed আমি একটি লিনাক্স ওএসে আছি এবং সংস্করণগুলি হ'ল পাইথন ২.7, স্কিপি ০.৯ নম্পি ১.6। দুর্ভাগ্যক্রমে আমি হাতের আগে এফএফটিডাব্লু তৈরি করি নি, এমকিএলও ব্যবহার করি নি ...
ওল্টন

একভাবে, এটি ভাগ্যবান। এর অর্থ অজগর ফলাফলের উন্নতির জন্য বিশাল জায়গা রয়েছে এবং এটি মনে হচ্ছে আপনি পাইথন ব্যবহার করতে চান। আমি মনে করি আপনি যদি আপনার বিল্ডটি লিঙ্কটিতে প্রদর্শিত একটিতে সংশোধন করেন তবে আপনি নম্পতির গতির সাথে আরও সুখী হবেন, যদিও আমি এখনও আপনার সি ++ বাস্তবায়নের সাথে তুলনা করে এটি দেখতে মুগ্ধ হব।
অপমান

আপনিও আটলাস তৈরির চেষ্টা করতে পারেন, তবে এটি আমার পারফরম্যান্সের প্রয়োজনের জন্য অনেক বেশি মাথা ব্যথার মতো শোনাচ্ছে, তাই আমার কোনও অভিজ্ঞতা নেই। আমি কল্পনা করি আপনি যদি অজগর ব্যবহার করতে আগ্রহী হন তবে সি ++ ব্যবহার করতে সক্ষম হন তবে এমন কিছু বিষয় থাকতে হবে যেখানে প্রচুর বিশেষ সংকলনের সেটআপ ব্যয়টি ভাষার সঞ্চয়কে ছাড়িয়ে যাবে এবং সি ++ করা সহজ হবে। তবে এমকেএল এবং ফাফটাব্লু উভয়ই বেশ সোজা হওয়া উচিত।
অপমান

1
বর্তমানে এমকেএল, এক্সিলারেট এবং ওপেনবিএলএস পারফরম্যান্সে একই রকম। যদিও ওপেনব্ল্যাএলস এমকেএল-এর চেয়ে বেশি স্কেলেবল ble
স্টুরলা মোল্ডেন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.