> 2 জিবি কোড সহ জিসিসি সংকলন ত্রুটি


108

আমার প্রায় ২.৮ গিগাবাইট অবজেক্ট কোডের প্রচুর ফাংশন রয়েছে (দুর্ভাগ্যক্রমে এর কোনও উপায় নেই, বৈজ্ঞানিক কম্পিউটিং ...)

আমি যখন তাদের লিঙ্ক করার চেষ্টা করি তখন আমি (প্রত্যাশিত) relocation truncated to fit: R_X86_64_32Sত্রুটিগুলি পাই যা আমি কম্পাইলার পতাকাটি নির্দিষ্ট করে বিশৃঙ্খলা প্রত্যাশা করেছিলাম -mcmodel=medium। আমার নিয়ন্ত্রণ থাকা ছাড়াও সংযুক্ত সমস্ত লাইব্রেরি -fpicপতাকা সহ সংকলিত হয়েছে ।

তবুও, ত্রুটিটি এখনও অব্যাহত রয়েছে এবং আমি ধরে নিয়েছি যে আমি সংযুক্ত কয়েকটি গ্রন্থাগারগুলি পিকের সাথে সংকলিত নেই।

ত্রুটি এখানে:

/usr/lib/gcc/x86_64-redhat-linux/4.1.2/../../../../lib64/crt1.o: In function `_start':
(.text+0x12): relocation truncated to fit: R_X86_64_32S against symbol `__libc_csu_fini'     defined in .text section in /usr/lib64/libc_nonshared.a(elf-init.oS)
/usr/lib/gcc/x86_64-redhat-linux/4.1.2/../../../../lib64/crt1.o: In function `_start':
(.text+0x19): relocation truncated to fit: R_X86_64_32S against symbol `__libc_csu_init'    defined in .text section in /usr/lib64/libc_nonshared.a(elf-init.oS)
/usr/lib/gcc/x86_64-redhat-linux/4.1.2/../../../../lib64/crt1.o: In function `_start':
(.text+0x20): undefined reference to `main'
/usr/lib/gcc/x86_64-redhat-linux/4.1.2/../../../../lib64/crti.o: In function    `call_gmon_start':
(.text+0x7): relocation truncated to fit: R_X86_64_GOTPCREL against undefined symbol      `__gmon_start__'
/usr/lib/gcc/x86_64-redhat-linux/4.1.2/crtbegin.o: In function `__do_global_dtors_aux':
crtstuff.c:(.text+0xb): relocation truncated to fit: R_X86_64_PC32 against `.bss' 
crtstuff.c:(.text+0x13): relocation truncated to fit: R_X86_64_32 against symbol `__DTOR_END__' defined in .dtors section in /usr/lib/gcc/x86_64-redhat-linux/4.1.2/crtend.o
crtstuff.c:(.text+0x19): relocation truncated to fit: R_X86_64_32S against `.dtors'
crtstuff.c:(.text+0x28): relocation truncated to fit: R_X86_64_PC32 against `.bss'
crtstuff.c:(.text+0x38): relocation truncated to fit: R_X86_64_PC32 against `.bss'
crtstuff.c:(.text+0x3f): relocation truncated to fit: R_X86_64_32S against `.dtors'
crtstuff.c:(.text+0x46): relocation truncated to fit: R_X86_64_PC32 against `.bss'
crtstuff.c:(.text+0x51): additional relocation overflows omitted from the output
collect2: ld returned 1 exit status
make: *** [testsme] Error 1

এবং সিস্টেম লাইব্রেরিগুলির সাথে আমি সংযুক্ত করছি:

-lgfortran -lm -lrt -lpthread

কোন ক্লু কোথায় সমস্যার সন্ধান করবেন?

সম্পাদনা: সবার আগে, আলোচনার জন্য আপনাকে ধন্যবাদ ... কিছুটা স্পষ্ট করার জন্য, আমার কয়েকশো ফাংশন রয়েছে (প্রতিটি অবজেক্ট 1 এমবি পৃথক অবজেক্ট ফাইলে আকারে):

double func1(std::tr1::unordered_map<int, double> & csc, 
             std::vector<EvaluationNode::Ptr> & ti, 
             ProcessVars & s)
{
    double sum, prefactor, expr;

    prefactor = +s.ds8*s.ds10*ti[0]->value();
    expr =       ( - 5/243.*(s.x14*s.x15*csc[49300] + 9/10.*s.x14*s.x15*csc[49301] +
           1/10.*s.x14*s.x15*csc[49302] - 3/5.*s.x14*s.x15*csc[49303] -
           27/10.*s.x14*s.x15*csc[49304] + 12/5.*s.x14*s.x15*csc[49305] -
           3/10.*s.x14*s.x15*csc[49306] - 4/5.*s.x14*s.x15*csc[49307] +
           21/10.*s.x14*s.x15*csc[49308] + 1/10.*s.x14*s.x15*csc[49309] -
           s.x14*s.x15*csc[51370] - 9/10.*s.x14*s.x15*csc[51371] -
           1/10.*s.x14*s.x15*csc[51372] + 3/5.*s.x14*s.x15*csc[51373] +
           27/10.*s.x14*s.x15*csc[51374] - 12/5.*s.x14*s.x15*csc[51375] +
           3/10.*s.x14*s.x15*csc[51376] + 4/5.*s.x14*s.x15*csc[51377] -
           21/10.*s.x14*s.x15*csc[51378] - 1/10.*s.x14*s.x15*csc[51379] -
           2*s.x14*s.x15*csc[55100] - 9/5.*s.x14*s.x15*csc[55101] -
           1/5.*s.x14*s.x15*csc[55102] + 6/5.*s.x14*s.x15*csc[55103] +
           27/5.*s.x14*s.x15*csc[55104] - 24/5.*s.x14*s.x15*csc[55105] +
           3/5.*s.x14*s.x15*csc[55106] + 8/5.*s.x14*s.x15*csc[55107] -
           21/5.*s.x14*s.x15*csc[55108] - 1/5.*s.x14*s.x15*csc[55109] -
           2*s.x14*s.x15*csc[55170] - 9/5.*s.x14*s.x15*csc[55171] -
           1/5.*s.x14*s.x15*csc[55172] + 6/5.*s.x14*s.x15*csc[55173] +
           27/5.*s.x14*s.x15*csc[55174] - 24/5.*s.x14*s.x15*csc[55175] +
           // ...
           ;

        sum += prefactor*expr;
    // ...
    return sum;
}

অবজেক্টটি sতুলনামূলকভাবে ছোট এবং প্রয়োজনীয় ধ্রুবকগুলি x14, x15, ..., ds0, ... ইত্যাদি রাখে যখন tiকেবল একটি বাহ্যিক গ্রন্থাগার থেকে দ্বিগুণ ফিরিয়ে দেয়। যেমন আপনি দেখতে পাচ্ছেন, csc[]মানগুলির একটি প্রাক্পম্পিউটেড ম্যাপ যা পৃথক অবজেক্ট ফাইলগুলিতে (প্রতিটি শতকরা প্রায় ~ 1 এমবি আকারের শত শত) মূল্যায়ন করা হয়:

void cscs132(std::tr1::unordered_map<int,double> & csc, ProcessVars & s)
{
    {
    double csc19295 =       + s.ds0*s.ds1*s.ds2 * ( -
           32*s.x12pow2*s.x15*s.x34*s.mbpow2*s.mWpowinv2 -
           32*s.x12pow2*s.x15*s.x35*s.mbpow2*s.mWpowinv2 -
           32*s.x12pow2*s.x15*s.x35*s.x45*s.mWpowinv2 -
           32*s.x12pow2*s.x25*s.x34*s.mbpow2*s.mWpowinv2 -
           32*s.x12pow2*s.x25*s.x35*s.mbpow2*s.mWpowinv2 -
           32*s.x12pow2*s.x25*s.x35*s.x45*s.mWpowinv2 +
           32*s.x12pow2*s.x34*s.mbpow4*s.mWpowinv2 +
           32*s.x12pow2*s.x34*s.x35*s.mbpow2*s.mWpowinv2 +
           32*s.x12pow2*s.x34*s.x45*s.mbpow2*s.mWpowinv2 +
           32*s.x12pow2*s.x35*s.mbpow4*s.mWpowinv2 +
           32*s.x12pow2*s.x35pow2*s.mbpow2*s.mWpowinv2 +
           32*s.x12pow2*s.x35pow2*s.x45*s.mWpowinv2 +
           64*s.x12pow2*s.x35*s.x45*s.mbpow2*s.mWpowinv2 +
           32*s.x12pow2*s.x35*s.x45pow2*s.mWpowinv2 -
           64*s.x12*s.p1p3*s.x15*s.mbpow4*s.mWpowinv2 +
           64*s.x12*s.p1p3*s.x15pow2*s.mbpow2*s.mWpowinv2 +
           96*s.x12*s.p1p3*s.x15*s.x25*s.mbpow2*s.mWpowinv2 -
           64*s.x12*s.p1p3*s.x15*s.x35*s.mbpow2*s.mWpowinv2 -
           64*s.x12*s.p1p3*s.x15*s.x45*s.mbpow2*s.mWpowinv2 -
           32*s.x12*s.p1p3*s.x25*s.mbpow4*s.mWpowinv2 +
           32*s.x12*s.p1p3*s.x25pow2*s.mbpow2*s.mWpowinv2 -
           32*s.x12*s.p1p3*s.x25*s.x35*s.mbpow2*s.mWpowinv2 -
           32*s.x12*s.p1p3*s.x25*s.x45*s.mbpow2*s.mWpowinv2 -
           32*s.x12*s.p1p3*s.x45*s.mbpow2 +
           64*s.x12*s.x14*s.x15pow2*s.x35*s.mWpowinv2 +
           96*s.x12*s.x14*s.x15*s.x25*s.x35*s.mWpowinv2 +
           32*s.x12*s.x14*s.x15*s.x34*s.mbpow2*s.mWpowinv2 -
           32*s.x12*s.x14*s.x15*s.x35*s.mbpow2*s.mWpowinv2 -
           64*s.x12*s.x14*s.x15*s.x35pow2*s.mWpowinv2 -
           32*s.x12*s.x14*s.x15*s.x35*s.x45*s.mWpowinv2 +
           32*s.x12*s.x14*s.x25pow2*s.x35*s.mWpowinv2 +
           32*s.x12*s.x14*s.x25*s.x34*s.mbpow2*s.mWpowinv2 -
           32*s.x12*s.x14*s.x25*s.x35pow2*s.mWpowinv2 -
           // ...

       csc.insert(cscMap::value_type(192953, csc19295));
    }

    {
       double csc19296 =      // ... ;

       csc.insert(cscMap::value_type(192956, csc19296));
    }

    // ...
}

এটা সম্বন্ধে. তারপরে চূড়ান্ত পদক্ষেপটি কেবলমাত্র func[i]সমস্তগুলিকে কল করা এবং ফলাফলের সংক্ষিপ্তকরণকে অন্তর্ভুক্ত করে।

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

সম্পাদনা 2: আমার আরও যোগ করা উচিত যে এক্স 12, এক্স 13, ইত্যাদি আসলে ধ্রুবক নয়। এগুলি নির্দিষ্ট মানগুলিতে সেট করা থাকে, সমস্ত ফাংশন চালিত হয় এবং ফলাফলটি ফিরে আসে এবং তারপরে পরবর্তী মানটি নির্ধারণের জন্য x12, x13 ইত্যাদির একটি নতুন সেট বেছে নেওয়া হয়। এবং এটি 10 ​​^ 5 থেকে 10 ^ 6 বার করতে হবে ...

সম্পাদনা 3: এখন পর্যন্ত দেওয়া পরামর্শ এবং আলোচনার জন্য আপনাকে ধন্যবাদ ... আমি কোনওভাবে কোড জেনারেশনের উপর লুপগুলি রোল করার চেষ্টা করব, সত্য কীভাবে এটি নিশ্চিত তা নিশ্চিত নয়, তবে এটি সেরা বেট।

বিটিডাব্লু, আমি "এটি বৈজ্ঞানিক কম্পিউটিং - অনুকূলকরণের উপায় নেই" এর আড়ালে লুকানোর চেষ্টা করিনি didn't এটি কেবলমাত্র এই কোডটির ভিত্তি এমন একটি "ব্ল্যাক বক্স" থেকে আসে যেখানে আমার কোনও সত্যিকারের অ্যাক্সেস নেই এবং তদুপরি, পুরো জিনিসটি সাধারণ উদাহরণ দিয়ে দুর্দান্ত কাজ করেছে, এবং মূলত যা ঘটেছিল তা নিয়ে আমি অভিভূত বোধ করি বিশ্ব অ্যাপ্লিকেশন ...

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

এখন আপনার উত্তরগুলির সাথে সম্পর্কিত: আমি লুপগুলিকে আবার funcগুলি করতে চেষ্টা করছি , যেখানে কোনও সিএএস বেশি সাহায্য করবে না, তবে ইতিমধ্যে আমার কিছু ধারণা আছে। উদাহরণস্বরূপ, ভেরিয়েবলগুলি দ্বারা এক্সপ্রেশনগুলি বাছাই করা যেমন পাইথনের সাথে x12, x13,...পার্স করুন cscএবং টেবিলগুলি তৈরি করুন যা একে অপরের সাথে সম্পর্কিত। তারপরে আমি অন্তত লুপ হিসাবে এই অংশগুলি তৈরি করতে পারি। যেহেতু এটি এখন পর্যন্ত সেরা সমাধান হিসাবে মনে হচ্ছে, আমি এটিকে সেরা উত্তর হিসাবে চিহ্নিত করি।

তবে, আমি ভিজেওকেও ক্রেডিট দিতে চাই। জিসিসি 4.6 প্রকৃতপক্ষে আরও ভাল কাজ করে, আরও ছোট কোড উত্পাদন করে এবং দ্রুত। বৃহত্তর মডেলটি ব্যবহার করে যেমন হয় তেমন কোডে কাজ করে। সুতরাং প্রযুক্তিগতভাবে এটি সঠিক উত্তর, তবে পুরো ধারণাটি পরিবর্তন করা একটি আরও ভাল পদ্ধতির।

আপনার পরামর্শ এবং সহায়তার জন্য আপনাকে ধন্যবাদ। যদি কেউ আগ্রহী হন, আমি প্রস্তুত হওয়ার সাথে সাথে চূড়ান্ত ফলাফল পোস্ট করতে যাচ্ছি।

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

সর্বশেষ সম্পাদনা: আপনার সমস্ত পরামর্শের জন্য ধন্যবাদ, আমি ম্যাথমেটিকা ​​এবং funcশীর্ষ জবাবের লাইন ধরে কিছুটা কোড জেনারেটর ব্যবহার করে কোডের আকারটি যথেষ্ট পরিমাণে হ্রাস করতে পেরেছি :)

আমি cscম্যাথমেটিকা দিয়ে ফাংশনগুলি সরল করে এটিকে 92 মেগাবাইটে নামিয়ে আনছি। এটি অপরিবর্তনীয় অংশ। প্রথম প্রচেষ্টা চিরকালের জন্য নিয়েছিল, তবে কিছু অপ্টিমাইজেশনের পরে এটি এখন একক সিপিইউতে প্রায় 10 মিনিটের মধ্যে চলে।

এর উপর প্রভাবটি funcনাটকীয় ছিল: তাদের জন্য পুরো কোডের আকারটি প্রায় 9 এমবিতে নেমে গেছে, সুতরাং কোডটি এখন 100 এমবি পরিসীমাতে মোট। এখন এটি অপ্টিমাইজেশানগুলি চালু করার অর্থবোধ করে এবং কার্যকর করা খুব দ্রুত হয়।

আবার, আপনার পরামর্শের জন্য আপনাকে সকলকে ধন্যবাদ, আমি অনেক কিছু শিখেছি।


17
যদি আপনার কাছে এত বেশি ডেটা থাকে তবে আপনার এটিকে উত্স ফাইলগুলি থেকে সরিয়ে নেওয়া উচিত এবং mmapরানটাইমের সময় এটি কোনও বাহ্যিক বাইনারি থেকে নিজেকে পরিবর্তিত করা উচিত।
আর .. গিথহাব বন্ধ করুন আইসিসি

3
আপনি এই ফাংশনগুলির একটি (বা দুটি) উদাহরণ দিতে পারেন? এটা সত্যিই অদ্ভুত লাগছে। আপনি dl * ফাংশন দিয়ে এই ফাংশনগুলি গতিশীলভাবে লোড করতে পারেন।
প্যাট্রিক Schlüter

7
@bbtrb: আমার প্রথম প্রবৃত্তিটি আর .. এর মতো, এটি একটি ডিজাইনের সমস্যা বলে মনে হচ্ছে। স্বীকারোক্তিপূর্ণ, আমি জানি না যে বৈজ্ঞানিক কম্পিউটিং চেনাশোনাগুলিতে কী সাধারণ, তবে আমি কখনও কখনও কোনও 2.8 গিগাবাইট অবজেক্ট ফাইল বা এর নিকটবর্তী কিছুকে লিঙ্ক করার চেষ্টা করার কথা শুনিনি, এবং আমি নিশ্চিত না যে জিসিসি সত্যই এটি সমর্থন করবে। সত্যি বলতে, আমি কোনও কোড ব্লব আকারটি খাঁটি স্প্যাগেটি হতে আশা করব।
নিকোলাস নাইট

46
সমস্যাটির সর্বোত্তম সমাধানটিতে 2 জিবি অবজেক্ট ফাইল অন্তর্ভুক্ত করার কোনও উপায় নেই।
ডেভিড হেফারনান

35
আপনার ডেটা কোডে রাখবেন না
ডেভিড হেফারনান

উত্তর:


53

সুতরাং, আপনার ইতিমধ্যে একটি প্রোগ্রাম রয়েছে যা এই পাঠ্যটি তৈরি করে:

prefactor = +s.ds8*s.ds10*ti[0]->value();
expr = ( - 5/243.*(s.x14*s.x15*csc[49300] + 9/10.*s.x14*s.x15*csc[49301] +
       1/10.*s.x14*s.x15*csc[49302] - 3/5.*s.x14*s.x15*csc[49303] -...

এবং

double csc19295 =       + s.ds0*s.ds1*s.ds2 * ( -
       32*s.x12pow2*s.x15*s.x34*s.mbpow2*s.mWpowinv2 -
       32*s.x12pow2*s.x15*s.x35*s.mbpow2*s.mWpowinv2 -
       32*s.x12pow2*s.x15*s.x35*s.x45*s.mWpowinv2 -...

ঠিক আছে?

যদি আপনার সমস্ত ফাংশনগুলির একটি অনুরূপ "ফর্ম্যাট" থাকে (n সংখ্যা মিটার বার বার করে এবং ফলাফলগুলি - বা এর মতো কিছু যোগ করে) তবে আমি মনে করি আপনি এটি করতে পারেন:

  • জেনারেটর প্রোগ্রামটিকে স্ট্রিংয়ের পরিবর্তে আউটপুট অফসেটে পরিবর্তন করুন (অর্থাৎ স্ট্রিং "s.ds0" এর পরিবর্তে এটি উত্পাদন করবে) offsetof(ProcessVars, ds0)
  • যেমন অফসেটের একটি অ্যারে তৈরি করুন
  • একটি মূল্যায়নকারী লিখুন যা উপরের অ্যারে এবং কাঠামোর ভিত্তিগুলির ঠিকানাগুলি গ্রহণ করে এবং ফলাফল উত্পন্ন করে

অ্যারে + মূল্যায়নকারী আপনার ফাংশনগুলির মধ্যে একটির মতো একই যুক্তিকে উপস্থাপন করবে, তবে কেবল মূল্যায়নকারীই কোড হবে। অ্যারেটি "ডেটা" হয় এবং এটি রানটাইমের সময় উত্পন্ন হতে পারে বা ডিস্কে সংরক্ষণ করা যেতে পারে এবং আই চিঙ্কগুলি পড়তে পারে বা মেমরি ম্যাপযুক্ত ফাইলের সাহায্যে।

Func1 আপনার নির্দিষ্ট উদাহরণস্বরূপ কল্পনা কিভাবে আপনি একটি evaluator মাধ্যমে ফাংশন পুনর্লিখন হবে যদি আপনি বেস ঠিকানায় অ্যাক্সেস ছিল sএবং cscএবং ধ্রুবক এবং অফসেট আপনি বেস ঠিকানায় যোগ করার জন্য পাওয়া দরকার প্রতিনিধিত্ব মত একটি ভেক্টর x14, ds8এবংcsc[51370]

আপনাকে "ডেটা" এর একটি নতুন ফর্ম তৈরি করতে হবে যা আপনার বিশাল সংখ্যক ফাংশনে আপনি যে প্রকৃত ডেটা পাস করবেন তা কীভাবে তা বর্ণনা করবে।


45

X86-64 'ABI- র লিনাক্স ব্যবহৃত একটি "বৃহৎ মডেল" বিশেষভাবে যেমন আকার সীমাবদ্ধতা, যা আছে এবং, PLT জন্য 64-বিট স্থানান্তরের ধরনের রয়েছে এড়াতে সংজ্ঞায়িত করে। (৪.৪.২ বিভাগের টেবিলটি দেখুন এবং ৩.৫.৫-তে নির্দেশক্রমগুলি দেখুন যা সেগুলি কীভাবে ব্যবহৃত হয় তা দেখায়))

যেহেতু আপনার ফাংশনগুলি ২.৮ গিগাবাইট অধিগ্রহণ করছে, তাই আপনার ভাগ্য খুব খারাপ, কারণ জিসিসি বড় মডেলগুলি সমর্থন করে না। আপনি যা করতে পারেন তা হ'ল আপনার কোডটিকে এমনভাবে পুনর্গঠিত করা যা আপনাকে এটিকে ভাগ করে নেওয়া লাইব্রেরিতে বিভক্ত করতে দেয় যা আপনি গতিশীলভাবে লিঙ্ক করবেন।

যদি এটি সম্ভব না হয়, যেমন কেউ পরামর্শ দিয়েছিলেন, আপনার ডেটা কোডে রাখার পরিবর্তে (এটি সংকলন এবং লিঙ্ক করা), যেহেতু এটি বিশাল।

সম্পাদনা

মনে হচ্ছে বড় মডেলটি জিসিসি 4.6 দ্বারা সমর্থিত ( এই পৃষ্ঠাটি দেখুন )। আপনি এটি চেষ্টা করতে পারেন, তবে উপরেরগুলি এখনও আপনার কোডটি পুনর্গঠন করার ক্ষেত্রে প্রযোজ্য।


সুতরাং আপনি যা বলছেন তা হ'ল আমি যখন কয়েকটি ছোট ভাগ করা লাইব্রেরিতে বস্তু ফাইলগুলি গ্রুপ করব, তখন আমি সীমাবদ্ধতাগুলি অতিক্রম করতাম?
বিবিটিবি

3
@bbtrb ঠিক আছে। তবে আমি আপনার ফাংশনগুলি বাস্তবায়নের আরও একটি উপায় অনুসন্ধান করতে চাই। আমি বাজি আপনার সংকলন চিরতরে লাগে
B takes

18
ডব্লিউটিএফ? এই কোডটি অবশ্যই কোনও স্ক্রিপ্ট দ্বারা উত্পন্ন করা উচিত; হাতে হাতে কেউ মেগাবাইট লেখেন না! কোডটি উত্পন্ন করে এমন একই যুক্তিও গণনা চালাতে ব্যবহৃত হতে পারে ।
zvrba

6
আমি দৃ strongly়ভাবে জিসিসি 4.6 চেষ্টা করার পরামর্শ দিচ্ছি, জিসিসি ৪.১ এর চেয়ে এই প্রোগ্রামের জন্য উচ্চতর কোড তৈরি করা খুব সম্ভবত; এমনকি আপনার চালাক কিছু না করে, সমস্যাটি দূর করে (2 -Os, -fwole-program, এবং -flto- এর সংমিশ্রণটি চেষ্টা করুন - কোডটির এই ভলিউমের সাহায্যে আকারের জন্য অনুকূলিতকরণ করা) এটি পুরোপুরি 2 জিবিতে আটকানো সক্ষম হতে পারে গতির জন্য অনুকূলকরণ)। তবে, যদি এটি যথেষ্ট পরিমাণে সহায়তা না করে তবে আপনার সচেতন হওয়া উচিত যে বড় মডেলটি কাজ করার জন্য আপনাকে বড় মডেলটিতে সি লাইব্রেরির কমপক্ষে কিছু অংশ পুনর্নির্মাণ করতে হবে (crt * .o, libc_nonshared.a , এবং libpthread_nonshared.a)।
zwol

1
@ বিডনলান স্ট্যাটিক লিঙ্ক করাও একটি সম্ভাবনা।
zvrba

37

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


21

ত্রুটিটি ঘটে কারণ আপনার অনেক বেশি কোডে আছে, ডেটা নয়! এটি উদাহরণস্বরূপ __libc_csu_fini(যা একটি ফাংশন) দ্বারা উল্লেখ করা হচ্ছে _startএবং এর থেকে স্থানান্তরকে ফিট করার জন্য কাটা হয়েছে। এর অর্থ হ'ল _start(প্রোগ্রামটির সত্যিকারের প্রবেশের বিন্দু) একটি ফাংশনটি একটি স্বাক্ষরিত 32-বিট অফসেটের মাধ্যমে কল করার চেষ্টা করছে, যার মাত্র 2 গিগাবাইট রয়েছে। যেহেতু আপনার অবজেক্ট কোডের মোট পরিমাণ ~ 2.8 গিগাবাইট, তাই তথ্যগুলি পরীক্ষা করে দেখুন।

আপনি যদি আপনার ডেটা স্ট্রাকচারকে নতুন করে ডিজাইন করতে পারেন তবে বিশাল কোডগুলি সরল লুপ হিসাবে পুনরায় লিখে আপনার কোডের বেশিরভাগটি "সঙ্কুচিত" হতে পারে।

এছাড়াও, আপনি csc[]একটি আলাদা প্রোগ্রামে গণনা করতে পারেন , ফলাফলগুলিকে একটি ফাইলে সংরক্ষণ করতে পারেন এবং যখন প্রয়োজন হয় তখন লোড করতে পারেন।


আপনি কীভাবে সরল লুপগুলি সহ ফাংশনগুলি পুনরায় লিখতে চান তার একটি উদাহরণ সরবরাহ করতে পারেন? আমি তোমাকে ঠিক অনুসরণ করি না csc[]খুব ঘন ঘন গণনা করতে হয় এবং আমি ডিস্ক I / O এড়াতে চাই।
বিবিটিবি

4
@bbtr: উদাহরণস্বরূপ, জন্য func1সর্বোপরি, কিছু মত: for (int i = 0; i < N; ++i) expr += constants[i].*s.x14*s.x15*csc[49300 + i];
হাইকম্যান্ডার 4

@ হাইকম্যান্ডার ৪: একেবারে, আমি সম্মত। কীভাবে স্বয়ংক্রিয়ভাবে এই জাতীয় কিছু তৈরি করা যায় এটি আমার মাথা থেকে উপরে। সূচকগুলি সংরক্ষণ করে এমন একটি পৃথক অ্যারে দিয়ে ...
বিবিটিআরবি

2
@bbtrb: যেহেতু কোনও ফ্রেইক উপায় নেই যে কেউ নিজের হাতে 2.8GB অবজেক্ট কোড তৈরির জন্য পর্যাপ্ত উত্স লিখেছিল, বিশেষত এই জাতীয়-স্মৃতি চিহ্নগুলির সাথে, একটি কোড জেনারেটর অবশ্যই ব্যবহার করা উচিত । সেই সাথে কাজ।
ডোনাল ফেলো

15

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

যদি আমি আপনার সমস্যাটি সঠিকভাবে বুঝতে পারি তবে আপনি কিছু ধরণের কোড জেনারেটর জি ব্যবহার করেন func1...Nযা একগুচ্ছ মানচিত্রকে csc1...Mইনপুট হিসাবে গ্রহণ করে। আপনি যা করতে চান তা গণনা করা csc1...Mএবং বিভিন্ন ইনপুট এবং প্রতিবার সন্ধানের জন্য 1,000,000 বারের লুপ চালানো s = func1 + func2 + ... + funcN। যদিও fucn1...Nএর সাথে সম্পর্কিত তা আপনি নির্দিষ্ট করেন csc1...Mনি।

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

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

আপনার প্রোগ্রামটি 3 ধাপে ভাঙ্গার বিষয়ে: পর্ব 1 বিল্ড করুন csc1...Mএবং তাদের সংরক্ষণ করুন। দ্বিতীয় পর্যায়ে funcএকবারে একটি তৈরি করুন , প্রতিটি ইনপুট দিয়ে এটি 1,000,000 বার চালান এবং ফলাফলগুলি সঞ্চয় করুন। তিন ধাপে func1...N1,000,000 বারের মধ্যে প্রতি রানের জন্য সঞ্চিত ফলাফলের ফলাফলের যোগফল খুঁজে পান। এই সমাধান সম্পর্কে ভাল অংশটি হ'ল এটি বেশ কয়েকটি স্বতন্ত্র মেশিনে সহজেই সমান্তরাল করা যায়।

সম্পাদনা: @ বিবিটিবি, আপনি কি কোনও ফানক এবং একটি সিসিএস উপলব্ধ করতে পারেন? এগুলি অত্যন্ত নিয়মিত এবং সংকোচযোগ্য বলে মনে হয়। উদাহরণস্বরূপ, ফানক 1 কেবলমাত্র 1 টি সহগ, 2 টি সূচকগুলিতে ভেরিয়েবল এবং 1 টি সূচককে সিসি-তে গঠিত সমষ্টি বলে মনে হয়। সুতরাং এটি একটি সুন্দর লুপ কমানো যেতে পারে। আপনি যদি সম্পূর্ণ উদাহরণগুলি উপলভ্য করেন তবে আমি নিশ্চিত যে দীর্ঘ অভিব্যক্তি না দিয়ে লুপগুলিতে সংকোচনের উপায়গুলি পাওয়া যেতে পারে।


হ্যাঁ, আপনি সঠিকভাবে বুঝতে পেরেছেন: যদিও আপনার পরামর্শের সাথে বেশ কয়েকটি সমস্যা রয়েছে: ১. funcপ্রায় সবগুলির উপর সবচেয়ে খারাপ নির্ভরশীল cscএবং এই সংখ্যাগুলিকেও 10 ^ 6 বার গণনা করতে হবে। ২. ইনপুটটি একটি অভিযোজিত মন্টি কার্লো ইন্টিগ্রেটারের কাছ থেকে প্রাপ্ত হবে, যার অর্থ হল যে প্রয়োজনের ক্ষেত্রে বিন্দুর আশেপাশে জালটি পরিমার্জন করে ফলাফলের ত্রুটি হ্রাস করতে সক্ষম হওয়ার জন্য ইন্টিগ্রেটারকে প্রতিটি বিন্দুতে সম্পূর্ণ ফলাফল জানতে হবে। ৩. বৃহত্তর এক্সপ্রেশন cscঅব্যাহত রাখার জন্য ...
বিবিটিআরবি

1
সুতরাং এর অর্থ কি এই যে আপনি cscপ্রতিটি পুনরুক্তিতে প্রতিটিটিকে অন্যদের থেকে আলাদা করে গণনা করতে পারবেন না ? যদি তারা স্বতন্ত্র থাকে, তবে আপনি প্রতিটি প্রতি 10 ^ 6 বার চালাতে এবং ফলাফলগুলি সংরক্ষণ করতে পারতেন। তবে, যদি তাদের মধ্যে নির্ভরতা থাকে, তবে আপনাকে কোনটি কোনটির সাথে সম্পর্কিত, এটি নির্ভরতা গ্রাফের মতো কিছু আবিষ্কার করতে হবে এবং তারপরে আপনি এটি একাধিক স্বতন্ত্র উপ-গ্রাফগুলিতে বিভক্ত করতে পারেন কিনা তা দেখার চেষ্টা করতে হবে। সব মিলিয়ে আমি মনে করি কীটি হ'ল সমস্যাটি একাধিক, স্বতন্ত্র, উপ-সমস্যায় বিভক্ত করা।
আলেফসিন

5

আমি যদি আপনার ত্রুটিগুলি সঠিকভাবে পড়ে থাকি তবে আপনাকে সীমাটি কীভাবে বহন করবে তা হ'ল সূচনাযুক্ত ডেটা বিভাগ (যদি এটি কোড হয় তবে আপনার আরও অনেক ত্রুটি IMHO থাকতে পারে)। আপনার কাছে বিশ্বব্যাপী ডেটা বড় আছে? যদি এটি হয় তবে আমি প্রোগ্রামটি পুনর্গঠন করব যাতে এগুলি গতিশীলভাবে বরাদ্দ করা হয়। যদি ডেটা শুরু করা হয়, আমি এটি একটি কনফিগারেশন ফাইল থেকে পড়তে চাই।

বিটিডব্লিউ এটি দেখে:

(.text + 0x20): `মূল 'এর অপরিবর্তিত রেফারেন্স

আমার মনে হয় আপনার আর একটি সমস্যা আছে।


1
হ্যাঁ আপনি ঠিক বলেছেন, বোকা ভুল, তবে এটি অন্যান্য ত্রুটিগুলি সমাধান করে না।
বিবিটিবি

3

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

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

নীচের লাইন: সংকলন এবং লিঙ্কের 2.8GB কোড কাজ করে না এবং কাজ করতে বাধ্য করা উচিত নয়। অন্য উপায় খুঁজে।


3

কয়েকটি পরামর্শ: - আকারের (-ও) অনুকূলিত করুন। আপনার ইনলাইন ফাংশন কলগুলি, সাধারণ ফাংশন কলগুলি করুন। স্ট্রিং পুলিং সক্ষম করুন।

জিনিসগুলিকে বিভিন্ন ডিএলএলে বিভক্ত করার চেষ্টা করুন (ভাগ করা বস্তুগুলি, লিনাক্সের জন্য .so, ম্যাক ওএস এক্স এর জন্য .dlib)। সেগুলি লোড করা যায় কিনা তা নিশ্চিত করুন। তারপরে চাহিদার উপর জিনিস লোড করতে কিছু বাস্তবায়ন করুন এবং যখন প্রয়োজন হবে না তখন সেগুলি মুক্ত করুন।

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

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

লুয়াজিআইটি বেশ দক্ষ, কখনও কখনও নির্দিষ্ট কিছু জিনিসের জন্য সি / সি ++ মারধর করে তবে প্রায়শই খুব কাছাকাছি থাকে (কখনও কখনও সেখানে আবর্জনা সংগ্রহের কারণে দুর্বল হতে পারে)। নিজের জন্য পরীক্ষা করুন:

http://luajit.org/performance_x86.html

scimark2.luaসেখান থেকে ফাইলটি ডাউনলোড করুন এবং এটি "সি" সংস্করণ (গুগল) এর সাথে তুলনা করুন - প্রায়শই ফলাফলগুলি খুব কাছাকাছি থাকে।


2

লিঙ্কার কোনও বাইনারিটির মধ্যে 32-বিট স্থানান্তর অফসেটগুলি তৈরি করার চেষ্টা করছে যা কোনওভাবে এই সীমাবদ্ধতাগুলি অতিক্রম করেছে। মূল প্রোগ্রামের ঠিকানা জায়গার প্রয়োজনীয়তা হ্রাস করার চেষ্টা করুন।

আপনি কিছু / বেশিরভাগ অবজেক্ট কোডকে এক বা একাধিক লাইব্রেরিতে বিভক্ত করতে পারেন (-fpic / -fPIC দিয়েও সংকলিত)? তারপরে এমন একটি স্থিতিশীল বাইনারি তৈরি করুন যা এই লিবগুলির সাথে লিঙ্ক করে। লাইব্রেরিগুলি স্বতন্ত্র মেমরি ব্লকগুলিতে বাস করবে এবং আপনার স্থানান্তরের অফসেটগুলি আপেক্ষিক (32-বিট) না হয়ে গতিশীল / পরম (64-বিট) হবে।


2

এই অভিব্যক্তিগুলি আমার কাছে অনেকগুলি বিকল্প সিরিজের মতো দেখাচ্ছে। বাকি কোডটি দেখতে কেমন তা আমি জানি না, তবে উত্পন্ন বাক্সটি প্রকাশ করা এতো কঠিন হবে বলে মনে হয় না। কার্যকর করার সময় এটি সম্ভবত মূল্যবান হবেন, বিশেষত আপনার যদি 2 কেবি আনরোলড কোডের ২.৮ জিবি থাকে।


1

এটি দেখে মনে হচ্ছে কোড জেনারেশনের ফলাফলটি ভুল হয়েছে, সম্ভবত প্রতীকী বীজগণিত এবং / অথবা ম্যানুয়াল তালিকাভুক্তি দ্বারা। প্রতীকী ম্যানিপুলেশনগুলি এক্সপ্রেশন গাছ বা গণনার গ্রাফের গভীরতায় তাত্পর্যপূর্ণভাবে বৃদ্ধি পেতে সুপরিচিত। সম্ভবত এখানে স্বয়ংক্রিয় পার্থক্য ব্যবহার করা যেতে পারে যা কোডের আকারটি বেশ ছোট করে তোলে এবং নাটকীয়ভাবে কার্যকরকরণের গতি বাড়িয়ে তোলে।

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