অ্যাসিনক্রোনাস সেলুলার অটোমেটার জন্য সমান্তরাল (জিপিইউ) অ্যালগরিদম


12

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

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

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

যে মডেলগুলির আমি সমান্তরাল করতে চাই সেগুলি la 100000 কোষ (যদিও আমি আরও বেশি ব্যবহার করতে চাই) সমন্বিত একটি জালিতে (সাধারণত একটি ষড়জাগরীয়) প্রয়োগ করা হয়, এবং এগুলি চালানোর জন্য অ-সমান্তরাল অ্যালগরিদমটি দেখতে এই জাতীয় দেখাচ্ছে:

  1. এলোমেলোভাবে প্রতিবেশী জোড়া কোষ চয়ন করুন

  2. এই ঘরগুলি ঘিরে স্থানীয় প্রতিবেশীর উপর ভিত্তি করে একটি "শক্তি" ফাংশন গণনা করুনΔE

  3. একটি সম্ভাব্যতা যে উপর নির্ভর করে দিয়ে (সঙ্গে β একটি প্যারামিটার), নয়তো দুই কোষের রাজ্যের অদলবদল অথবা কিছুই না।eβΔEβ

  4. উপরের পদক্ষেপগুলি অনির্দিষ্টকালের জন্য পুনরাবৃত্তি করুন।

সীমানা শর্তের সাথে করার জন্য কিছু জটিলতাও রয়েছে তবে আমি ধারণা করি এগুলি সমান্তরালে খুব বেশি অসুবিধা করবে না।

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

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

  • এলোমেলো গ্রিড সাইটের তালিকা তৈরি করতে এবং সংঘর্ষের জন্য চেক করতে সিপিইউ ব্যবহার করুন। যখন গ্রিড সাইটের সংখ্যা জিপিইউ প্রসেসরের সংখ্যার সমতুল্য হয়, বা যদি কোনও সংঘর্ষ সনাক্ত হয়, তখন সংশ্লিষ্ট গ্রিড সাইট আপডেট করার জন্য প্রতিটি সমন্বয়কের সেটকে একটি জিপিইউ ইউনিটে প্রেরণ করুন। এটি কার্যকর করা সহজ হবে তবে সম্ভবত খুব বেশি গতি বাড়বে না, কারণ সিপিইউতে সংঘর্ষের জন্য চেক করা সম্ভবত সিপিইউতে সম্পূর্ণ আপডেট করার চেয়ে এতটা সস্তা হবে না।

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

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

আমার নির্দিষ্ট প্রশ্নগুলি নিম্নরূপ:

  • উপরোক্ত অ্যালগরিদমের কোনওটি কি অ্যাসিঙ্ক্রোনাস সিএ মডেলের জিপিইউ সমান্তরালের কাছে যাওয়ার কোনও বুদ্ধিমান উপায়?

  • একটি ভাল উপায় আছে কি?

  • এই ধরণের সমস্যার জন্য কি লাইব্রেরি কোড রয়েছে?

  • "ব্লক-সিঙ্ক্রোনাস" পদ্ধতির স্পষ্ট ইংরেজী ভাষার বিবরণ আমি কোথায় পাব?

উন্নতি

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

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

Xijtijtij(0)Exp(λ)λ এমন একটি প্যারামিটার যার মান নির্বিচারে চয়ন করা যেতে পারে))

প্রতিটি যৌক্তিক সময় ধাপে, এসসিএর ঘরগুলি নিম্নরূপ আপডেট করা হয়:

  • k,li,jtkl<tij

  • XijXklΔtExp(λ)tijtij+Δt

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

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


সম্ভবত আপনি স্টেনসিল ভিত্তিক পদ্ধতির মাধ্যমে আপনার সমস্যা তৈরি করতে পারেন। স্টেনসিল ভিত্তিক সমস্যার জন্য অনেকগুলি সফ্টওয়্যার বিদ্যমান। আপনার এক নজরে থাকতে পারে: libgeodecomp.org/gallery.html , কনওয়ের গেম অফ লাইফ। এর কিছু মিল থাকতে পারে।
ভ্যানকম্পুট

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

আপনি কীভাবে এই সিমটি ব্যবহার করে সমান্তরাল করবেন তার আরও কয়েকটি বিশদ সরবরাহ করতে পারেন? আপনি কি প্রতি জোড়া থ্রেড ব্যবহার করবেন? অথবা একক জুটি আপডেট করার সাথে জড়িত কাজটি 32 বা ততোধিক থ্রেডে ছড়িয়ে যেতে পারে?
পেড্রো

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

ঠিক আছে, এবং আপনি জোড় আপডেটের মধ্যে একটি ওভারল্যাপ কীভাবে সংজ্ঞায়িত করবেন? জোড়গুলি যদি নিজেরাই ওভারল্যাপ হয়, বা যদি তাদের প্রতিবেশগুলি ওভারল্যাপ হয়?
পেড্রো

উত্তর:


4

আমি প্রথম বিকল্পটি ব্যবহার করব এবং সংযোগগুলি সনাক্ত করতে, ষড়ভুজ AC এর একটি পদক্ষেপ সম্পাদন করবো, যার নিয়মটি কেন্দ্রের ঘর = সম (প্রতিবেশী) এর মান, এই সিএ অবশ্যই থাকতে হবে সাতটি রাজ্য এলোমেলোভাবে নির্বাচিত ঘরের সাথে শুরু করা উচিত এবং প্রতিটি জিপিইউর জন্য আপডেটের নিয়ম চালানোর আগে তাদের স্থিতি যাচাই করা উচিত।

নমুনা 1. প্রতিবেশী কক্ষের মূল্য ভাগ করা হয়

0 0 0 0 0 0 0 0

  0 0 1 0 0 0

0 0 0 0 0 0 0 0

  0 0 0 1 0 0

0 0 0 0 0 0 0 0

সিএর একটি পদক্ষেপ যার নিয়ম ষড়ভুজ কেন্দ্রীয় কক্ষ = সম (প্রতিবেশী)

0 0 1 1 0 0 0

  0 1 1 1 0 0

0 0 1 2 1 0 0

  0 0 1 1 1 0

0 0 0 1 1 0 0

নমুনা 2. আপডেট করার জন্য একটি কক্ষের মূল্য অন্যের প্রতিবেশী হিসাবে বিবেচনা করা হয়

0 0 0 0 0 0 0 0

  0 0 1 0 0 0

0 0 0 1 0 0 0

  0 0 0 0 0 0

0 0 0 0 0 0 0 0

পুনরাবৃত্তির পরে

0 0 1 1 0 0 0

  0 1 2 2 0 0

0 0 2 2 1 0 0

  0 0 1 1 0 0

0 0 0 0 0 0 0 0

নমুনা 3. কোন সম্পর্ক নেই

  0 0 0 0 0 0

0 0 1 0 0 0 0

  0 0 0 0 0 0

0 0 0 0 0 0 0 0

  0 0 0 1 0 0

0 0 0 0 0 0 0 0

পুনরাবৃত্তির পরে

  0 1 1 0 0 0

0 1 1 1 0 0 0

  0 1 1 0 0 0

0 0 0 1 1 0 0

  0 0 1 1 1 0

0 0 0 1 1 0 0


O(n)n

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

আমি এটি বুঝতে পারি, তবে সমস্যাটি হ'ল, যখন আপনি কোনও সংঘর্ষ শনাক্ত করবেন তখন আপনি কী করবেন? আমি উপরে ব্যাখ্যা হিসাবে, আপনার সিএ অ্যালগরিদম একটি সংঘর্ষ সনাক্তকরণের প্রথম পদক্ষেপ। দ্বিতীয় পদক্ষেপটি হ'ল> = 2 রাষ্ট্রযুক্ত কক্ষগুলির জন্য গ্রিড অনুসন্ধান করা এবং এটি তুচ্ছ নয়।
নাথানিয়েল

উদাহরণস্বরূপ, কল্পনা করুন যে আমরা সেলুলার অটোমেটা এবং নির্বাহকৃত অঙ্ক (কোষের প্রতিবেশী (5,7)) এ সংঘর্ষের সেল (5.7) সনাক্ত করতে চাই এবং যদি মান 8 হয় এবং যদি সংঘর্ষ না হয় তবে 8 টির চেয়ে বেশি সংঘর্ষ হবে না অ্যাসিঙ্ক্রোনাস সেলুলার অটোমেটাতে পরবর্তী কক্ষের পরবর্তী অবস্থা নির্ধারণ করতে প্রতিটি কক্ষকে মূল্যায়ন করে এমন ফাংশনে থাকা উচিত। প্রতিটি কক্ষের জন্য সংঘর্ষ সনাক্তকরণ একটি স্থানীয় নিয়ম যা কেবল তার প্রতিবেশী কোষগুলিকে জড়িত
jlopez1967

হ্যাঁ, তবে একটি অ্যাসিক্রোনাস সিএকে সমান্তরাল করার জন্য আমাদের যে প্রশ্নের উত্তর দিতে সক্ষম হওয়া দরকার তা ছিল না "সেলটিতে কোনও সংঘর্ষ ছিল (৫,7)" তবে "গ্রিডের কোথাও কোথাও একটি সংঘর্ষ হয়েছিল, এবং যদি তাই হয় তবে এটা? " গ্রিডের উপরে পুনরাবৃত্তি না করে উত্তর দেওয়া যাবে না।
নাথানিয়েল

1

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

আপনি এটি CUDA- র জন্য সরবরাহিত পারমাণবিক অপারেশনগুলি এবং intপ্রতিটি ঘরের জন্য লকগুলি রাখার একটি অ্যারে ব্যবহার করে এটি করতে পারেন , যেমন lock। প্রতিটি থ্রেড তারপর নিম্নলিখিতটি করে:

ci, cj = choose a pair at random.

int locked = 0;

/* Try to lock the cell ci. */
if ( atomicCAS( &lock[ci] , 0 , 1 ) == 0 ) {

    /* Try to lock the cell cj. */
    if ( atomicCAS( &lock[cj] , 0 , 1 ) == 0 ) {

        /* Now try to lock all the neigbourhood cells. */
        for ( cn = indices of all neighbours )
            if ( atomicCAS( &lock[cn] , 0 , 1 ) != 0 )
                break;

        /* If we hit a break above, we have to unroll all the locks. */
        if ( cn < number of neighbours ) {
            lock[ci] = 0;
            lock[cj] = 0;
            for ( int i = 0 ; i < cn ; i++ )
                lock[i] = 0;
            }

        /* Otherwise, we've successfully locked-down the neighbourhood. */
        else
            locked = 1;

        }

    /* Otherwise, back off. */
    else
        lock[ci] = 0;
    }

/* If we got everything locked-down... */
if ( locked ) {

    do whatever needs to be done...

    /* Release all the locks. */
    lock[ci] = 0;
    lock[cj] = 0;
    for ( int i = 0 ; i < cn ; i++ )
        lock[i] = 0;

    }

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

লকিং ওভারহেডটি ভীতিজনক মনে হতে পারে তবে এটি সত্যিই কেবল কয়েকটি অ্যাসাইনমেন্ট এবং শাখা রয়েছে, এর চেয়ে বেশি কিছু নয়।

এও নোট করুন যে আমি iপ্রতিবেশীদের উপরে লুপে স্বরলিপি সহ দ্রুত এবং আলগা হয়ে যাচ্ছি ।

সংযোজন: আমি অনুমান করার জন্য যথেষ্ট অশ্বারোহী ছিলাম যে আপনি যখন জোড়ায় সংঘর্ষে পড়বেন তখন আপনি কেবল ফিরে আসতে পারেন। যদি এটি না হয়, তবে আপনি দ্বিতীয়-লাইনের মতো সমস্ত কিছু একটি- whileলুপে মোড়াতে পারেন এবং breakচূড়ান্ত- স্তরের শেষে একটি যুক্ত করতে পারেন if

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

সংযোজন 2: এই কোডের যে কোনও জায়গায় কল যুক্ত করার প্রলোভন করবেন না__syncthreads() , বিশেষত এটি পূর্ববর্তী সংযোজনে বর্ণিত লুপিং সংস্করণ! পরবর্তী ক্ষেত্রে বারবার সংঘর্ষ এড়ানোর জন্য অ্যাসিঙ্ক্রোনসিটি অপরিহার্য।


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

1

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

আমি আপনাকে jlopez1967 এবং পেড্রো দ্বারা প্রস্তাবিত সমাধানগুলি একত্রিত করার পরামর্শ দিচ্ছি: পেড্রোর অ্যালগোরিদম সমান্তরালতাটি ভালভাবে ধারণ করেছে, তবে এই পারমাণবিক লকগুলি খুব ধীরে ধীরে ধীরে ধীরে। সংঘর্ষগুলি সনাক্তকরণের ক্ষেত্রে jlopez1967 এর সমাধানটি মার্জিত, তবে সমস্ত nকক্ষগুলি পরীক্ষা করা যখন কেবল একটি ছোট উপসেট (আমি এখন থেকে ধরে নেব যে এমন কিছু পরামিতি রয়েছে kযা কোষের সংখ্যা একসাথে আপডেট করার ইঙ্গিত দেয়) সক্রিয় থাকে, স্পষ্টতই নিষিদ্ধ।

__global__ void markPoints(Cell *grid, int gridWidth, int *posX, int *posY)
{
    int id = blockIdx.x * blockDim.x + threadIdx.x;
    int x, y;
    generateRandomCoord(&x, &y);
    posX[id] = x;
    posY[id] = y;
    grid[y * gridWidth + x].flag = 1;
}

__global__ void checkPoints(Cell *grid, int gridWidth, int *posX, int *posY, bool *active)
{
    int id = blockIdx.x * blockDim.x + threadIdx.x;
    int x = posX[id];
    int y = posY[id];
    int markedNeighbors = 
        grid[(y - 1) * gridWidth + x + 0].flag +
        grid[(y - 1) * gridWidth + x + 1].flag +
        grid[(y + 0) * gridWidth + x - 1].flag +
        grid[(y + 0) * gridWidth + x + 1].flag +
        grid[(y + 1) * gridWidth + x + 0].flag +
        grid[(y + 1) * gridWidth + x + 1].flag;
    active[id] = (markedNeighbors > 0);
}


__global__ void update(Cell *grid, int gridWidth, int *posX, int *posY, bool *active)
{
    int id = blockIdx.x * blockDim.x + threadIdx.x;
    int x = posX[id];
    int y = posY[id];
    grid[y * gridWidth + x].flag = 0;
    if (active[id]) {
        // do your fancy stuff here
    }
}

int main() 
{
  // alloc grid here, update up to k cells simultaneously
  int n = 1024 * 1024;
  int k = 1234;
  for (;;) {
      markPoints<<<gridDim,blockDim>>>(grid, gridWidth, posX, posY);
      checkPoints<<<gridDim,blockDim>>>(grid, gridWidth, posX, posY, active);
      update<<<gridDim,blockDim>>>(grid, gridWidth, posX, posY, active);
  }
}

জিপিইউতে ভাল গ্লোবাল সিঙ্ক্রোনাইজেশনের অভাবে, আপনাকে বিভিন্ন পর্যায়ে একাধিক কার্নেল ডেকে আনা দরকার। এনভিদিয়ার কেপলারে আপনি এমনকি মূল লুপটি জিপিইউতে স্থানান্তর করতে পারেন, তবে আমি এটি বেশি লাভ করার আশা করি না।

অ্যালগরিদম সমান্তরালতার একটি (কনফিগারযোগ্য) ডিগ্রি অর্জন করে। আমার ধারণা, মজাদার প্রশ্ন হ'ল সংঘাতগুলি আপনার এলোমেলো বিতরণকে প্রভাবিত করবে কিনা যখন আপনি বৃদ্ধি করবেন k


0

আমি আপনাকে পরামর্শ দিচ্ছি যে আপনি এই লিঙ্কটি দেখুন http://www.wolfram.com/training/courses/hpc021.html প্রায় 14-15 মিনিটের ভিডিওর আগে অবশ্যই গণিতের প্রশিক্ষণ যেখানে তারা সিডিডিএ ব্যবহার করে সেলুলার অটোমেটার প্রয়োগ করে make , সেখান থেকে এবং আপনি এটি সংশোধন করতে পারেন।


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