এখানে কেন কার্যকরী প্রোগ্রামিং আমার আর্গুমেন্ট করতে পারেন , এবং উচিত গণনীয় বিজ্ঞানের জন্য ব্যবহার করা যেতে পারে। সুবিধাগুলি সুবিধামত, এবং কনসগুলি দ্রুত চলে যাচ্ছে। আমার মনে একটাই কন:
কন : সি / সি ++ / ফোর্টরানে ভাষা সহায়তার অভাব
কমপক্ষে সি ++ এ, এই কোণটি বিলুপ্ত হচ্ছে - যেহেতু সি ++ 14/17 কার্যকরী প্রোগ্রামিং সমর্থন করার জন্য শক্তিশালী সুবিধা যুক্ত করেছে। আপনার নিজের জন্য কিছু লাইব্রেরি / সমর্থন কোড লেখার প্রয়োজন হতে পারে তবে ভাষাটি আপনার বন্ধু হবে। উদাহরণস্বরূপ, এখানে একটি (সতর্কতা: প্লাগ) লাইব্রেরি রয়েছে যা সি ++: https://github.com/jzrake/ndarray-v2 এ অবিচ্ছেদ্য বহু-মাত্রিক অ্যারে করে ।
এছাড়াও, এখানে C ++ এ ফাংশনাল প্রোগ্রামিং সম্পর্কিত একটি ভাল বইয়ের লিঙ্ক রয়েছে , যদিও এটি বিজ্ঞানের প্রয়োগগুলিতে মনোনিবেশ করা হয়নি।
আমি যা বিশ্বাস করি তার সংক্ষিপ্ত বিবরণটি এখানে প্রো-এর রয়েছে:
পেশাদাররা :
- শুদ্ধি
- ক্ষমতা অভিব্যক্তি
- কর্মক্ষমতা
নিরিখে শুদ্ধি , কার্যকরী প্রোগ্রাম প্রকাশ্যে হয় ভালভাবে যাকে জাহির : তারা সঠিকভাবে আপনার পদার্থবিদ্যা ভেরিয়েবল ন্যূনতম রাষ্ট্র, এবং ফাংশন নির্ধারণ করতে বাধ্য যে অগ্রগতি ঐ সময়ের মধ্যে রাষ্ট্র এগিয়ে:
int main()
{
auto state = initial_condition();
while (should_continue(state))
{
state = advance(state);
side_effects(state);
}
return 0;
}
আংশিক ডিফারেনশিয়াল সমীকরণ (বা ওডিই) সমাধান করা কার্যকরী প্রোগ্রামিংয়ের জন্য উপযুক্ত; আপনি কেবলমাত্র advance
পরবর্তী সমাধানটি উত্পন্ন করার জন্য একটি খাঁটি ফাংশন ( ) প্রয়োগ করছেন ।
আমার অভিজ্ঞতায়, পদার্থবিজ্ঞানের সিমুলেশন সফ্টওয়্যার হ'ল এবং বড়, দরিদ্র রাষ্ট্র পরিচালনার দ্বারা বোঝা । সাধারণত, অ্যালগরিদমের প্রতিটি পর্যায় ভাগ করে নেওয়া (কার্যকরভাবে বিশ্বব্যাপী) রাষ্ট্রের কিছু অংশে কাজ করে। এটি সফটওয়্যারকে সেগ-ফল্ট হিসাবে চিহ্নিত করতে পারে বা আরও খারাপ, ত্রুটি পদগুলি যা আপনার কোডটি ক্র্যাশ করে না তবে চুপচাপ তার বিজ্ঞানের অখণ্ডতার সাথে আপস করে, অপারেশনগুলির সঠিক ক্রমটি নিশ্চিত করা শক্ত, বা এমনকি অসম্ভবকে শক্ত করে তোলে This আউটপুট। ফিজিক্স সিমুলেশনে শেয়ারড স্টেট পরিচালনা করার চেষ্টা করাও মাল্টি-থ্রেডিং বাধা দেয় - যা ভবিষ্যতের জন্য সমস্যা, কারণ সুপার কম্পিউটারগুলি উচ্চতর মূল গণনার দিকে এগিয়ে চলেছে এবং এমপিআই দিয়ে স্কেলিং প্রায়শই ~ 100k টাস্কে শীর্ষে থাকে। বিপরীতে, কার্যকরী প্রোগ্রামিং অবিচ্ছেদ্যতার কারণে ভাগ করে নেওয়া মেমরির সমান্তরালতাকে তুচ্ছ করে তোলে।
অ্যালগরিদমগুলির অলস মূল্যায়নের কারণে ক্রিয়ামূলক প্রোগ্রামিংয়েও পারফরম্যান্স উন্নত হয় (সি ++ এ, এর অর্থ সংকলন সময়ে অনেক ধরণের উত্পন্ন করা - প্রায়শই কোনও ফাংশনের প্রতিটি প্রয়োগের জন্য একটি)। তবে এটি মেমরি অ্যাক্সেস এবং বরাদ্দের ওভারহেড হ্রাস করে পাশাপাশি ভার্চুয়াল প্রেরণাকে হ্রাস করে - সংকলকটিকে সমস্ত ফাংশন যুক্ত করে একবারে এটি দেখে সম্পূর্ণ অ্যালগরিদমকে অনুকূল করতে দেয়। অনুশীলনে, আপনি সিপিইউ বনাম মেমরি বরাদ্দ ব্যবহারের অনুকূলকরণের জন্য মূল্যায়ন পয়েন্টগুলির বিভিন্ন ব্যবস্থা (যেখানে অ্যালগোরিদম ফলাফল একটি মেমরি বাফারে ক্যাশে করা হয়) নিয়ে পরীক্ষা-নিরীক্ষা করবেন। অ্যালগরিদম পর্যায়ের উচ্চ লোকাল (নীচের উদাহরণ দেখুন) এর কারণে আপনি সাধারণত কোনও মডিউল বা শ্রেণিভিত্তিক কোডে সাধারণত দেখতে পাবেন তার তুলনায় এটি বরং সহজ।
কার্যকরী প্রোগ্রামগুলি ফিজিক্সের অবস্থাকে তুচ্ছ করে দেওয়ার কারণে ইনফার বোঝা আরও সহজ । এর অর্থ এই নয় যে তাদের বাক্য গঠনটি আপনার সকল সহকর্মীর দ্বারা সহজেই বোধগম্য হয়! লেখকগণ সুনামযুক্ত ফাংশনগুলি ব্যবহার করার ক্ষেত্রে সতর্ক হওয়া উচিত এবং সাধারণভাবে গবেষকরা পদ্ধতিগতভাবে পরিবর্তে কার্যকরীভাবে প্রকাশিত অ্যালগরিদমগুলি দেখতে অভ্যস্ত হওয়া উচিত। আমি স্বীকার করব যে নিয়ন্ত্রণ কাঠামোর অনুপস্থিতি কারও কারও কাছে বন্ধুত্বপূর্ণ হতে পারে, তবে আমি মনে করি না যে এটি আমাদের ভবিষ্যতে কম্পিউটারে আরও ভাল মানের বিজ্ঞান করতে সক্ষম হওয়া থেকে বিরত হবে।
নীচে একটি নমুনা advance
ফাংশন রয়েছে, ndarray-v2
প্যাকেজটি ব্যবহার করে একটি সীমাবদ্ধ-ভলিউম কোড থেকে অভিযোজিত । to_shared
অপারেটরদের দ্রষ্টব্য - এই সেই মূল্যায়নের পয়েন্টগুলি যা আমি আগেই নির্দেশ করেছিলাম।
auto advance(const solution_state_t& state)
{
auto dt = determine_time_step_size(state);
auto du = state.u
| divide(state.vertices | volume_from_vertices)
| nd::map(recover_primitive)
| extrapolate_boundary_on_axis(0)
| nd::to_shared()
| compute_intercell_flux(0)
| nd::to_shared()
| nd::difference_on_axis(0)
| nd::multiply(-dt * mara::make_area(1.0));
return solution_state_t {
state.time + dt,
state.iteration + 1,
state.vertices,
state.u + du | nd::to_shared() };
}