তাত্ক্ষণিক প্রশ্ন: বড় প্রকল্পগুলি আরও দ্রুত সংকলন করতে g ++ নিজেই একাধিক উদাহরণ সঞ্চার করার জন্য সংকলক পতাকাটি কী (উদাহরণস্বরূপ মাল্টি-কোর সিপিইউয়ের জন্য একসময় 4 উত্স ফাইল)?
make -j
প্রায় সর্বদা বিচার্য ব্যবহারের ফলে কিছুটা উন্নতি হয়।
তাত্ক্ষণিক প্রশ্ন: বড় প্রকল্পগুলি আরও দ্রুত সংকলন করতে g ++ নিজেই একাধিক উদাহরণ সঞ্চার করার জন্য সংকলক পতাকাটি কী (উদাহরণস্বরূপ মাল্টি-কোর সিপিইউয়ের জন্য একসময় 4 উত্স ফাইল)?
make -j
প্রায় সর্বদা বিচার্য ব্যবহারের ফলে কিছুটা উন্নতি হয়।
উত্তর:
আপনি মেক দিয়ে এটি করতে পারেন - gnu মেক দিয়ে এটি-জে ফ্ল্যাগ (এটি একটি ইউনিকপ্রসেসর মেশিনেও সহায়তা করবে)।
উদাহরণস্বরূপ আপনি যদি মেক থেকে 4 সমান্তরাল কাজ চান:
make -j 4
আপনি একটি পাইপে জিসিসি চালাতে পারেন
gcc -pipe
এটি সঙ্কলনের পর্যায়ে পাইপলাইন তৈরি করবে, যা কোরগুলিকে ব্যস্ত রাখতে সহায়তা করবে।
আপনার যদি অতিরিক্ত মেশিনও উপলব্ধ থাকে তবে আপনি ডিস্টিসি পরীক্ষা করতে পারেন , যা ফার্মগুলি সেইসাথে তাদের সংকলন করবে।
-j
আর্গুমেন্ট করেন
এর মতো কোনও পতাকা নেই, এবং প্রতিটি সরঞ্জামের কেবল একটি ফাংশন সম্পাদন এবং এটি ভালভাবে সম্পাদন করার ইউনিক্স দর্শনের বিরুদ্ধে একটি রান রয়েছে। স্প্যামিং সংকলক প্রক্রিয়াগুলি ধারণামূলকভাবে বিল্ড সিস্টেমের কাজ। আপনি সম্ভবত যা খুঁজছেন তা হ'ল জিএনইউ মেকের একটি জে (জব) পতাকা flag
Make -j4
অথবা আপনি পামেক বা অনুরূপ সমান্তরাল মেক সিস্টেম ব্যবহার করতে পারেন।
make
আপনার জন্য এটি করবে। তদন্ত -j
এবং -l
মানুষ পৃষ্ঠা থেকে পরিবর্তন করা হয়। আমি g++
সমান্তরাল মনে করি না ।
-l
বিকল্প উল্লেখ করার জন্য +1 (পূর্ববর্তী সমস্ত কাজ শেষ না করা হলে নতুন কাজ শুরু করবেন না)। অন্যথায় মনে হয় লিঙ্কারের কাজটি সমস্ত অবজেক্ট ফাইলগুলি নির্মিত না দিয়ে শুরু হয় (কিছু সংকলন এখনও চলছে), যাতে লিঙ্কারের কাজ ব্যর্থ হয়।
যদি মেক ব্যবহার করে থাকেন তবে ইস্যু করুন -j
। থেকে man make
:
-j [jobs], --jobs[=jobs] Specifies the number of jobs (commands) to run simultaneously. If there is more than one -j option, the last one is effective. If the -j option is given without an argument, make will not limit the number of jobs that can run simultaneously.
এবং উল্লেখযোগ্যভাবে, আপনি যদি আপনার যে কয়টি কোর উপলব্ধ রয়েছে তা স্ক্রিপ্ট করতে বা সনাক্ত করতে চান (আপনার পরিবেশের উপর নির্ভর করে এবং আপনি যদি অনেক পরিবেশে চালনা করেন তবে এটি অনেক পরিবর্তন করতে পারে) আপনি সর্বব্যাপী পাইথন ফাংশনটি ব্যবহার করতে পারেন cpu_count()
:
https://docs.python.org/3/library/multiprocessing.html#multiprocessing.cpu_count
এটার মত:
make -j $(python3 -c 'import multiprocessing as mp; print(int(mp.cpu_count() * 1.5))')
আপনি যদি জিজ্ঞাসা করছেন কেন 1.5
আমি উপরের মন্তব্যে আমি ব্যবহারকারী অরক্ষিত-শব্দটি উদ্ধৃত করছি :
1.5 নম্বরটি উল্লেখিত আই / ও বাউন্ড সমস্যার কারণে। এটি থাম্ব একটি নিয়ম। প্রায় 1/3 টি চাকরি I / O এর জন্য অপেক্ষা করবে, সুতরাং অবশিষ্ট কাজগুলি উপলব্ধ কোরগুলি ব্যবহার করবে। কোরগুলির চেয়ে বড় একটি সংখ্যা ভাল এবং আপনি এমনকি 2x এর চেয়ে বেশি যেতে পারেন।
make -j`nproc`
সঙ্গে nproc
গনুহ Coreutils হবে।
make -j $(( $(nproc) + 1 ))
(আমার কাছে যেখানে জায়গা রয়েছে সেখানে আপনি জায়গা রেখেছেন তা নিশ্চিত করুন)।
nproc
পাওয়া যায় না, যেমন manylinux1
পাত্রে, এটি চলমান yum update
/ এড়িয়ে অতিরিক্ত সময় সাশ্রয় করে yum install
।
কেবল বর্তমান মেশিনেই নয়, একটি ফার্মের ডিস্টসি ইনস্টল থাকা অন্যান্য মেশিনগুলিতেও সংকলন বিতরণ করতে ডিস্টিসি ব্যবহার করা যেতে পারে।
আমি জি ++ সম্পর্কে নিশ্চিত নই, তবে আপনি যদি জিএনইউ মেক ব্যবহার করেন তবে "মেক-জে এন" (যেখানে থ্রেডগুলি তৈরি করতে পারে এমন সংখ্যার সংখ্যা) একই সাথে একাধিক জি ++ কাজ চালানোর অনুমতি দেবে (এত দীর্ঘ ফাইলগুলি একে অপরের উপর নির্ভর করে না)।
-j N
এটিকে ভুল বুঝে, তবে একবারে কতগুলি প্রক্রিয়া তৈরি করা উচিত তা জানিয়ে দেয়, থ্রেড নয়। এটি cl -MT
এমএসের মতো পারফরম্যান্ট না হওয়ার কারণ (সত্যই বহুবিধ)।
জিএনইউ সমান্তরাল
আমি একটি সিনথেটিক সংকলন মানদণ্ড তৈরি করছিলাম এবং একটি মেকফিল লিখতে বিরক্ত করা যাচ্ছিল না, তাই আমি ব্যবহার করেছি:
sudo apt-get install parallel
ls | grep -E '\.c$' | parallel -t --will-cite "gcc -c -o '{.}.o' '{}'"
ব্যাখ্যা:
{.}
ইনপুট আর্গুমেন্ট গ্রহণ করে এবং এর এক্সটেনশনটি সরিয়ে দেয়-t
আমাদের অগ্রগতি সম্পর্কে ধারণা দিতে চালানো কমান্ডগুলি মুদ্রণ করে--will-cite
আপনি যদি এটি ব্যবহার করে ফলাফল প্রকাশ করেন তবে সফ্টওয়্যারটির উদ্ধৃতি দেওয়ার অনুরোধটি সরিয়ে দেয় ...parallel
এতটাই সুবিধাজনক যে আমি নিজেও একটি টাইমস্ট্যাম্প পরীক্ষা করতে পারি:
ls | grep -E '\.c$' | parallel -t --will-cite "\
if ! [ -f '{.}.o' ] || [ '{}' -nt '{.}.o' ]; then
gcc -c -o '{.}.o' '{}'
fi
"
xargs -P
সমান্তরালভাবেও চাকরী চালাতে পারে তবে এক্সটেনশন ম্যানিপুলেশন করা বা এটির সাথে একাধিক কমান্ড চালানো কিছুটা কম সুবিধাজনক: xargs এর মাধ্যমে একাধিক কমান্ড কল করা
সমান্তরাল লিঙ্কিং এ জিজ্ঞাসা করা হয়েছিল: লিঙ্ক করার সময় জিসিসি একাধিক কোর ব্যবহার করতে পারে?
টোডো: আমি মনে করি যে আমি কোথাও পড়েছি যে সংকলনটি ম্যাট্রিক্সের গুণায় হ্রাস করা যায়, তাই সম্ভবত বড় ফাইলগুলির জন্য একক ফাইল সংকলন দ্রুত করাও সম্ভব। তবে আমি এখনই একটি রেফারেন্স পাই না।
উবুন্টুতে পরীক্ষা করা হয়েছে 18.10।