আমার প্রায় ২.৮ গিগাবাইট অবজেক্ট কোডের প্রচুর ফাংশন রয়েছে (দুর্ভাগ্যক্রমে এর কোনও উপায় নেই, বৈজ্ঞানিক কম্পিউটিং ...)
আমি যখন তাদের লিঙ্ক করার চেষ্টা করি তখন আমি (প্রত্যাশিত) 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 এমবি পরিসীমাতে মোট। এখন এটি অপ্টিমাইজেশানগুলি চালু করার অর্থবোধ করে এবং কার্যকর করা খুব দ্রুত হয়।
আবার, আপনার পরামর্শের জন্য আপনাকে সকলকে ধন্যবাদ, আমি অনেক কিছু শিখেছি।
mmap
রানটাইমের সময় এটি কোনও বাহ্যিক বাইনারি থেকে নিজেকে পরিবর্তিত করা উচিত।