ম্যাট্রিক্স গুণমানের ক্ষেত্রে এত দ্রুত কেন?


190

আমি সিইউডিএ, সি ++, সি #, জাভা দিয়ে কয়েকটি মানদণ্ড তৈরি করছি এবং যাচাইকরণ এবং ম্যাট্রিক্স উত্পাদনের জন্য ম্যাটল্যাব ব্যবহার করছি। আমি যখন ম্যাটল্যাবের সাথে ম্যাট্রিক্স গুণ করি 2048x2048এবং আরও বড় ম্যাট্রিকগুলি প্রায় তাত্ক্ষণিকভাবে গুণিত হয়।

             1024x1024   2048x2048   4096x4096
             ---------   ---------   ---------
CUDA C (ms)      43.11      391.05     3407.99
C++ (ms)       6137.10    64369.29   551390.93
C# (ms)       10509.00   300684.00  2527250.00
Java (ms)      9149.90    92562.28   838357.94
MATLAB (ms)      75.01      423.10     3133.90

কেবল সিইডিডিএই প্রতিযোগিতামূলক, তবে আমি ভেবেছিলাম যে কমপক্ষে সি ++ কিছুটা কাছাকাছি হবে এবং 60 গুণ কম নয়। সি # ফলাফল সম্পর্কে কী ভাবতে হয় তাও আমি জানি না। অ্যালগরিদম সি ++ এবং জাভা হিসাবে একই, কিন্তু এ 2048থেকে একটি বিশাল লাফ আছে 1024

ম্যাটল্যাব এত দ্রুত ম্যাট্রিক্সের গুণকে কীভাবে সম্পাদন করছে?

সি ++ কোড:

float temp = 0;
timer.start();
for(int j = 0; j < rozmer; j++)
{
    for (int k = 0; k < rozmer; k++)
    {
        temp = 0;
        for (int m = 0; m < rozmer; m++)
        {
            temp = temp + matice1[j][m] * matice2[m][k];
        }
        matice3[j][k] = temp;
    }
}
timer.stop();

14
সম্ভবত এটি কোন প্রশ্ন আপনি কোন অ্যালগরিদম ব্যবহার করেন।
রবার্ট জে।

24
নিশ্চিত করুন যে মতলব আপনাকে ফল দিচ্ছে না, এটি একটি জঘন্য জন্তু। প্রথমে নিশ্চিত করুন গণনাটি আসলে সম্পাদিত হচ্ছে এবং তারপরে তুলনা করুন।
রুবেনভ

27
ল্যাপাক এবং ভেক্টরাইজেশন। ম্যাথ ওয়ার্কস
জেমস

10
আমি আসলেই মনে করি যে এই পোস্টটি সত্যই আকর্ষণীয় তবে আমি আরও যথাযথ মানদণ্ড দেখতে চাই। উদাহরণস্বরূপ, আমি মনে করি যে মাতলাব আর ২০১১ এটি স্বয়ংক্রিয়ভাবে মাল্টিথ্রেডিং ব্যবহার করছে এবং ম্যাট্রিক্সের গুণগুলি ইন্টেলের এমকেএল / ব্লেস লাইব্রেরি ব্যবহার করে প্রয়োগ করা হবে। সুতরাং, আমি অনুমান করব যে সি ++ দ্রুততর হয় যদি কেউ ম্যাট্রিক্স গুণণের জন্য একটি এমকিএল কল ব্যবহার করে। তাহলে মাতলাবের ওভারহেড কী হবে তা নিয়ে প্রশ্ন উঠবে। আমি জানি যে এটি ম্যাট্রিক্স গুণনের অতিরিক্ত বিবরণের উপর নির্ভর করে তবে উপরের সংখ্যাগুলি এখনই অর্থহীন।
লুকাস

1
আপনি বড় বর্গক্ষেত্রের ম্যাট্রিক্স গুণণের জন্য চলমান সময় হে (এন ^ 2.81) "স্ট্র্যাসেন অ্যালগরিদম" ব্যবহার করতে পারেন যা ও (n ^ 3) এ চলিত দেশীয় গুণণের চেয়ে 10x প্রায় দ্রুত। এছাড়াও এসএসই / এভিএক্স কোড প্রয়োগের জন্য প্রায় 8-20x দ্রুত পেতে আপনাকে সহায়তা করতে পারে। সব মিলিয়ে আপনার ম্যাট্লাবের চেয়ে দ্রুত প্রয়োগ করতে পারে।
Uাবির জিয়াঁ

উত্তর:


85

টেসলা সি 2070 সহ একটি মেশিনে MATLAB R2011a + সমান্তরাল কম্পিউটিং টুলবক্স ব্যবহার করে আমার ফলাফল এখানে :

>> A = rand(1024); gA = gpuArray(A);
% warm up by executing the operations a couple of times, and then:
>> tic, C = A * A; toc
Elapsed time is 0.075396 seconds.
>> tic, gC = gA * gA; toc
Elapsed time is 0.008621 seconds.

ম্যাটল্যাব ম্যাট্রিক্স গুণনের জন্য উচ্চতর অনুকূলিত লাইব্রেরি ব্যবহার করে যার কারণে প্লেইন এমএটিএলবি ম্যাট্রিক্সের গুণ এত দ্রুত। gpuArrayসংস্করণ ব্যবহার করে ম্যাগমা

একটি টেসলা কে20 সি সহ একটি মেশিনে আর 2014 a ব্যবহার করে আপডেট করুন এবং নতুন timeitএবং gputimeitফাংশনগুলি:

>> A = rand(1024); gA = gpuArray(A);
>> timeit(@()A*A)
ans =
    0.0324
>> gputimeit(@()gA*gA)
ans =
    0.0022

16 শারীরিক কোর এবং একটি টেসলা ভি 100 সহ একটি WIN64 মেশিনে R2018b ব্যবহার করে আপডেট করুন:

>> timeit(@()A*A)
ans =
    0.0229
>> gputimeit(@()gA*gA)
ans =
   4.8019e-04

(এনবি: এক পর্যায়ে (ঠিক তখনই আমি ভুলে যাই) gpuArrayম্যাগমা থেকে চুব্লাসে স্যুইচ করেছিলাম - ম্যাগমা এখনও কিছু gpuArrayক্রিয়াকলাপের জন্য ব্যবহৃত হয় )


কেন এই ব্যাপার?
ম্যাড পদার্থবিদ

কী ব্যাপার? আমি ম্যাটল্যাব কর্তৃক বিভিন্ন পরিস্থিতিতে ব্যবহৃত লাইব্রেরিগুলিতে কিছুটা অন্তর্দৃষ্টি দেওয়ার চেষ্টা করছিলাম যাতে ম্যাটল্যাবের কার্য সম্পাদন কেন ভাল - অর্থাত এটি উচ্চ-অনুকূলিত সংখ্যক লাইব্রেরি ব্যবহার করে।
এড্রিক

175

এই ধরণের প্রশ্নটি পুনরাবৃত্তি হচ্ছে এবং "এমএটিএলবি উচ্চতর অনুকূলিত লাইব্রেরি ব্যবহার করে" বা স্ট্যাক ওভারফ্লোতে একবারের জন্য "এমএটিএলবি এমকেএল ব্যবহার করে" এর চেয়ে আরও স্পষ্ট উত্তর দেওয়া উচিত।

ইতিহাস:

ম্যাট্রিক্স গুণ (একসাথে ম্যাট্রিক্স-ভেক্টর, ভেক্টর-ভেক্টর গুণ এবং ম্যাট্রিক্সের পচন অনেক) লিনিয়ার বীজগণিতের সবচেয়ে গুরুত্বপূর্ণ সমস্যা (যা)। ইঞ্জিনিয়াররা প্রথম থেকেই কম্পিউটারগুলির মাধ্যমে এই সমস্যাগুলি সমাধান করে চলেছেন।

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

Blas:

বিএলএইএস স্তর 1 (প্রথম সংস্করণ যা স্কেলার-ভেক্টর এবং ভেক্টর-ভেক্টর অপারেশনগুলি সংজ্ঞায়িত করে) থেকে স্তর 2 (ভেক্টর-ম্যাট্রিক্স অপারেশন) থেকে স্তর 3 (ম্যাট্রিক্স-ম্যাট্রিক্স অপারেশন) এ বিবর্তিত হয়েছে এবং আরও "আরও অনেকগুলি কার্নেল" সরবরাহ করেছে যাতে আরও স্ট্যান্ডার্ড করা হয় এবং মৌলিক রৈখিক বীজগণিত অপারেশন। মূল ফোরট্রান 77 বাস্তবায়ন নেটলিবের ওয়েবসাইটে এখনও উপলব্ধ ।

উন্নত পারফরম্যান্সের দিকে:

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

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

ম্যাট্রিক্স গুণনের প্রযুক্তিগত বিবরণ:

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

মূলত, আপনি যখন সরবরাহ করেছেন সি ++ কোডে আপনার গুণটি সম্পাদন করেন, আপনি মোটেই ক্যাশে-বান্ধব নন। যেহেতু আমি সন্দেহ করি যে আপনি সারি সারিগুলিতে পয়েন্টারের একটি অ্যারে তৈরি করেছেন তাই আপনার "অভ্যন্তরীণ লুপে" ম্যাটিস 2 "এর কে-থ্রি কলামে আপনার প্রবেশাধিকারগুলি matice2[m][k]খুব ধীর গতির। প্রকৃতপক্ষে, আপনি অ্যাক্সেস করার সময় matice2[0][k], আপনাকে অবশ্যই আপনার ম্যাট্রিক্সের অ্যারে 0 এর K-th উপাদানটি পেতে পারেন। তারপরে পরবর্তী পুনরাবৃত্তিতে আপনাকে অবশ্যই অ্যাক্সেস করতে হবে matice2[1][k]যা অন্য অ্যারে (অ্যারে 1) এর K-th উপাদান। তারপরে পরবর্তী পুনরাবৃত্তিতে আপনি আরও একটি অ্যারে অ্যাক্সেস করতে পারবেন এবং আরও কিছু ... পুরো ম্যাট্রিক্স যেহেতু matice2সর্বোচ্চ ক্যাশে ফিট করতে পারে না (এটি 8*1024*1024বড় বাইট) তাই প্রোগ্রামটি অবশ্যই প্রচুর হারায় মূল স্মৃতি থেকে কাঙ্ক্ষিত উপাদানটি আনতে হবে সময়।

আপনি যদি কেবল ম্যাট্রিক্স স্থানান্তর করেছেন, যাতে অ্যাক্সেসগুলি মেমরির সংলগ্ন ঠিকানাগুলিতে থাকে, আপনার কোডটি ইতিমধ্যে আরও দ্রুত চলবে কারণ এখন সংকলক একই সাথে ক্যাশে পুরো সারি লোড করতে পারে। এই পরিবর্তিত সংস্করণটি কেবল চেষ্টা করে দেখুন:

timer.start();
float temp = 0;
//transpose matice2
for (int p = 0; p < rozmer; p++)
{
    for (int q = 0; q < rozmer; q++)
    {
        tempmat[p][q] = matice2[q][p];
    }
}
for(int j = 0; j < rozmer; j++)
{
    for (int k = 0; k < rozmer; k++)
    {
        temp = 0;
        for (int m = 0; m < rozmer; m++)
        {
            temp = temp + matice1[j][m] * tempmat[k][m];
        }
        matice3[j][k] = temp;
    }
}
timer.stop();

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

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


2
ক্যাশে লাইনের আকারগুলিতে ক্যাশে আকার এবং ফিটিং ডেটার গুরুত্ব এবং আপনার যে সমস্যাগুলি মাল্টি-থ্রেডযুক্ত সমাধানের সাথে থাকতে পারে যা উত্সটিতে কোনও ভাগ করা ডেটা নেই তবে হার্ডওয়ারে ভাগ করা ডেটা দিয়ে শেষ করতে পেরে আমি কেবল একটি স্কট মিয়ার্স ভিডিও দেখেছি / কোর-থ্রেড স্তর: youtu.be/WDIkqP4JbkE
উইলসি

40

এই কারণেই । ম্যাটল্যাব আপনার সি ++ কোডে যেভাবে করেছেন প্রতিটি একক উপাদানকে লুপ করে একটি মজাদার ম্যাট্রিক্স গুণকে সম্পাদন করে না।

অবশ্যই আমি ধরে নিচ্ছি যে আপনি C=A*Bনিজেই একটি গুণ গুণ লিখার পরিবর্তে ব্যবহার করেছেন।


19

ম্যাটল্যাব কিছুক্ষণ আগে ল্যাপাক সংযুক্ত করেছিল, তাই আমি ধরে নিই যে তাদের ম্যাট্রিক্সের গুণটি অন্তত সেই দ্রুত কোনও কিছু ব্যবহার করে। ল্যাপাক উত্স কোড এবং ডকুমেন্টেশন সহজেই উপলব্ধ।

আপনি গোটো এবং ভ্যান ডি গিজেনের কাগজটি "হাই-পারফরম্যান্স ম্যাট্রিক্সের গুণায়নের অ্যানাটমি" http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.140.1785&rep=rep1&type=pdf এও দেখতে পাবেন


7
ম্যাটল্যাব ইন্টেল এমকেএল লাইব্রেরি ব্যবহার করে যা বিএলএএস / ল্যাপাক রুটিনগুলির অনুকূলিতকরণ বাস্তবায়ন সরবরাহ করে: stackoverflow.com/a/16723946/97160
Amro

11

উত্তরটি ল্যাপাক এবং বিএলএএস লাইব্রেরিগুলি ম্যাটলিক্স অপারেশনে ম্যাটল্যাবকে অন্ধভাবে দ্রুততর করে তোলে, ম্যাটল্যাব-এ লোকেরা কোনও মালিকানাধীন কোড নয়।

ব্যবহার করুন LAPACK এবং / অথবা Blas ম্যাট্রিক্স অপারেশন জন্য আপনার সি ++ কোডে লাইব্রেরি ও আপনি ম্যাটল্যাব হিসাবে অনুরূপ কর্মক্ষমতা পাওয়া উচিত। এই গ্রন্থাগারগুলি যে কোনও আধুনিক সিস্টেমে অবাধে উপলভ্য হওয়া উচিত এবং কয়েক দশক ধরে একাডেমিয়ায় অংশগুলি বিকাশ করা হয়েছিল। নোট করুন যে কয়েকটি বদ্ধ উত্স যেমন ইনটেল এমকেএল সহ একাধিক বাস্তবায়ন রয়েছে ।

কীভাবে বিএলএএস উচ্চ কর্মক্ষমতা পায় তার একটি আলোচনা এখানে পাওয়া যায়।


বিটিডাব্লু, ল্যাপাক লাইব্রেরিগুলি সরাসরি সি থেকে কল করা (তবে এটি মূল্যবান) আমার অভিজ্ঞতার গুরুতর ব্যথা। আপনার ডকুমেন্টেশন খুব স্পষ্টভাবে পড়তে হবে।


8

ম্যাট্রিক্স গুণমান করার সময়, আপনি নিষ্পাপ গুণ গুণ ব্যবহার করেন যা সময় নেয় O(n^3)

এখানে ম্যাট্রিক্স গুণিত অ্যালগরিদম রয়েছে যা লাগে O(n^2.4)। যার অর্থ n=2000আপনার অ্যালগরিদমে সেরা অ্যালগরিদমের তুলনায় times 100 গুণ বেশি গুন প্রয়োজন।
কার্যকরভাবে কার্যকর করার উপায়গুলি সম্পর্কিত আরও তথ্যের জন্য আপনার উইকিপিডিয়া পৃষ্ঠাটি ম্যাট্রিক্স গুণনের জন্য সত্যই পরীক্ষা করা উচিত।


এবং ম্যাটল্যাব সম্ভবত এই জাতীয় অ্যালগরিদম ব্যবহার করেছেন যেহেতু 1024 * 1024 ম্যাট্রিক্স গুণমানের সময়টি 2048 * 2048 ম্যাট্রিক্স গুণনের সময়ের চেয়ে 8 গুণ কম! ভাল কাজ ম্যাটল্যাব ছেলেরা।
রেনেউদ

4
আমি বরং সন্দেহ করি যে তারা তাত্ত্বিক সুবিধা থাকা সত্ত্বেও তারা "দক্ষ" গুণগত অ্যালগোরিদম ব্যবহার করেন। এমনকি স্ট্র্যাসেনের অ্যালগরিদমের বাস্তবায়নের অসুবিধা রয়েছে এবং আপনি সম্ভবত সাদামাটা সম্পর্কে পড়েছেন এমন কপারস্মিথ – উইনোগ্রাড অ্যালগরিদম ব্যবহারিক নয় (এখনই)। : এছাড়াও, সম্পর্কিত তাই থ্রেড stackoverflow.com/questions/17716565/...
Ernir

এই অ্যালগরিদম কেবলমাত্র অত্যধিক বড় ম্যাট্রিক্সের জন্য।

@Renaud। এটি তুলনামূলকভাবে ধ্রুবক ওভারহেডের সংজ্ঞা
ম্যাড পদার্থবিদ

6

আপনার মতলব সংস্করণ অনুসারে, আমি বিশ্বাস করি এটি ইতিমধ্যে আপনার জিপিইউ ব্যবহার করছে।

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

এ জাতীয় ঘটনার হাত থেকে রক্ষা পেতে, এলোমেলো সংখ্যার একটি ম্যাট্রিক্স ব্যবহার করুন এবং ফলাফলটি স্ক্রিন বা ডিস্কে বা সামসুচে মুদ্রণ করে তা নিশ্চিত করুন।


4
ভারী এমএল ব্যবহারকারী হিসাবে, আমি আপনাকে বলতে পারি তারা জিপিজিপি ব্যবহার করছে না। মাতলাব ডিও এর নতুন সংস্করণ এসএসই 1/2 ব্যবহার করুন (শেষ অবধি)। তবে আমি পরীক্ষা দিয়েছি। একটি উপাদান-ভিত্তিক গুণটি সম্পাদনকারী একটি ম্যাক্সফানশান তার চেয়ে দ্বিগুণ দ্রুত চলে A.*B। সুতরাং ওপি প্রায় অবশ্যই কিছু নিয়ে বোকা বানাচ্ছে।
কিটসুনওয়াইএমজি

6
প্যারালাল কম্পিউটিং টুলবক্স সহ মতলব একটি সিইউডিএ জিপিইউ ব্যবহার করতে পারে তবে এটি স্পষ্ট - আপনাকে জিপিইউতে ডেটা চাপতে হবে।
এড্রিক

আমি এম 1 = একক (র্যান্ড (1024,1024) * 255) ব্যবহার করি; এম 2 = একক (র‌্যান্ড (1024,1024) * 255); এবং এম 3 = এম 1 * এম 2; ... তারপরে ফ্লোটের বাইনারি ফাইলটিতে লিখুন, এটি খুব দ্রুত সম্পন্ন হয়েছে।
নেকড়ে

3

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

আমি নিশ্চিত নই কি জিপিইউ গুণ কিন্তু সম্ভবত ভালো কিছু জন্য লাইব্রেরী ম্যাটল্যাব ব্যবহার এনভিডিয়া CUBLAS


1
আপনি ঠিক বলেছেন, তবে আপনি কি এই উত্তরটি দেখেছেন ? তবে, আইপিপি এমকেএল নয় এবং এমকেএল আইপিপির তুলনায় অনেক উন্নত রৈখিক বীজগণিত সম্পাদন করে। এছাড়াও, আইপিপি সাম্প্রতিক সংস্করণগুলিতে তাদের ম্যাট্রিক্স গণিতের মডিউলটিকে অবমূল্যায়ন করেছে।
chappjc

দুঃখিত, আমি
এমকেএল এর

আপনি ঠিক বলেছেন অন্য উত্তরটি এটি coversেকে ফেলেছে। এটা খুব ভার্জোজ আমি এটা মিস।
গ্রেসউইস

2

"অন্যান্য প্রোগ্রামের তুলনায় এক্সএক্সএক্স করার সময় ম্যাটল্যাব কেন দ্রুত" এর সাধারণ উত্তরটি হ'ল মাতলাব অনেকটা অন্তর্নির্মিত, অনুকূলিত ফাংশন রয়েছে।

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

এটি দুটি উপায়ে ব্যাখ্যা করা যেতে পারে:

1) সাধারণ / তাত্ত্বিক উপায়: মতলব উল্লেখযোগ্যভাবে দ্রুত হয় না, আপনি কেবল বেঞ্চমার্কটি ভুল করছেন doing

২) বাস্তবের উপায়: এই স্টাফের জন্য মতলব অনুশীলনে দ্রুততর কারণ সি ++ হিসাবে ভাষাগুলি খুব সহজেই অকার্যকর উপায়ে ব্যবহার করা হয়।


7
তিনি দুই মিনিটের মধ্যে লিখেছেন এমন একটি ক্রিয়াকলাপের গতির সাথে তিনি ম্যাটল্যাব গতির সাথে তুলনা করছেন। আমি 10 মিনিটের মধ্যে একটি দ্রুত ফাংশন, বা দুই ঘন্টার মধ্যে আরও দ্রুত ফাংশন লিখতে পারি। ম্যাটল্যাব ছেলেরা তাদের ম্যাট্রিক্সের গুণকে দ্রুত তৈরি করতে দুই ঘণ্টারও বেশি সময় ব্যয় করেছে।
gnasher729

2

তীব্র বৈসাদৃশ্যটি কেবল মাতলাবের আশ্চর্যজনক অপ্টিমাইজেশনের কারণে নয় (যেমনটি ইতিমধ্যে অন্যান্য অনেক উত্তর দ্বারা আলোচনা করা হয়েছে), কিন্তু আপনি যেমন একটি বস্তু হিসাবে ম্যাট্রিক্সটি তৈরি করেছিলেন সেইভাবেও।

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

#include <vector>

struct matrix {
    matrix(int x, int y) : n_row(x), n_col(y), M(x * y) {}
    int n_row;
    int n_col;
    std::vector<double> M;
    double &operator()(int i, int j);
};

এবং

double &matrix::operator()(int i, int j) {
    return M[n_col * i + j];
}

একই গুণক অ্যালগরিদম ব্যবহার করা উচিত যাতে ফ্লপের সংখ্যা একই হয়। (n size 3 আকারের বর্গ ম্যাট্রিক্সের জন্য)

আমি আপনাকে সময়োপযোগে জিজ্ঞাসা করছি যাতে ফলটি আপনার আগের তুলনায় তুলনীয় হয় (একই মেশিনে)। তুলনা করার সাথে আপনি ঠিক দেখিয়ে দেবেন মেমরি অ্যাক্সেসের সময়টি কতটা তাত্পর্যপূর্ণ হতে পারে!


2

এটি সি ++ এ ধীরে ধীরে কারণ আপনি মাল্টিথ্রেডিং ব্যবহার করছেন না। মূলত, যদি এ = বিসি, তারা সমস্ত ম্যাট্রিক হয়, তবে এ এর ​​প্রথম সারিকে ২ য় সারির থেকে আলাদাভাবে গণনা করা যায়, ইত্যাদি, যদি ক, বি, এবং সি সমস্ত এন-ম্যাট্রিক হয় তবে আপনি গুণ দ্বারা গতি বাড়িয়ে নিতে পারেন হিসাবে এন ^ 2 এর একটি ফ্যাক্টর

a_ {i, j} = যোগ_ {কে} বি_ {i, কে} সি_ {কে, জে

যদি আপনি ব্যবহার করেন, বলুন, আইগেন [ http://eigen.tuxfamily.org/dox/GettingStarted.html ], মাল্টিথ্রেডিং অন্তর্নির্মিত এবং থ্রেডের সংখ্যাটি সামঞ্জস্যযোগ্য।


2

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

এবং যদি আমরা আপনার গণনার ফলাফলগুলি দেখি:

             1024x1024   2048x2048   4096x4096
             ---------   ---------   ---------
CUDA C (ms)      43.11      391.05     3407.99
C++ (ms)       6137.10    64369.29   551390.93
C# (ms)       10509.00   300684.00  2527250.00
Java (ms)      9149.90    92562.28   838357.94
MATLAB (ms)      75.01      423.10     3133.90

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

ম্যাটল্যাবের সংক্ষিপ্ত ইতিহাস

নিউ মেক্সিকো বিশ্ববিদ্যালয়ের কম্পিউটার সায়েন্স বিভাগের চেয়ারম্যান ক্লিভ মোলার ১৯ 1970০ এর দশকের শেষদিকে ম্যাটল্যাব বিকাশ শুরু করেছিলেন। তিনি তার শিক্ষার্থীদের লিনপ্যাক (সংখ্যার লিনিয়ার বীজগণিত সম্পাদনের জন্য একটি সফ্টওয়্যার লাইব্রেরি) অ্যাক্সেস দেওয়ার জন্য এটি ডিজাইন করেছিলেন এবং EISPACK এ করেছিলেন(লিনিয়ার বীজগণিতের সংখ্যার গণনার জন্য একটি সফ্টওয়্যার গ্রন্থাগার) তাদের ফোর্টরান শিখতে না করে। এটি শীঘ্রই অন্যান্য বিশ্ববিদ্যালয়গুলিতে ছড়িয়ে পড়ে এবং প্রয়োগকৃত গণিত সম্প্রদায়ের মধ্যে দৃ strong় শ্রোতা খুঁজে পেয়েছিল। জ্যাক লিটল নামে একজন প্রকৌশলী ১৯৮৩ সালে স্ট্যানফোর্ড বিশ্ববিদ্যালয়ে মুলার যে সফর করেছিলেন তা নিয়ে তা প্রকাশ হয়েছিল। এর ব্যবসায়ের সম্ভাব্যতা চিহ্নিত করে তিনি মোলার এবং স্টিভ ব্যাঞ্জার্টের সাথে যোগ দিয়েছিলেন। তারা সি-তে ম্যাটল্যাব পুনরায় লিখেছিলেন এবং এর বিকাশ অব্যাহত রাখতে 1984 সালে ম্যাথ ওয়ার্কস প্রতিষ্ঠা করেছিলেন। এই পুনর্লিখিত গ্রন্থাগারগুলি JACKPAC হিসাবে পরিচিত ছিল। 2000 সালে, ম্যাটল্যাবকে ম্যাট্রিক্স ম্যানিপুলেশনের জন্য একটি নতুন সেট লাইব্রেরি ব্যবহার করার জন্য নতুন করে লেখা হয়েছিল, ল্যাপাক (সংখ্যার লিনিয়ার বীজগণিতের জন্য একটি স্ট্যান্ডার্ড সফ্টওয়্যার লাইব্রেরি)।

উৎস

চুদা সি কি?

সিইউডিএ সি ওপেনজিএল (ওপেন গ্রাফিক্স লাইব্রেরি) এর মতো ম্যাট্রিক্স গুণনের জন্য বিশেষত বিকাশকৃত গ্রন্থাগারগুলিও ব্যবহার করে । এটি জিপিইউ এবং ডাইরেক্ট 3 ডি (এমএস উইন্ডোজ) ব্যবহার করে।

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

এখানে চিত্র বর্ণনা লিখুন

CUDA প্রক্রিয়াকরণ প্রবাহের উদাহরণ:

  1. প্রধান স্মৃতি থেকে জিপিইউ মেমরিতে ডেটা অনুলিপি করুন
  2. সিপিইউ জিপিইউ কম্পিউট কার্নেল শুরু করে
  3. জিপিইউর সিউডিএ কোর সমান্তরালভাবে কার্নেল চালায়
  4. জিপিইউ মেমরি থেকে ফলাফলটিকে প্রধান মেমোরিতে অনুলিপি করুন

সিপিইউ এবং জিপিইউ এক্সিকিউশন গতির তুলনা করা

আমরা একটি মানদণ্ড চালিয়েছিলাম যেখানে আমরা একটি ইন্টেল জিয়ন প্রসেসর এক্স 5650 এর 64 এবং 128, 512, 1024, এবং 2048 এর গ্রিড আকারের 50 টি সময় পদক্ষেপগুলি কার্যকর করতে এবং তারপরে একটি এনভিআইডিআইএ টেসলা সি 2050 জিপিইউ ব্যবহার করে সময়টি পরিমাপ করেছি।

এখানে চিত্র বর্ণনা লিখুন

2048 এর গ্রিড আকারের জন্য, অ্যালগরিদম সিপিইউতে এক মিনিটেরও বেশি সময় থেকে জিপিইউতে 10 সেকেন্ডেরও কম সময়ে গণনা সময়ে 7.5x হ্রাস দেখায়। লগ স্কেল প্লটটি দেখায় যে ছোট গ্রিড আকারের জন্য সিপিইউ আসলে দ্রুত। প্রযুক্তিটি যেমন বিকশিত হয় এবং পরিপক্ক হয়, তবে, জিপিইউ সমাধানগুলি ক্রমশ ছোট সমস্যাগুলি পরিচালনা করতে সক্ষম হয়, এটি একটি প্রবণতা যা আমরা চালিয়ে যাওয়ার প্রত্যাশা করি।

উৎস

CUDA সি প্রোগ্রামিং গাইডের জন্য ভূমিকা থেকে:

রিয়েলটাইম, উচ্চ সংজ্ঞা 3D গ্রাফিক্স জন্য অতৃপ্ত বাজারের চাহিদা দ্বারা চালিত, প্রোগ্রামযোগ্য গ্রাফিক প্রসেসর ইউনিট বা জিপিইউ হিসাবে দ্বারা চিত্রিত, অসাধারণ গণনীয় অশ্বশক্তি ও খুব উচ্চ মেমরি ব্যান্ডউইডথ সঙ্গে একটি অত্যন্ত সমান্তরাল, মাল্টি, manycore প্রসেসর পরিচাযক Figure 1এবং Figure 2

চিত্র 1. সিপিইউ এবং জিপিইউর জন্য প্রতি সেকেন্ডে ফ্লোটিং-পয়েন্ট অপারেশনগুলি

এখানে চিত্র বর্ণনা লিখুন

চিত্র 2 । সিপিইউ এবং জিপিইউর জন্য মেমরি ব্যান্ডউইথ th

এখানে চিত্র বর্ণনা লিখুন

সিপিইউ এবং জিপিইউর মধ্যে ভাসমান-পয়েন্ট সামর্থ্যের মধ্যে পার্থক্যের পিছনে কারণটি হ'ল জিপিইউ গণনা-নিবিড়, অত্যন্ত সমান্তরাল গণনার জন্য বিশেষত - গ্রাফিক্সের রেন্ডারিং ঠিক কী - এবং তাই এমন ডিজাইন করা হয়েছে যে আরও ট্রানজিস্টর ডেটা প্রসেসিংয়ে নিবেদিত হয় ডেটা ক্যাচিং এবং ফ্লো নিয়ন্ত্রণের চেয়ে স্কিম্যাটিকালি চিত্র দ্বারা চিত্রিত করা Figure 3

চিত্র 3 । জিপিইউ আরও ট্রানজিস্টর ডেটা প্রসেসিংয়ে ডেভোট করে

এখানে চিত্র বর্ণনা লিখুন

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

ডেটা সমান্তরাল প্রক্রিয়াকরণ সমান্তরাল প্রক্রিয়াকরণ থ্রেডগুলিতে ডেটা উপাদানগুলিকে মানচিত্র করে। অনেকগুলি অ্যাপ্লিকেশন যা বড় ডেটা সেটগুলিকে প্রক্রিয়া করে তা কম্পিউটেশনগুলিকে গতি বাড়ানোর জন্য ডেটা সমান্তরাল প্রোগ্রামিং মডেল ব্যবহার করতে পারে। 3 ডি রেন্ডারিংয়ে, পিক্সেল এবং শীর্ষের বৃহত সেট সমান্তরাল থ্রেডগুলিতে ম্যাপ করা হয়। একইভাবে, চিত্র এবং মিডিয়া প্রসেসিং অ্যাপ্লিকেশন যেমন রেন্ডার করা ইমেজগুলির পোস্ট-প্রসেসিং, ভিডিও এনকোডিং এবং ডিকোডিং, চিত্র স্কেলিং, স্টেরিও ভিশন এবং প্যাটার্ন স্বীকৃতি সমান্তরাল প্রক্রিয়াকরণের থ্রেডগুলিতে চিত্র ব্লক এবং পিক্সেলকে মানচিত্র করতে পারে। প্রকৃতপক্ষে, চিত্রের রেন্ডারিং এবং প্রসেসিংয়ের ক্ষেত্রের বাইরের অনেক অ্যালগরিদমগুলি সাধারণ সংকেত প্রক্রিয়াকরণ বা পদার্থবিজ্ঞানের সিমুলেশন থেকে শুরু করে কম্পিউটেশনাল ফিনান্স বা কম্পিউটেশনাল বায়োলজি পর্যন্ত ডেটা সমান্তরাল প্রক্রিয়াকরণ দ্বারা ত্বরান্বিত হয়।

উৎস

উন্নত পড়া


কিছু আকর্ষণীয় বিষয়

আমি সি ++ ম্যাট্রিক্সের গুণটি লিখেছি যা মতলবের মতো দ্রুত তবে এটি কিছুটা যত্ন নিয়েছে। (এর আগে মতলব জিপিইউ ব্যবহার করছিল)।

এই উত্তর থেকে Сation ।


2
এই শেষ উদ্ধৃতিটি "সত্য" নয়, এটি খালি গর্ব করে। যে ব্যক্তি কোড পোস্ট করার পরে সে কোডটির জন্য বেশ কয়েকটি অনুরোধ পেয়েছে। কিন্তু কোনও কোড চোখে পড়েনি।
ক্রিস লুয়েঙ্গো

1
আপনি কত তাড়াতাড়ি জিপিইউতে গণনা করতে পারবেন তার বিবরণ প্রশ্নটির মোটেও সমাধান করে না। আমরা সকলেই জানি যে 128 টি ছোট কোর 2 টি বড় কোরের চেয়ে একই, একঘেয়ে কাজ আরও বেশি করতে পারে। "এবং এখন ম্যাটল্যাব এ জন্য অতিরিক্তভাবে জিপিইউ (গ্রাফিক্স প্রসেসিং ইউনিট) ব্যবহার করতে পারে” " হ্যাঁ, তবে ডিফল্টরূপে নয়। সাধারণ ম্যাট্রিক্সের গুণটি এখনও বিএলএএস ব্যবহার করে।
ক্রিস লুয়েংগো 17'19

@ ক্রিসলুয়েংগো, ঠিক আছে, এটি সত্য নয়! তাঁর "অহঙ্কারী" সম্পর্কে আপনার হয়তো অধিকার আছে - আমরা এটি সম্পর্কে জানি না এবং তিনি কেন উত্তর দেন না তা আমরা জানি না। দ্বিতীয় মন্তব্যের জন্য: জিপিইউতে গণনার বিবরণ প্রশ্নের উত্তর দেয় কারণ লিনিয়ার বীজগণিতের ম্যাট্রিক্স গুণনের ক্ষেত্রে এটি ভাসমান-পয়েন্ট অপারেশন ব্যবহার করে। সম্ভবত এটি সমস্ত পিল অনুধাবনযোগ্য নয়, তবে আমি মনে করি তাদের এই বেসিকগুলি বুঝতে হবে। অন্য ক্ষেত্রে ম্যাট্রিক্স সম্পর্কে কিছু নিবন্ধ পড়ার আগে তাদের প্রথমে এই বেসিকগুলি শিখতে হবে। এবং যদি অন্য কেউ আমাকে এটি সম্পর্কে লিখতে থাকে তবে আমি এই বিবরণটি যুক্ত করব। ধন্যবাদ!
भरতা

@ ক্রিসলুয়েংগো, আমি কথাটি লিখেছি "additionally"। এর অর্থ: এটি ব্যবহার করা যেতে পারে। এর অর্থ হ'ল স্বাভাবিক ম্যাট্রিক্সের গুণটি এখনও সফ্টওয়্যার লাইব্রেরি ব্যবহার করে। আপনি কি ভাবেন যে আমার পোস্টটি আরও বোধগম্য হতে হবে? আপনার মন্তব্যের জন্য আপনাকে ধন্যবাদ!
ভারতা
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.