(কীভাবে) সিমুলেশনগুলি দ্রুত চালিত হয়?


16

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

কখনও কখনও সিএফডি এর কম্পিউটিং দিকটি সমীকরণগুলি পরিচালনা করা বা গণিত করার চেয়ে ক্লান্তিকর হয়ে ওঠে।

সাধারণ নির্দেশিকা কী কী যা আমাদের প্রোগ্রামটি দ্রুত চালায়? সমান্তরালভাবে জিনিসগুলি করার কৌশলগুলি কী কী? দ্রুত চালিত কোডগুলি কীভাবে লিখবেন?

উপরের প্রশ্নের উত্তরগুলি কোথায় আমি (আমার মতো ল্যাপারসনের জন্য সহজেই বোঝার জন্য) সংস্থানগুলি পেতে পারি?



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

আপনি অজগর উপর স্থির হয় বা আপনি সি ++ বিবেচনা করবে? এই ক্ষেত্রে আমি দুটি বিষয় প্রস্তাব করব: সি ++ শিখুন, একটি ওপেন সোর্স লাইব্রেরিটি সন্ধান করুন (আমার ক্ষেত্রে ওপেনফোএএম), স্ক্র্যাচ থেকে জিনিসগুলি বিকাশ করবেন না, তবে শিখুন, কোডের একটি উন্নত অংশের মাধ্যমে খনন করুন, এর দিকটি সম্পর্কে শিখুন, পরিবর্তন এবং পরীক্ষা, সমস্ত একটি নির্দিষ্ট উদ্দেশ্য নিয়ে চালিত: আপনার ক্ষেত্রে, যেমন, বায়ুসংস্থান সংক্রান্ত অনুকরণ।
tmaric

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

@ এসএমজে বিটিডব্লু, আমিও একটি মেকানিকাল ইঞ্জিনিয়ারিং ব্যাকগ্রাউন্ড থেকে এসেছি এবং আমি এখন কম্পিউটেশনাল সায়েন্সের স্নাতক শিক্ষার্থী (মেচ। ইঞ্জিনিয়ারিং আমাকে এর জন্য প্রস্তুত করেনি) ... আপনি যদি অফের সাথে কাজ করছেন, সি ++ বইটি অনুসন্ধান করুন স্ট্যাক ওভারফ্লোতে তালিকাবদ্ধ করুন এবং শিখতে শুরু করুন। আপনার 3 টি জিনিস দরকার: সি ++, ওপেনফوم এবং গণনা বিজ্ঞান থেকে জ্ঞান। ওপেনফৌম এবং গণনা বিজ্ঞান, আপনি একটি নিখরচায় পদ্ধতিতে শিখতে পারেন: একটি অ্যাসাইনমেন্ট সন্ধান করুন এবং এটি সম্পন্ন করুন, আপনার যা প্রয়োজন তা শিখতে পারেন। কিছু শেষ করা আপনাকে অনুপ্রাণিত করবে। সি ++ হিসাবে: সি ++ প্রাইমার দিয়ে শুরু করুন এবং এটি শিখুন। শুভকামনা! :)
tmaric

উত্তর:


19

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

প্রথমত, আমি পাইথনে নতুন সিমুলেশনগুলির প্রোটোটাইপ করি। অবশ্যই, আমি যতটা সম্ভব NumPy এবং SciPy ব্যবহার করার চেষ্টা করি। NumPy সংখ্যার সিমুলেশনের জন্য একটি উপযুক্ত অ্যারে ডেটা প্রকার সরবরাহ করে, সায়পাই NumPy অ্যারেগুলির সাথে কাজ করে একটি বিস্তৃত সংখ্যাসূচক রুটিন সরবরাহ করে।

প্রোটোটাইপগুলি কম বা কম কাজ করার পরে, আমি প্রোগ্রাম বা স্ক্রিপ্টের কোন অংশটি বাধা learn তা জানতে চেষ্টা করি। এর জন্য আদর্শ প্রার্থী রয়েছে:

  • পাইথনের লুপগুলি ধীর। খুব ধীর.
  • পাইথন যেমন হাঁসের টাইপিং ব্যবহার করে , কল করার কাজগুলি ধীর হতে পারে।

সমস্ত রান সময় কোথায় ব্যয় হয় তা শিখতে আমি একটি সহজ প্রোফাইলিং কৌশল ব্যবহার করি। আইপিথন শেলটি ব্যবহার করে (যা আমি যথেষ্ট প্রস্তাব করতে পারি না), আমি আমার স্ক্রিপ্টটি দিয়ে চালাচ্ছি

%timeit script.py

এই "ম্যাজিক কমান্ড" আপনার জন্য প্রোফাইলিং ( টাইমাইট ব্যবহার করে ) করবে এবং একবারে আপনার স্ক্রিপ্টটি বন্ধ হয়ে যাওয়ার সাথে সাথে আপনাকে একটি তালিকা উপস্থাপন করবে। আপনার কোডটি খুব ধীরে কোথায় তা খুঁজে পেতে এই তালিকাটি ব্যবহার করুন।

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

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

অন্য সংকলিত ভাষা যা আপনার জন্য কার্যকর হবে তা হ'ল ফোর্টরান। পাইথনের সাথে ফোর্টরান ব্যবহারের বিভিন্ন উপায় রয়েছে ( f2py , Fortwrap , Cython )। আমার কাছে ব্যক্তিগতভাবে এফ 2 পিপি সবচেয়ে সহজ উপায় বলে মনে হচ্ছে, আমি দ্রুত এটি কী করে তা বর্ণনা করব। f2py পাইথন মডিউলগুলিতে ফোর্টরান কোড সংকলন করতে পারে। এটি আপনাকে পাইথন স্পেস থেকে ইনপুট এবং আউটপুট ভেরিয়েবল হিসাবে NumPy অ্যারে ব্যবহার করার অনুমতি দেবে। ফোর্টরান স্পেসে এগুলি হবে সাধারণ ফোর্টরান অ্যারে। আপনি সম্পূর্ণ ফোর্টরান গতিতে তাদের উপর পরিচালনা করতে পারেন।

ব্যক্তিগতভাবে, আমি সিথন ব্যবহার করি যেখানে ফাংশন কলগুলির সংখ্যাটি বাধা the লুপ-ভারী স্টাফের জন্য, আমি f2py পছন্দ করি (সম্ভবত কারণ আমার দৃ Fort় ফোর্টরান পটভূমি রয়েছে)।

ফরট্রানের অতিরিক্ত নোটে: আধুনিক ফোর্টরান নুমপির সাথে খুব অনুরূপ পড়েন এবং লেখেন - বাক্য গঠনটি খুব কাছে। এটি NumPy কোডটিকে ফোর্টরান কোডে রূপান্তর করা সহজ করে তোলে।

মনে রাখবেন যে সাইথন এবং এফ 2 পিপি উভয়ই কোনও উপায়ে সমান্তরালতা সমর্থন করে। Cython জন্য, আপনি সাহায্য পাবেন এখানে , যেহেতু ফোরট্রান জন্য, যেমন মান কৌশল আছে ফলে, OpenMP -র বা MPI। তদুপরি, এমপিআইয়ের জন্য পি ইথন মোড়কও রয়েছে । ব্যক্তিগতভাবে, আমি পাইথন স্তরের এমপিআই 4পি পাশাপাশি ফোরট্রানে ওপেনএমপি ব্যবহার করি।

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

আপনার যদি আরও নির্দিষ্ট প্রশ্ন থাকে তবে আমরা সবাই সাহায্য করে খুশি!


1
পাইথন প্রোফাইলারদের ওভারভিউয়ের জন্য কোডটি অনুকূলকরণের বিষয়ে স্কিপি-লেকচারগুলিও দেখুন ।
ডেনিস

7

সিএফডি + পাইথনের জন্য একটি সমাধান রয়েছে: http://pythonflu.wikidot.com/ এগুলি ওপেনফামের শীর্ষে পাইথন-বাইন্ডিং (যা ইতিমধ্যে প্রশ্নগুলির মন্তব্যে উল্লেখ করা হয়েছিল)। এই বাইন্ডিংগুলি "সলভার স্তর" -এ প্রোগ্রামিংয়ের অনুমতি দেয় (এমন উদাহরণ রয়েছে যেখানে পাইপনে মূল ওপেনফোম-সলভারগুলি প্রতিলিপি করা হয় এবং তারা মূলগুলির তুলনায় ধীর হয় না - "উত্তর অভ্যন্তরীণ লুপস" ঘটে বলে অন্য উত্তরে উল্লিখিত ধীর লুপগুলি এখানে কোনও সমস্যা নয় happen সি ++ - ওপেনফোমের কোডটিতে)।

এই বাইন্ডিংগুলির সুবিধাটি হ'ল ওপেনফোএমে সমস্ত সমান্তরালতা সলভার স্তরের নীচে ঘটে, সুতরাং আপনাকে এটির মাথা ঘামাতে হবে না (পাশাপাশি অন্যান্য জিনিস যা ওপেনফোম-কোর যত্ন নেয়: ইনপুট / আউটপুট, লিনিয়ার সলভার, অপারেটরের বিবেচনা)

সুতরাং আপনি যদি কেবল একটি নতুন সলভার লিখতে চান এবং অফ-কোর (সীমানা শর্ত, লিনিয়ার সলভার ইত্যাদি) তে নতুন বৈশিষ্ট্য যুক্ত না করতে চান তবে পাইথনফ্লু আপনার পক্ষে পর্যাপ্ত হতে পারে এবং আপনি সি ++ এড়াতে পারেন (যার তুলনায় অনেক বেশি উচ্চতর শিক্ষার নিরাময় রয়েছে পাইথন)

পিএস: মূলত এটি মূল প্রশ্নের আলোচনার জন্য একটি মন্তব্য হিসাবে যুক্ত করতে চেয়েছিল, তবে আমার খ্যাতি আমাকে এটিকে অনুমতি দেয় না


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