একাধিক কোর ব্যবহার করে জি ++ সহ সংকলন


174

তাত্ক্ষণিক প্রশ্ন: বড় প্রকল্পগুলি আরও দ্রুত সংকলন করতে g ++ নিজেই একাধিক উদাহরণ সঞ্চার করার জন্য সংকলক পতাকাটি কী (উদাহরণস্বরূপ মাল্টি-কোর সিপিইউয়ের জন্য একসময় 4 উত্স ফাইল)?


এটা কি সত্যিই সাহায্য করবে? আমার সমস্ত সংকলনের কাজগুলি সিপিইউ বাউন্ডের চেয়ে আই / ও বাউন্ডেড।
ব্রায়ান নোব্লাচ

5
এমনকি যদি তারা আমি / হে আবদ্ধ হয় তবে সিপিইউ ভারী বিটগুলি ঘটতে থাকলে আপনি সম্ভবত I / O লোডকে বেশি রাখতে পারবেন (কেবলমাত্র একটি জি ++ উদাহরণের সাথে লুলগুলি থাকবে) এবং শিডিয়ুলারের সম্পর্কে আরও পছন্দ থাকলে সম্ভবত I / O দক্ষতা অর্জন করতে পারেন পরবর্তী ডিস্ক থেকে কি পড়তে হবে। আমার অভিজ্ঞতা হয়েছে যে make -jপ্রায় সর্বদা বিচার্য ব্যবহারের ফলে কিছুটা উন্নতি হয়।
ফ্লেক্সো

1
@ ব্রায়ানকনোব্লাচ তবে আমার মেশিনে (আসল এক বা ভার্চুয়ালবক্সে) এটি সিপিইউ আবদ্ধ, আমি খুঁজে পেলাম যে সংকলন করার সময় সিপিইউ 'টপ' কমান্ডের মাধ্যমে ব্যস্ত।
宝剑 宝剑

1
এমনকি যদি তারা আমি / হে আবদ্ধ হয়, আমরা ব্যথা কমাতে জিসিসির পতাকা '-পাইপ' ব্যবহার করতে পারি।
宝剑

সবেমাত্র এটি গুগলে দেখেছেন: gcc.gnu.org/onlinesocs/libstdc++/manual/…
জিম মাইকেলস

উত্তর:


240

আপনি মেক দিয়ে এটি করতে পারেন - gnu মেক দিয়ে এটি-জে ফ্ল্যাগ (এটি একটি ইউনিকপ্রসেসর মেশিনেও সহায়তা করবে)।

উদাহরণস্বরূপ আপনি যদি মেক থেকে 4 সমান্তরাল কাজ চান:

make -j 4

আপনি একটি পাইপে জিসিসি চালাতে পারেন

gcc -pipe

এটি সঙ্কলনের পর্যায়ে পাইপলাইন তৈরি করবে, যা কোরগুলিকে ব্যস্ত রাখতে সহায়তা করবে।

আপনার যদি অতিরিক্ত মেশিনও উপলব্ধ থাকে তবে আপনি ডিস্টিসি পরীক্ষা করতে পারেন , যা ফার্মগুলি সেইসাথে তাদের সংকলন করবে।


36
আপনার -জে নম্বরটি আপনার যতগুলি কোর রয়েছে তার সংখ্যা 1.5x হওয়া উচিত।
মার্ক Beckwith

2
ধন্যবাদ। আমি সিএফএলএজিএস / সিপিপিএফএলএজিএস / সিএক্সএক্সএফএলএজিএস এর মাধ্যমে জিসিসিতে "-j #" যাওয়ার চেষ্টা করে চলেছি। আমি পুরোপুরি ভুলে গিয়েছিলাম যে "-j #" হ'ল জিএনইউ মেক (এবং জিসিসির জন্য নয়) জন্য একটি প্যারামিটার ছিল।
chriv

33
জিএনইউ মেকের জন্য -j বিকল্পটি সিপিইউ কোরগুলির সংখ্যা 1.5 x হওয়া দরকার কেন ?
বিটেক

28
1.5 নম্বর কারণ উল্লেখ নেই , I / O আবদ্ধ সমস্যা। এটি থাম্ব একটি নিয়ম। প্রায় 1/3 টি চাকরি I / O এর জন্য অপেক্ষা করবে, সুতরাং অবশিষ্ট কাজগুলি উপলব্ধ কোরগুলি ব্যবহার করবে। কোরগুলির চেয়ে বড় একটি সংখ্যা ভাল এবং আপনি এমনকি 2x এর চেয়ে বেশি যেতে পারেন । আরও দেখুন: জ্ঞু -jআর্গুমেন্ট করেন
নির্মম আওয়াজ

4
@ জিমমিচেলস এটি হতে পারে কারণ আপনার প্রকল্পের মধ্যে নির্ভরতাগুলি খারাপভাবে সেট হয়ে গেছে, (একটি লক্ষ্য এখনও নির্মাণ শুরু করে যদিও এর নির্ভরতা এখনও প্রস্তুত না হয়) যাতে কেবল একটি ক্রমবর্ধমান বিল্ডিং সফল হয়।
আন্তোনিও

42

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

Make -j4

অথবা আপনি পামেক বা অনুরূপ সমান্তরাল মেক সিস্টেম ব্যবহার করতে পারেন।



3
"ইউনিক্স পেডেন্ট্রি সহায়ক নয়" ভাল জিনিস এটি তখন পেডেন্ট্রি ছিল না, বেনাম সম্পাদক। ফিরে ঘূর্ণিত. পর্যালোচকরা দয়া করে আপনি যা করছেন তার প্রতি আরও মনোযোগ দিন।
অরবিটে মেঘলা হালকা ঘোড়দৌড়

12

লোকেরা উল্লেখ করেছে makeতবে bjamএকই ধরণের ধারণাকে সমর্থন করে। একযোগে কমান্ড bjam -jxআপ করতে নির্দেশাবলী ব্যবহার xকরে।

আমরা উইন্ডোজ এবং লিনাক্সে একই বিল্ড স্ক্রিপ্ট ব্যবহার করি এবং এই বিকল্পটি ব্যবহার করে উভয় প্ল্যাটফর্মে আমাদের বিল্ড সময় অর্ধেক হয়ে যায়। খুশী হলাম।


9

makeআপনার জন্য এটি করবে। তদন্ত -jএবং -lমানুষ পৃষ্ঠা থেকে পরিবর্তন করা হয়। আমি g++সমান্তরাল মনে করি না ।


-lবিকল্প উল্লেখ করার জন্য +1 (পূর্ববর্তী সমস্ত কাজ শেষ না করা হলে নতুন কাজ শুরু করবেন না)। অন্যথায় মনে হয় লিঙ্কারের কাজটি সমস্ত অবজেক্ট ফাইলগুলি নির্মিত না দিয়ে শুরু হয় (কিছু সংকলন এখনও চলছে), যাতে লিঙ্কারের কাজ ব্যর্থ হয়।
এনজিআই

8

যদি মেক ব্যবহার করে থাকেন তবে ইস্যু করুন -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 এর চেয়ে বেশি যেতে পারেন।


5
: বেশীরভাগ Linux ব্যবহারকারীরা সম্ভবত খাটো গ্রহন করেবেন make -j`nproc` সঙ্গে nprocগনুহ Coreutils হবে।
সিরো সান্তিলি 郝海东 冠状 病 六四 事件 法轮功

আপনি যদি কোনও এসএসডি ব্যবহার করেন তবে আমি / ও কোনও ইস্যু হিসাবে বেশি হব না। উপরোক্ত সিরোর মন্তব্যের ভিত্তিতে কেবল আপনি এটি করতে পারেন: make -j $(( $(nproc) + 1 ))(আমার কাছে যেখানে জায়গা রয়েছে সেখানে আপনি জায়গা রেখেছেন তা নিশ্চিত করুন)।
এড কে

অজগর ব্যবহার করে দুর্দান্ত পরামর্শ, এমন সিস্টেমে যেখানে nprocপাওয়া যায় না, যেমন manylinux1পাত্রে, এটি চলমান yum update/ এড়িয়ে অতিরিক্ত সময় সাশ্রয় করে yum install
21

7

কেবল বর্তমান মেশিনেই নয়, একটি ফার্মের ডিস্টসি ইনস্টল থাকা অন্যান্য মেশিনগুলিতেও সংকলন বিতরণ করতে ডিস্টিসি ব্যবহার করা যেতে পারে।


+1, ডিস্টিসিপি একটি বড় বিল্ডগুলির জন্য নিজের অস্ত্রাগারে রাখা একটি দরকারী সরঞ্জাম।
ফ্লেক্সো

দেখে মনে হচ্ছে কয়েকটি আছে কাজ "মত" distcc পাশাপাশি: stackoverflow.com/questions/5374106/distributed-make/...
rogerdpack

3

আমি জি ++ সম্পর্কে নিশ্চিত নই, তবে আপনি যদি জিএনইউ মেক ব্যবহার করেন তবে "মেক-জে এন" (যেখানে থ্রেডগুলি তৈরি করতে পারে এমন সংখ্যার সংখ্যা) একই সাথে একাধিক জি ++ কাজ চালানোর অনুমতি দেবে (এত দীর্ঘ ফাইলগুলি একে অপরের উপর নির্ভর করে না)।


2
কোন এন থ্রেড সংখ্যা নয়! অনেক লোক -j Nএটিকে ভুল বুঝে, তবে একবারে কতগুলি প্রক্রিয়া তৈরি করা উচিত তা জানিয়ে দেয়, থ্রেড নয়। এটি cl -MTএমএসের মতো পারফরম্যান্ট না হওয়ার কারণ (সত্যই বহুবিধ)।
Sebi2020

2

জিএনইউ সমান্তরাল

আমি একটি সিনথেটিক সংকলন মানদণ্ড তৈরি করছিলাম এবং একটি মেকফিল লিখতে বিরক্ত করা যাচ্ছিল না, তাই আমি ব্যবহার করেছি:

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।

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