একটি ব্যবহারিক মাল্টি-ওয়ার্ড তুলনা এবং অদলবদ অপারেশন


10

ইন কাগজ এই প্রশ্নের যে একই শিরোনাম সঙ্গে, লেখক একটি বিল্ড কিভাবে বর্ণনা nonblocking linearizable বহু-শব্দ সি এ এস শুধুমাত্র একটি একক শব্দ সি এ এস ব্যবহার অপারেশন। তারা প্রথমে ডাবল-তুলনা-একক-স্বাপ অপারেশন - আরডিসিএস, নিম্নরূপ উপস্থাপন করেছেন:

word_t RDCSS(RDCSSDescriptor_t *d) {
  do {
    r = CAS1(d->a2, d->o2, d);
    if (IsDescriptor(r)) Complete(r);
  } while (IsDescriptor(r));
  if (r == d->o2) Complete(d); // !!
  return r;
}

void Complete(RDCSSDescriptor_t *d) {
  v = *(d->a1);
  if (v == d->o1) CAS1(d->a2, d, d->n2);
  else CAS1(d->a2, d, d->o2);
}

RDCSSDescriptor_tনিম্নলিখিত ক্ষেত্রগুলি সহ একটি কাঠামো যেখানে :

  • a1 - প্রথম শর্তের ঠিকানা
  • o1 - প্রথম ঠিকানায় প্রত্যাশার মান
  • a2 - দ্বিতীয় শর্তের ঠিকানা
  • o2 - দ্বিতীয় ঠিকানায় প্রত্যাশার মান
  • n2 - নতুন ঠিকানায় দ্বিতীয় ঠিকানায় লিখতে হবে

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

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

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

আমার প্রশ্ন হয়: ফাংশনে পরীক্ষা করতে পারবেন RDCSSS, if (r == d->o2)..., RDCSS এখনও একটি ডবল তুলনা, একক swap 'র নির্দেশ যা এর শব্দার্থবিদ্যা বজায় রাখার সঙ্গে বাদ দেওয়া যেতে linearizable এবং লক-বিনামূল্যে ? ( !!মন্তব্য সহ লাইন )

যদি তা না হয় তবে এই দৃশ্যের সত্যতা নিশ্চিত করার জন্য যেখানে এই লাইনটি প্রয়োজনীয় সেখানে আপনি কী বর্ণনা করতে পারবেন?

ধন্যবাদ.


প্রথমত, কী চলছে তা বোঝার জন্য আমাদের আরডিসিএসএস বিবরণী_আর ডাটা স্ট্রাকচারটি দেখতে হবে। দ্বিতীয়ত, এটি সম্ভবত এখানে বিষয় বন্ধ কারণ এটি তাত্ত্বিক কম্পিউটার বিজ্ঞানের সাথে কাজ করে না; এটি স্ট্যাকওভারফ্লো.কম এ জিজ্ঞাসা করা ভাল।
ডেভ ক্লার্ক

কাগজের লিঙ্কটি নষ্ট হয়ে গেছে।
অ্যারন স্টার্লিং

1
আমি লিঙ্কটির জন্য ক্ষমা চাইছি - এটি এখন কাজ করা উচিত। আমি বর্ণনাটি কী তা বর্ণনা করতে প্রশ্ন আপডেট করেছি updated স্ট্যাকওভারফ্লো.কম এ আমি পোস্ট না করার কারণ এফএকিউ বলে যে এই সাইটটি কম্পিউটার বিজ্ঞানের গবেষণার স্তরের প্রশ্নের জন্য। আমি ভেবেছিলাম লক-স্বাধীনতা এবং একটি অ্যালগরিদমের লিনিয়ারাইজিবিলিটির প্রশ্নগুলি যেমন যোগ্যতা অর্জন করে। আমি আশা করি আমি FAQ ভুলভাবে বুঝতে পেরেছি।
axel22

FAQ এ আপনি যে মূল শব্দটি মিস করেছেন তা হ'ল "তাত্ত্বিক"। কিছু লোকেরা প্রশ্নটিকে আকর্ষণীয় বলে মনে হচ্ছে, আমি এটি উন্মুক্ত রেখে দেব।
ডেভ ক্লার্ক

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

উত্তর:


9

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

আমাদের একটি বিল্ট-ইন অ্যাটমিক সিএএস 1 রয়েছে যার অর্থ এই:

int CAS1(int *addr, int oldval, int newval) {
  int currval = *addr;
  if (currval == oldval) *addr = newval;
  return currval;
}

আমাদের সিএএস 1 ব্যবহার করে এবং এর নিম্নলিখিত শব্দার্থক থাকা একটি এটিমিক আরডিসিএস ফাংশনটি সংজ্ঞায়িত করতে হবে :

int RDCSS(int *addr1, int oldval1, int *addr2, int oldval2, int newval2) {
  int res = *addr;
  if (res == oldval2 && *addr1 == oldval1) *addr2 = newval2;
  return res;
}

স্বজ্ঞাতভাবে: আমাদের সংযোজনীয়ভাবে কেবল অ্যাডর 2 এ মান পরিবর্তন করতে হবে যদি * অ্যাডর 1 == পুরাতন 1 ... যদি অন্য থ্রেড এটি পরিবর্তন করে থাকে তবে আমরা অন্য থ্রেডটি অপারেশন সম্পন্ন করতে সহায়তা করতে পারি, তারপরে আমরা আবার চেষ্টা করতে পারি।

আরএডিসিএস ফাংশনটি সিএএসএন সংজ্ঞায়িত করতে (নিবন্ধটি দেখুন) ব্যবহৃত হবে। এখন, আমরা নিম্নলিখিত উপায়ে একটি আরডিসিএস বর্ণনাকারীকে সংজ্ঞায়িত করি :

RDCSSDESCRI
int *addr1   
int oldval1
int *addr2   
int oldval2
int newval2

তারপরে আমরা আরডিসিএসএস নিম্নলিখিত পদ্ধতিতে প্রয়োগ করি:

int RDCSS( RDCSSDESCRI *d ) {
  do {
    res = CAS1(d->addr2, d->oldval2, d);  // STEP1
    if (IsDescriptor(res)) Complete(res); // STEP2
  } while (IsDescriptor(res);             // STEP3
  if (res == d->oldval2) Complete(d);     // STEP4
  return res;
}

void Complete( RDCSSDESCRI *d ) {
  int val = *(d->addr1);
  if (val == d->oldval1) CAS1(d->addr2, d, d->newval2);
    else CAS1(d->addr2, d, d->oldval2);  
}
  • STEP1: প্রথমে আমরা * * * * এর 2 টির (আমাদের নিজস্ব) বর্ণনাকারী D তে পরিবর্তন করার চেষ্টা করি, যদি CAS1 সফল হয় তবে রেজ == ডি-> ওল্ডভ্যাল 2 (অর্থাত্ রিজ কোনও বর্ণনাকারী নয়)
  • STEP2: পরীক্ষা করুন যে রেজ কোনও বর্ণনাকারী অর্থাৎ STEP1 ব্যর্থ হয়েছে (অন্য থ্রেড অ্যাডার 2 পরিবর্তন হয়েছে) ... অপারেশনটি সম্পূর্ণ করতে অন্য থ্রেডকে সহায়তা করুন
  • পদক্ষেপ 3: আমরা যদি আমাদের বর্ণনাকারী সংরক্ষণ করতে সফল না হই তবে STEP1 পুনরায় চেষ্টা করুন d
  • পদক্ষেপ 4: আমরা যদি অ্যাডারে 2 থেকে আমাদের প্রত্যাশিত মানটি পেয়েছি তবে আমরা আমাদের বিবরণকারীকে (পয়েন্টার) অ্যাডারে 2 এ সঞ্চয় করতে সফল হয়েছি এবং আমরা নিউভাল 2 কে * অ্যাডার 2 আইআইএফ * অ্যাড্র 1 == ওল্ডওয়াল 1 এ স্টোর করতে আমাদের কাজ শেষ করতে পারি

আপনার প্রশ্নের উত্তর

যদি আমরা STEP4 বাদ দিই তবে যদি (... && * addr1 == oldval1) * আরডিসিএস অর্থশাস্ত্রের addr2 = newval2 অংশ কখনই কার্যকর করা হবে না (... বা আরও ভাল: এটি অন্য থ্রেড সাহায্যে অনির্দেশ্য উপায়ে কার্যকর করা যেতে পারে) বর্তমান এক)।

আপনার মন্তব্যে আপনার দ্বারা নির্দেশিত হিসাবে STEP4 এ (res == d1-> ওল্ডভাল 2) অপ্রয়োজনীয়: যদিও আমরা এটিকে বাদ দিই, সম্পূর্ণ () এ CAS1 উভয়ই ব্যর্থ হবে কারণ * (d-> অ্যাডার 2)! = D । এটির একমাত্র বেগুনি হ'ল কোনও ফাংশন কল এড়ানো।

টি 1 = থ্রেড 1, টি 2 = থ্রেড 2 উদাহরণ:

remember that addr1 / addr2 are in a shared data zone !!!

T1 enter RDCSS function
T2 enter RDCSS function
T2 complete STEP1 (and store the pointer to its descriptor d2 in addr2)
T1 at STEP1 the CAS1 fails and res = d2
T2 or T1 completes *(d2->addr2)=d2->newval2 (suppose that *(d2->addr1)==d2->oldval1)
T1 execute STEP1 and now CAS1 can fail because *addr2 == d2->newval2
   and maybe d2->newval2 != d1->oldval2, in every case at the end 
   res == d2->newval2 (fail) or
   res == d1->oldval2 (success)
T1 at STEP2 skips the call to Complete() (because now res is not a descriptor)
T1 at STEP3 exits the loop (because now res is not a descriptor)
T1 at STEP4 T1 is ready to store d1->newval2 to addr2, but only if
   *(d1->addr2)==d (we are working on our descriptor) and *(d1->addr1)==d1->oldval1
   ( Custom() function)

ধন্যবাদ, ভাল ব্যাখ্যা। আমি পুরোপুরি বিন্দুটি মিস করেছি যে সিএএস 1 পুরানো মানটি প্রদান করে, নতুনটি নয়।
axel22

তবে, দৃশ্যে, শেষ 2 টি লাইন বলে যে: STEP4 এ শর্ত ছাড়াই, টি 1 মান সঞ্চয় করতে পারে, কারণ addr2এতে d2->newval2। তবে, এটি আমার কাছে মনে হয় যে সিএএস 1 Completeসবেমাত্র ব্যর্থ হবে, কারণ এটি পুরানো মানটিকে বর্ণনাকারী হিসাবে প্রত্যাশা করে d1- টি 1 দ্বারা কিছুই লিখিত হবে না। রাইট?
axel22

@ অ্যাক্সেল 22: আমি সম্পূর্ণ () :- ডি-তে CAS1 মিস করেছি। হ্যাঁ আপনি ঠিক বলেছেন ... আমার উদাহরণটি ভুল, যদি শর্তটি কেবলমাত্র কোনও ফাংশন কল এড়ানোর জন্য ব্যবহৃত হয়, যদি আমরা () পরিবর্তন না করে তবে কিছু পরিবর্তন হয়। স্পষ্টতই STEP4 এ সম্পূর্ণ (d) প্রয়োজনীয়। এখন আমি উদাহরণটি পরিবর্তন করি।
মারজিও ডি বায়াসি

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