ইংরেজিফরাসিস্প্যানিশ

অনওয়ার্কস ফেভিকন

mpy - ক্লাউডে অনলাইন

উবুন্টু অনলাইন, ফেডোরা অনলাইন, উইন্ডোজ অনলাইন এমুলেটর বা MAC OS অনলাইন এমুলেটরের মাধ্যমে OnWorks বিনামূল্যে হোস্টিং প্রদানকারীতে mpy চালান

এটি হল mpy কমান্ড যা আমাদের একাধিক বিনামূল্যের অনলাইন ওয়ার্কস্টেশন যেমন উবুন্টু অনলাইন, ফেডোরা অনলাইন, উইন্ডোজ অনলাইন এমুলেটর বা MAC OS অনলাইন এমুলেটর ব্যবহার করে OnWorks ফ্রি হোস্টিং প্রদানকারীতে চালানো যেতে পারে।

কার্যক্রম:

NAME এর


mpy - বার্তা পাসিং Yorick

সাইনোপিসিস


mpirun -np mp_size mpy [-জ pfile1.i [-জ pfile2.i [...]]] [ -i file1.i [-i file2.i [
...]]]
mpirun -np mp_size mpy -ব্যাচ file.i

বর্ণনাঃ


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

ব্যাখ্যা
mpy প্যাকেজ ইন্টারফেস yorick কে MPI সমান্তরাল প্রোগ্রামিং লাইব্রেরির সাথে যুক্ত করে। এমপিআই মানে
বার্তা পাসিং ইন্টারফেস; ধারণা হল yorick এর একাধিক দৃষ্টান্ত সংযুক্ত করা
বার্তার মাধ্যমে নিজেদের মধ্যে যোগাযোগ করুন। Mpy হয় সহজ, অত্যন্ত সমান্তরাল সম্পাদন করতে পারে
বিশুদ্ধ ব্যাখ্যা করা প্রোগ্রাম হিসাবে কাজ, অথবা এটি শুরু করতে পারে এবং নির্বিচারে জটিল কম্পাইল করা যেতে পারে
যে প্যাকেজগুলি কম্পাইল করা MPI API ব্যবহার করার জন্য বিনামূল্যে। ব্যাখ্যা করা API উদ্দেশ্য নয়
একটি MPI মোড়ক হতে; পরিবর্তে এটি খালি সর্বনিম্ন ছিনতাই করা হয়.

এটি mpy এর সংস্করণ 2 (2010 সালে প্রকাশিত); এটি mpy এর সংস্করণ 1 এর সাথে বেমানান
(1990-এর দশকের মাঝামাঝি সময়ে প্রকাশিত), কারণ সংস্করণ 1-এ অসংখ্য ডিজাইনের ত্রুটি ছিল
জাতিগত অবস্থা মুক্ত প্রোগ্রাম লেখা কঠিন, এবং লক্ষ লক্ষ স্কেল করা অসম্ভব
প্রসেসরের। যাইহোক, আপনি সংস্করণ 1 এর অধীনে বেশিরভাগ সংস্করণ 2 mpy প্রোগ্রামগুলি করতে পারেন
mp_include,"mpy1.i" আগে mp_include যেকোন ফাইল একটি mpy1 সমান্তরাল টাস্ক নির্ধারণ করে (যেটি হল
কোনো ফাইলে mp_task-এ কল করার আগে।)

ব্যবহার নোট
MPI পরিবেশ সত্যিই মান দ্বারা নির্দিষ্ট করা হয় না; বিদ্যমান পরিবেশ হয়
অত্যন্ত অশোধিত, এবং দৃঢ়ভাবে অ-ইন্টারেক্টিভ ব্যাচের চাকরির পক্ষে। প্রসেস সংখ্যা হয়
MPI শুরু হওয়ার আগে ঠিক করা হয়েছে; প্রতিটি প্রক্রিয়ার একটি র্যাঙ্ক আছে, একটি সংখ্যা 0 থেকে এক থেকে কম
প্রসেসের সংখ্যা। আপনি বার্তা পাঠাতে একটি ঠিকানা হিসাবে র্যাঙ্ক ব্যবহার করুন, এবং প্রক্রিয়া
বার্তাটি গ্রহণ করলে কোন র‌্যাঙ্কগুলি এটিতে বার্তা পাঠিয়েছে তা পরীক্ষা করতে পারে এবং অবশ্যই
সেই বার্তাগুলি গ্রহণ করুন।

একটি বার্তা পাসিং প্রোগ্রাম লেখার একটি প্রধান সমস্যা ঘটনা বা বার্তা পরিচালনা করা হয়
একটি অপরিকল্পিত আদেশে আগমন। MPI শুধুমাত্র নিশ্চিত করে যে বার্তাগুলির একটি ক্রম প্রেরণ করে
র‌্যাঙ্ক A থেকে B র‌্যাঙ্ক প্রেরিত অর্ডারে আসবে। এর আদেশ সম্পর্কে কোন নিশ্চয়তা নেই
তৃতীয় র্যাঙ্ক সি থেকে B-কে পাঠানো বার্তাগুলির সাথে সম্পর্কিত সেই বার্তাগুলির আগমন
বিশেষ করে, ধরুন A B কে একটি বার্তা পাঠায়, তারপর A C-কে একটি বার্তা পাঠায় (বা এমনকি বিনিময়ও করে
C এর সাথে বেশ কিছু বার্তা) যার ফলে C B কে একটি বার্তা পাঠায়। C থেকে বার্তা
A থেকে বার্তা আসার আগে B-তে পৌঁছাতে পারে। একটি MPI প্রোগ্রাম যা এটির অনুমতি দেয় না
সম্ভাবনার একটি বাগ আছে যাকে "রেসের অবস্থা" বলা হয়। রেসের অবস্থা অত্যন্ত সূক্ষ্ম হতে পারে,
বিশেষ করে যখন প্রক্রিয়ার সংখ্যা বড় হয়।

মৌলিক mpy ব্যাখ্যা করা ইন্টারফেস দুটি ভেরিয়েবল নিয়ে গঠিত:
mp_size = প্রসেসের সংখ্যা
mp_rank = এই প্রক্রিয়ার র‍্যাঙ্ক এবং চারটি ফাংশন:
mp_send, to, msg; // "কে" র‌্যাঙ্ক করতে বার্তা পাঠান
msg = mp_recv(থেকে); // "থেকে" র‌্যাঙ্ক থেকে বার্তা পান
র‌্যাঙ্ক = mp_probe(ব্লক); // মুলতুবি বার্তা প্রেরক জিজ্ঞাসা
mp_exec, স্ট্রিং; // পার্স করুন এবং প্রতিটি র‌্যাঙ্কে স্ট্রিং এক্সিকিউট করুন

আপনি একটি সমান্তরাল কাজ শুরু করতে র্যাঙ্ক 0 এ mp_exec কল করুন। যখন প্রধান প্রোগ্রাম এইভাবে তৈরি
শেষ হয়, র‍্যাঙ্ক 0 ব্যতীত অন্য সমস্ত র‍্যাঙ্ক একটি নিষ্ক্রিয় লুপে ফিরে আসে, পরেরটির জন্য অপেক্ষা করে
mp_exec. র্যাঙ্ক 0 stdin থেকে পরবর্তী ইনপুট লাইন বাছাই করে (অর্থাৎ, এটিতে ইনপুটের জন্য অপেক্ষা করে
একটি ইন্টারেক্টিভ সেশনে প্রম্পট করুন), অথবা আর ইনপুট না থাকলে সমস্ত প্রক্রিয়া বন্ধ করে দেয়
একটি ব্যাচ সেশনে উপলব্ধ।

mpy প্যাকেজ পরিবর্তন করে কিভাবে ইয়োরিক #include পার্সার নির্দেশিকা পরিচালনা করে, এবং অন্তর্ভুক্ত
এবং ফাংশন প্রয়োজন। যথা, যদি একটি সমান্তরাল কাজ চলছে (অর্থাৎ, একটি ফাংশন শুরু হয়েছে
mp_exec দ্বারা), এগুলি সম্মিলিত অপারেশনে পরিণত হয়। অর্থাৎ, র‍্যাঙ্ক 0 পুরোটা পড়ে
ফাইলের বিষয়বস্তু, এবং একটি MPI বার্তা হিসাবে অন্যান্য প্রক্রিয়াগুলিতে বিষয়বস্তু পাঠায় (যেমন
ফাইলের বিষয়বস্তুর mp_exec)। র‍্যাঙ্ক 0 ব্যতীত প্রতিটি প্রক্রিয়া শুধুমাত্র চলাকালীন চলছে
সমান্তরাল কাজ; একটি সমান্তরাল টাস্কের বাইরে যখন শুধুমাত্র র্যাঙ্ক 0 চলছে (এবং অন্যান্য সমস্ত র্যাঙ্ক
পরবর্তী mp_exec এর জন্য অপেক্ষা করছে), #include নির্দেশিকা এবং অন্তর্ভুক্ত এবং প্রয়োজন
ফাংশনগুলি তাদের স্বাভাবিক সিরিয়াল অপারেশনে ফিরে আসে, শুধুমাত্র র্যাঙ্ক 0 কে প্রভাবিত করে।

যখন mpy শুরু হয়, এটি সমান্তরাল মোডে থাকে, যাতে সমস্ত ফাইল ইয়োরিক অন্তর্ভুক্ত থাকে যখন এটি
শুরু হয় (Y_SITE/i0-এর ফাইলগুলি) সম্মিলিত ক্রিয়াকলাপ হিসাবে অন্তর্ভুক্ত। এই ছাড়া
বৈশিষ্ট্য, প্রতিটি ইয়োরিক প্রক্রিয়া খোলার এবং স্টার্টআপ ফাইলগুলি পড়ার চেষ্টা করবে,
mpy শুরু হওয়ার আগে ফাইল সিস্টেম ওভারলোড করা হচ্ছে। এই বিষয়বস্তু পাস
MPI বার্তা হিসাবে ফাইলগুলি প্রত্যেকের জন্য পর্যাপ্ত ব্যান্ডউইথ আছে তা নিশ্চিত করার একমাত্র উপায়
একটি একক ফাইলের বিষয়বস্তু পড়ার প্রক্রিয়া।

স্টার্টআপে অন্তর্ভুক্ত শেষ ফাইলটি হয় -ব্যাচ বিকল্পে নির্দিষ্ট করা ফাইল, অথবা
custom.i ফাইল। custom.i এ কোডের সমস্যা এড়াতে যা নিরাপদ নাও হতে পারে
সমান্তরাল এক্সিকিউশন, mpy custom.i এর জন্য নয়, বরং custommp.i এর জন্য। দ্য
-ব্যাচ ফাইলে বা custommp.i-তে নির্দেশাবলী র্যাঙ্ক 0-এ সিরিয়াল মোডে কার্যকর করা হয়
কেবল. একইভাবে, mpy স্বাভাবিক process_argv ফাংশনকে ওভাররাইড করে, যাতে -i এবং অন্যান্য
কমান্ড লাইন বিকল্পগুলি সিরিয়াল মোডে শুধুমাত্র র্যাঙ্ক 0 এ প্রক্রিয়া করা হয়। এই সব অভিপ্রায়
কেস-ব্যাচ বা custommp.i বা -i ফাইলগুলিকে শুধুমাত্র র্যাঙ্ক 0-এ এক্সিকিউট করতে হয়, যেমন
আপনি যদি তাদের সেখানে ইন্টারেক্টিভভাবে টাইপ করতেন। আপনি এইগুলির যেকোনো একটি থেকে mp_exec কল করতে পারবেন
ফাইলগুলি সমান্তরাল কাজ শুরু করতে, কিন্তু ফাইলটি নিজেই সিরিয়াল।

একটি অতিরিক্ত কমান্ড লাইন বিকল্প স্বাভাবিক সেট যোগ করা হয়:
mpy-j somefile.i
সমান্তরাল মোডে somefile.i অন্তর্ভুক্ত করে সমস্ত র‌্যাঙ্কে (আবার, -i other.i শুধুমাত্র other.i অন্তর্ভুক্ত করে
সিরিয়াল মোডে র্যাঙ্ক 0 এ)। যদি একাধিক -j বিকল্প থাকে, তাহলে সমান্তরালটি ঘটবে
কমান্ড লাইন অর্ডারে। যদি -j এবং -i বিকল্পগুলি মিশ্রিত হয়, তবে, সমস্ত -j অন্তর্ভুক্ত হয়
যেকোনো -আমি অন্তর্ভুক্ত করার আগে।

MPY-তে অন্তর্ভুক্ত ফাংশন জটিলতার একটি পার্শ্ব প্রতিক্রিয়া হিসাবে, অটোলোড বৈশিষ্ট্যটি হল
অক্ষম যদি আপনার কোড আসলে একটি অটোলোডেড ফাংশন, mpy কল করে একটি অন্তর্ভুক্ত ট্রিগার করে
একটি ত্রুটির সাথে থামবে। আপনাকে অবশ্যই একটি সমান্তরালের জন্য প্রয়োজনীয় কোনো ফাংশন স্পষ্টভাবে লোড করতে হবে
ফাংশন ব্যবহার করে কাজগুলি একটি সমান্তরাল টাস্কের ভিতরে নিজেদেরকে কল করে।

mp_send ফাংশন যেকোনো সংখ্যাসূচক ইয়োরিক অ্যারে পাঠাতে পারে (প্রকার char, short, int, long,
ভাসা, দ্বিগুণ, বা জটিল), অথবা একটি স্কেলার স্ট্রিং মান। বার্তা পাঠানোর প্রক্রিয়া
MPI এর মাধ্যমে শুধুমাত্র উপাদানের সংখ্যা সংরক্ষণ করে, তাই mp_recv শুধুমাত্র একটি স্কেলার মান তৈরি করে বা
মানগুলির একটি 1D বিন্যাস, mp_send-এ যে মাত্রাই পাস করা হয়েছে তা কোন ব্যাপার না।

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

mp_probe ফাংশন সারিবদ্ধ বার্তাগুলির সমস্ত প্রেরকের তালিকা প্রদান করে (বা শূন্য হলে
সারি খালি)। কল mp_probe(0) অবিলম্বে ফিরে আসতে, এমনকি যদি সারি খালি হয়।
কল mp_probe(1) সারি খালি থাকলে ব্লক করতে, শুধুমাত্র যখন অন্তত একটি বার্তা আসবে
mp_recv এর জন্য উপলব্ধ। কল mp_probe(2) একটি নতুন বার্তা না আসা পর্যন্ত ব্লক করা, এমনকি যদি
কিছু বার্তা বর্তমানে উপলব্ধ.

mp_exec ফাংশন একটি লগারিদমিক ফ্যানআউট ব্যবহার করে - র্যাঙ্ক 0 F প্রসেসে পাঠায়, প্রতিটি
যেটি আরও F-তে পাঠায় এবং আরও অনেক কিছু, যতক্ষণ না সমস্ত প্রক্রিয়ার বার্তা থাকে। একবার একটি প্রক্রিয়া
এটি পাঠানোর সমস্ত ক্রিয়াকলাপ সম্পূর্ণ করে, এটি বার্তার বিষয়বস্তু পার্স করে এবং এক্সিকিউট করে।
ফ্যানআউট অ্যালগরিদম N ধাপের বেস F এ লগ ইন প্রক্রিয়ায় পৌঁছে। এফ প্রক্রিয়া
র‍্যাঙ্ক 0 র‍্যাঙ্ক 1, 2, 3, ..., এফ-এ পাঠায়। সাধারণভাবে, র্যাঙ্ক r সহ প্রক্রিয়া পাঠায়
র‍্যাঙ্কগুলি r*F+1, r*F+2, ..., r*F+F (যখন এগুলো N-1 এর থেকে কম হয় N প্রসেসের জন্য)। এই সেট
র্যাঙ্কের "স্টাফ" বলা হয়। r>0 সহ র্যাঙ্কগুলি (r-1)/F থেকে বার্তা পায়,
যাকে r এর "বস" বলা হয়। mp_exec কলটি mp_recv সারির সাথে ইন্টারঅপারেট করে;
অন্য কথায়, একটি mp_exec ফ্যানআউটের সময় বস ব্যতীত অন্য কোনও পদের বার্তাগুলি হবে৷
mp_recv দ্বারা পরবর্তী পুনরুদ্ধারের জন্য সারিবদ্ধ। (এই বৈশিষ্ট্য ছাড়া, কোন সমান্তরাল কাজ যা
লগারিদমিক ফ্যানআউট ব্যতীত অন্য একটি বার্তা প্যাটার্ন ব্যবহার করলে রেসের জন্য সংবেদনশীল হবে
শর্ত।)

লগারিদমিক ফ্যানআউট এবং এর অভ্যন্তরীণ সমতুল্য এতই কার্যকর যে mpy একটি দম্পতি প্রদান করে
উচ্চ স্তরের ফাংশন যা mp_exec হিসাবে একই ফ্যানআউট প্যাটার্ন ব্যবহার করে:
mp_হ্যান্ডআউট, বার্তা;
মোট = mp_handin(মান);
mp_handout ব্যবহার করতে, র‍্যাঙ্ক 0 একটি বার্তা গণনা করে, তারপর সমস্ত র‍্যাঙ্ক mp_handout কল করে, যা বার্তা পাঠায়
(0 ব্যতীত অন্য সব র‍্যাঙ্কের একটি আউটপুট) mp_exec-এর মতো একই ফ্যানআউট দ্বারা সর্বত্র। ব্যবহার করা
mp_handin, প্রতিটি প্রক্রিয়া মান গণনা করে, তারপর mp_handin কল করে, যা যোগফল প্রদান করে
তাদের নিজস্ব মান এবং তাদের সমস্ত স্টাফ, যাতে র্যাঙ্ক 0 mp_handin এর যোগফল প্রদান করে
প্রতিটি প্রক্রিয়া থেকে মান।

আপনি একটি সিঙ্ক্রোনাইজেশন হিসাবে কাজ করার জন্য কোন যুক্তি ছাড়াই একটি ফাংশন হিসাবে mp_handin কল করতে পারেন; কখন
র্যাঙ্ক 0 এই ধরনের কলের পরে চলতে থাকে, আপনি জানেন যে অন্য প্রতিটি র্যাঙ্ক সেই পয়েন্টে পৌঁছেছে।
সমস্ত সমান্তরাল কাজ (mp_exec দিয়ে শুরু হওয়া যেকোনো কিছু) অবশ্যই mp_handin-এ কল দিয়ে শেষ করতে হবে,
বা একটি সমতুল্য গ্যারান্টি যে সমস্ত প্রক্রিয়া একটি নিষ্ক্রিয় অবস্থায় ফিরে এসেছে যখন টাস্ক
র‍্যাঙ্ক 0-এ শেষ।

আপনি mp_nfan ফাংশন ব্যবহার করে fanout প্যারামিটার F পুনরুদ্ধার বা পরিবর্তন করতে পারেন। ডিফল্ট
মান হল 16, যা খুব বড় সংখ্যক প্রক্রিয়ার জন্যও যুক্তিসঙ্গত হওয়া উচিত।

একটি বিশেষ সমান্তরাল কাজকে বলা হয় mp_connect, যা আপনি ব্যাখ্যা করা খাওয়াতে ব্যবহার করতে পারেন
যেকোনো একক নন-0 র‍্যাঙ্কে কমান্ড লাইন, অন্য সব র‍্যাঙ্ক নিষ্ক্রিয় থাকে। র্যাঙ্ক 0 এ বসে
কীবোর্ড পড়ার লুপ এবং লাইনগুলিকে "সংযুক্ত" র‌্যাঙ্কে পাঠানো, যা কার্যকর করে
তাদের, এবং র‍্যাঙ্ক 0-এ একটি স্বীকৃতি ফেরত পাঠায়। আপনি mp_disconnect ফাংশন চালান
সমান্তরাল কাজটি সম্পূর্ণ করুন এবং র্যাঙ্ক 0 এ ফিরে যান।

অবশেষে, ত্রুটি পুনরুদ্ধার সম্পর্কে একটি নোট. সমান্তরাল কাজের সময় একটি ত্রুটি ঘটলে,
mpy প্রয়াস সহকারে mp_exec থেকে প্রস্থান করার চেষ্টা করে, যাতে র‍্যাঙ্ক 0 রিটার্ন করলে অন্য সব র‍্যাঙ্ক
নিষ্ক্রিয় বলে পরিচিত, পরবর্তী mp_exec-এর জন্য প্রস্তুত৷ যদি থাকে তবে এই পদ্ধতিটি চিরতরে ঝুলে থাকবে
একটি প্রসেস একটি অসীম লুপে, বা অন্যথায় এমন অবস্থায় যেখানে এটি কখনই হবে না
mp_send, mp_recv, বা mp_probe কল করুন, কারণ MPI একটি সংকেত পাঠানোর কোন উপায় প্রদান করে না
সমস্ত প্রক্রিয়ায় বাধা দেয়। (এটি MPI পরিবেশের একটি উপায়
"অশোধিত।") র‍্যাঙ্ক 0 প্রক্রিয়াটি প্রথম প্রক্রিয়াটির র‍্যাঙ্কের সাথে বাকি রয়েছে যা একটি রিপোর্ট করেছে
ফল্ট, প্লাস প্রসেসের সংখ্যার একটি গণনা যা হচ্ছে ছাড়া অন্য কোনো কারণে ত্রুটিপূর্ণ
একটি বার্তা পাঠিয়েছে যে অন্য র্যাঙ্কে ত্রুটি রয়েছে। প্রথম ত্রুটি প্রক্রিয়া dbug প্রবেশ করতে পারেন
mp_connect এর মাধ্যমে মোড; র‍্যাঙ্ক 0-এ সিরিয়াল মোডে ফিরে যেতে mp_disconnect বা dbexit ব্যবহার করুন।

অপশন সমূহ
-j file.i Yorick উৎস ফাইল অন্তর্ভুক্ত file.i যেমন mpy সমান্তরাল মোডে শুরু হয়
সব পদে। এটি mpy এর পরে mp_include ফাংশনের সমতুল্য
শুরু হয়েছে.

-i file.i Yorick উৎস ফাইল অন্তর্ভুক্ত file.i mpy শুরু হলে, সিরিয়াল মোডে।
mpy শুরু হওয়ার পর এটি #include নির্দেশের সমতুল্য।

-ব্যাচ file.i Yorick উৎস ফাইল অন্তর্ভুক্ত file.i mpy শুরু হলে, সিরিয়াল মোডে।
আপনার কাস্টমাইজেশন ফাইল custommp.i, যদি থাকে, হয় না পড়া, এবং mpy হয়
ব্যাচ মোডে স্থাপন করা হয়েছে। ব্যাচ ফাংশনে সহায়তা কমান্ডটি ব্যবহার করুন
(সাহায্য, ব্যাচ) ব্যাচ মোড সম্পর্কে আরও জানতে। ব্যাচ মোডে, সব
ত্রুটিগুলি মারাত্মক; সাধারনত, mpy এক্সিকিউশন বন্ধ করবে এবং আরও কিছুর জন্য অপেক্ষা করবে
একটি ত্রুটির পরে ইনপুট।

onworks.net পরিষেবা ব্যবহার করে mpy অনলাইন ব্যবহার করুন


বিনামূল্যে সার্ভার এবং ওয়ার্কস্টেশন

উইন্ডোজ এবং লিনাক্স অ্যাপ ডাউনলোড করুন

লিনাক্স কমান্ডগুলি

Ad