কোনও এমপিআই_লগ্রদার অপারেশনের গণ্য ব্যয় কীভাবে একটি জমায়েত / স্ক্যাটার অপারেশনের সাথে তুলনা করে?


11

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

এমপিআই_লগদার স্কিমটি প্রয়োগে, আমি নকল ম্যাট্রিক্স সমাধানের জন্য সমস্ত প্রক্রিয়াতে বিতরণকারী ভেক্টর সংগ্রহ করছি। অন্যান্য বাস্তবায়নে, আমি বিতরণ করা ভেক্টরকে একটি একক প্রসেসরে (মূল নোড) সংগ্রহ করি, এই প্রসেসরের লিনিয়ার সিস্টেমটি সমাধান করি এবং তারপরে সমাধান ভেক্টরটিকে সমস্ত প্রক্রিয়াতে আবার ছড়িয়ে দেব।

আমি জানতে আগ্রহী যে অ্যালগার্ড অপারেশনের ব্যয় ছড়িয়ে ছিটিয়ে থাকা এবং সংযুক্ত অপারেশনগুলির তুলনায় উল্লেখযোগ্য পরিমাণে বেশি কিনা। বার্তাটির দৈর্ঘ্য কি এর জটিলতায় গুরুত্বপূর্ণ ভূমিকা রাখে? এটি এমপিআই বাস্তবায়নের মধ্যে কি আলাদা হয়?

সম্পাদনা:


যোগাযোগের কাঠামো এবং জড়িত মাপগুলি বর্ণনা করুন। এর MPI_Scatterপরে MPI_Gatherএর মত একই যোগাযোগের অর্থ প্রদান করা হয় না MPI_Allgather। আপনি উভয় উপায়ে অপারেশন প্রকাশ করার সময় সম্ভবত বাড়াবাড়ি জড়িত?
জেদ ব্রাউন

পল, জেড ঠিক আছে, আপনি একটি MPI_Gatherদ্বারা অনুসরণ করা মানে MPI_Bcast?
আরন আহমদিয়া

@ জেডব্রাউন: আমি আরও কিছু তথ্য যুক্ত করেছি।
পল

@ অ্যারোনআহমাদিয়া: আমার মনে হয় না যে আমার একটি এমপিআই_বাস্ট ব্যবহার করা উচিত কারণ আমি ভেক্টরের একটি অংশ প্রতিটি প্রক্রিয়ায় প্রেরণ করছি, পুরো ভেক্টরকে নয়। আমার যুক্তিটি হ'ল সাধারণভাবে সাধারণত একটি ছোট বার্তা প্রেরণের চেয়ে দ্রুততর হবে। এটা কোনো কিছু হলো?
পল

ইতিমধ্যে ম্যাট্রিক্স বিতর্কিতভাবে বিতরণ করা হয়েছে? এটি ইতিমধ্যে ফ্যাক্টরড? একাধিক প্রক্রিয়া একই ক্যাশে এবং মেমরি বাস ভাগ করে না? (এটি রিলান্ড্যান্ট সিস্টেমগুলি সমাধানের গতিতে প্রভাব ফেলবে)) সিস্টেমগুলি কত বড় / ব্যয়বহুল? কেন সিরিয়ালি সমাধান?
জেদ ব্রাউন

উত্তর:


9

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

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

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

অন্যদিকে, যদি কোনও একটি ব্লু জিনে থাকে তবে MPI_Reduce_scatter_blockব্যবহার করা MPI_Allreduce, যা সংযোগের চেয়ে আরও বেশি যোগাযোগ করে MPI_Reduceএবং MPI_Scatterসংঘবদ্ধ করে তোলে তা আসলে কিছুটা দ্রুত। এটি আমি সম্প্রতি আবিষ্কার করেছি এবং এটি এমপিআইতে পারফরম্যান্স স্ব-ধারাবাহিকতার নীতির একটি আকর্ষণীয় লঙ্ঘন (এই নীতিটি "স্ব-ধারাবাহিক এমপিআই পারফরম্যান্স গাইডলাইনগুলিতে" আরও বিশদে বর্ণিত হয়েছে )।

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

অবশেষে, এই প্রশ্নের উত্তর দেওয়ার সর্বোত্তম উপায় হ'ল আপনার কোডে নিম্নলিখিতটি করা এবং পরীক্ষার মাধ্যমে প্রশ্নের উত্তর দেওয়া।

#ifdef TWO_MPI_CALLS_ARE_BETTER_THAN_ONE
  MPI_Scatter(..)
  MPI_Gather(..)
#else
  MPI_Allgather(..)
#endif

এর চেয়েও ভাল বিকল্প হ'ল আপনার কোডটি প্রথম দুটি পুনরাবৃত্তির সময় এটি পরীক্ষামূলকভাবে পরিমাপ করা হয়, তারপরে বাকী পুনরাবৃত্তির জন্য যেটি দ্রুত হয় তা ব্যবহার করুন:

const int use_allgather = 1;
const int use_scatter_then_gather = 2;

int algorithm = 0;
double t0 = 0.0, t1 = 0.0, dt1 = 0.0, dt2 = 0.0;

while (..)
{
    if ( (iteration==0 && algorithm==0) || algorithm==use_scatter_then_gather )
    {
        t0 = MPI_Wtime();
        MPI_Scatter(..);
        MPI_Gather(..);
        t1 = MPI_Wtime();
        dt1 = t1-t0;
    } 
    else if ( (iteration==1 && algorithm==0) || algorithm==use_allgather)
    {
        t0 = MPI_Wtime();
        MPI_Allgather(..);
        t1 = MPI_Wtime();
        dt2 = t1-t0;
    }

    if (iteration==1)
    {
       dt2<dt1 ? algorithm=use_allgather : algorithm=use_scatter_then_gather;
    }
}

এটি কোনও খারাপ ধারণা নয় ... তাদের উভয়কেই সময় দিন এবং নির্ধারণ করুন কোনটি দ্রুত।
পল

বেশিরভাগ আধুনিক এইচপিসি পরিবেশগত হার্ডওয়্যার অনেক এমপিআই কল অনুকূলিত করে। কখনও কখনও এটি অবিশ্বাস্য গতিবেগ, অন্য সময়, অত্যন্ত অস্বচ্ছ আচরণের দিকে পরিচালিত করে। সাবধান হও!
meawoppl

@ জেফ: আমি ঠিক বুঝতে পেরেছি যে আমি একটি গুরুত্বপূর্ণ বিবরণ রেখেছি ... আমি টেক্সাস অ্যাডভান্সড কম্পিউটিং সেন্টারে একটি ক্লাস্টারের সাথে কাজ করছি, যেখানে তারা ফ্যাট-ট্রি টপোলজি নেটওয়ার্ক ব্যবহার করে। এটি কি সমস্ত-জমায়েত এবং জমায়েত-সম্প্রচার পদ্ধতির মধ্যে পারফরম্যান্সের পার্থক্যকে প্রভাবিত করবে?
পল

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

5

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

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

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

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

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

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

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


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