মেক-জে বিকল্পটি পাস করার জন্য সর্বোচ্চ নম্বর কীভাবে নির্ধারণ করবেন?


31

আমি যত দ্রুত সম্ভব সংকলন করতে চাই চিত্রে যান. এবং -jবিকল্পটি অনুসরণ করে নম্বরটির পছন্দটি স্বয়ংক্রিয় করতে চাই । আমি কীভাবে প্রোগ্রামের মাধ্যমে সেই মানটি বেছে নিতে পারি, যেমন শেল স্ক্রিপ্টে?

আমার nprocসংকলনের জন্য উপলব্ধ থ্রেডের সংখ্যার সমতুল্য আউটপুট কি ?

make -j1 make -j16

উত্তর:


34

nproc উপলব্ধ সিপিইউ কর / থ্রেডের সংখ্যা দেয়, যেমন একটি চতুর্ভুজ কোর CPU- র দ্বি-মুখী শ্রীমতি সমর্থনকারী উপর 8।

বিকল্পটি makeব্যবহারের সাথে সমান্তরালভাবে আপনি যে কাজগুলি চালাতে পারবেন -jতা বিভিন্ন কারণের উপর নির্ভর করে:

  • উপলব্ধ মেমরি পরিমাণ
  • প্রতিটি দ্বারা ব্যবহৃত মেমরি পরিমাণ make কাজের
  • makeI / O- বা CPU- সীমাবদ্ধ কাজের পরিমাণটি

make -j$(nproc) শুরু করার জন্য একটি শালীন জায়গা, তবে আপনি যতক্ষণ না আপনার উপলভ্য স্মৃতিশক্তি নিঃসরণ করেন এবং আঘাত হ্রাস না করেন ততক্ষণ আপনি সাধারণত উচ্চতর মানগুলি ব্যবহার করতে পারেন।

সত্যিই দ্রুত বিল্ডগুলির জন্য, যদি আপনার পর্যাপ্ত স্মৃতি থাকে তবে আমি একটি ব্যবহারের পরামর্শ দিই tmpfs, make -j$(nproc)সেইভাবে বেশিরভাগ কাজ সিপিইউ-আবদ্ধ হবে এবং যত দ্রুত সম্ভব কাজ করবে।


3
এবং ccacheপরে পুনর্নির্মাণের জন্য তবে এটি ওটি
21:54

1
জিএনইউ সমান্তরাল জাতীয় কিছু ব্যবহার করা কি এখানে সার্থক হতে পারে?
টেরডন

আমি যদি একটি ব্যবহার tmpfsকরি তবে আমি কি এমন কোনও ডিরেক্টরি আকারের মধ্যে সীমাবদ্ধ থাকব যা আমার শারীরিক র‍্যাম আকারের চেয়ে সর্বদা ছোট?
তারাবিতে

2
এটি কোনও দুর্দান্ত উত্তর নয়, তবে প্রোগ্রামটিমেটিকভাবে দ্রুত "জে" মান নির্ধারণের প্রশ্নের কঠোর মনোভাবের মধ্যে আপনি 1 টি থেকে কিছু যুক্তিসঙ্গত উপরের সীমাতে (2x এনপ্রোক ??) লুপ করতে পারেন এবং একটি timeকলটিতে মেকটি लपेटতে পারেন । ফলাফলগুলি পরিষ্কার করুন, পুনরায় বার বার ধুয়ে নিন - এবং সময় / জে মানের মান অনুসারে বাছাই করুন।
জেফ শ্যাচলার

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

6

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

100 টি ক্ষুদ্র সি ফাইল সংকলন একটি একক বিশাল ফাইল বা বিপরীত সংকলনের চেয়ে দ্রুততর হতে পারে। বিশাল পরিমাণে সোজা-ফরওয়ার্ড / লিনিয়ার কোড তৈরির চেয়ে ছোট অতি সংশ্লেষিত কোড তৈরি করা ধীর হতে পারে।

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

বিল্ড স্পেসিফিকেশনের সঠিকতার দিকটিও রয়েছে। খুব জটিল বিল্ডে রেস শর্ত থাকতে পারে যা বিরতিহীনভাবে বিল্ড ব্যর্থতা ঘটায় এমন হারের সাথে যা জে ফ্যাক্টরের বৃদ্ধি বা হ্রাসের সাথে বন্যভাবে পরিবর্তিত হতে পারে।

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

আপনার পরিমাপের প্রকরণের বৈচিত্র্যের ধারণা পাওয়ার জন্য প্রথমে অনুমানিত অভিন্ন প্রেক্ষাপটে কয়েকটি অভিন্ন বিল্ডগুলি পরিমাপ করা ভাল ধারণা হতে পারে - যদি খুব বেশি হয় তবে এটি আপনার সম্পূর্ণ অপ্টিমাইজেশান প্রচেষ্টাকে বিপদে ফেলতে পারে (20% পরিবর্তনশীলতা 10% উন্নতি / পুরোপুরি গ্রহন করবে) জে ফ্যাক্টর অনুসন্ধানে অবক্ষয় পড়া)।

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


অন্তর্নিহিত বিল্ডের নির্ভরতা সম্পর্কে ভালভাবে লিখুন। -jপ্যারামিটারের সাথে কোনও নির্দিষ্ট নম্বর পাস করার বিষয়ে আপনি মন্তব্য করতে পারেন ? যেমনmake -j
তারাবিতে

4
make -jনির্ভরতা যেমন কাঁটাচামচ বোমার মতো অনুমতি দেয় তত বেশি চাকরি উত্সাহিত করবে ( superuser.com/questions/927836/… ); প্রসেসগুলি পরিচালনা করার চেয়ে বেশিরভাগ সিপিইউ ব্যয় করার ক্ষেত্রে বিল্ডটি ক্রল করবে ( সুপারুজার.কিউশনস / ৯৪৩68৮৫ /)) এবং অত্যন্ত সমান্তরাল বিল্ডগুলিতে সিস্টেমটি মেমরি / অদলবদল বা পিড # এর বাইরে চলে যাবে এবং বিল্ডটি ব্যর্থ হবে ।
ড্যান কর্নিলিস্কু

3

সর্বাধিক সরল-প্রিয় উপায় হ'ল এর nprocমতো ব্যবহার করা :

make -j`nproc`

কমান্ডটি nprocআপনার মেশিনে কোরগুলির সংখ্যা ফিরিয়ে দেবে। এটি টিক্সের মধ্যে মোড়কের মাধ্যমে, nprocকমান্ডটি প্রথমে কার্যকর করবে, একটি নম্বর ফেরত দেবে এবং সেই নম্বরটি উত্তীর্ণ হবে make

আপনার কাছে কিছু কৌতুকপূর্ণ অভিজ্ঞতা থাকতে পারে যেখানে মূল সংকলন + 1 দ্রুত সংকলনের সময়ে ফলাফল করে। আই / ও বিলম্ব, অন্যান্য সংস্থান দেরি এবং সংস্থানসমূহের অন্যান্য সহজলভ্যতার মতো বিষয়গুলির সাথে এর আরও বেশি সম্পর্ক রয়েছে।

এটি করার জন্য nproc+1এটি ব্যবহার করে দেখুন:

make -j$((`nproc`+1))

0

makeভার্চুয়াল সিপিইউ যতটা সমান্তরাল কর্মী ব্যবহার করার জন্য আপনি যদি কমান্ডটি লিখতে চান তবে আমি ব্যবহার করার পরামর্শ দিই:

nproc | xargs -I % make -j%

যা হয় স্ট্যান্ডেলোন কমান্ড হিসাবে বা RUNনির্দেশকের মধ্যে যেমন লেখা যেতে পারে Dockerfile(যেমন ডকার নেস্টেড আদেশগুলি সমর্থন করে না)

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