मेरे पास ऑब्जेक्ट कोड के लगभग 2.8 GB के कुल कार्यों की एक बड़ी संख्या है (दुर्भाग्य से इसके आसपास कोई रास्ता नहीं है, वैज्ञानिक कंप्यूटिंग ...)
जब मैं उन्हें लिंक करने की कोशिश करता हूं, तो मुझे (अपेक्षित) relocation truncated to fit: R_X86_64_32S
त्रुटियां मिलती हैं, जो मुझे कंपाइलर ध्वज को निर्दिष्ट करने से रोकने की उम्मीद थी -mcmodel=medium
। सभी पुस्तकालय जो इसके अलावा मेरे नियंत्रण से जुड़े हैं, को -fpic
ध्वज के साथ संकलित किया गया है ।
फिर भी, त्रुटि बनी रहती है, और मुझे लगता है कि मेरे द्वारा लिंक किए गए कुछ पुस्तकालयों को PIC के साथ संकलित नहीं किया गया है।
यहाँ त्रुटि है:
/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]
और परिणाम को संक्षेप में शामिल करने के लिए है।
इस तथ्य के बारे में कि यह एक विशेष और असामान्य मामला है: हां, यह है। कण भौतिकी के लिए उच्च परिशुद्धता गणना करने की कोशिश करते समय लोगों को इसका सामना करना पड़ता है।
EDIT2: मुझे यह भी जोड़ना चाहिए कि x12, x13, आदि वास्तव में स्थिरांक नहीं हैं। वे विशिष्ट मानों पर सेट होते हैं, उन सभी कार्यों को चलाया जाता है और परिणाम वापस आ जाता है, और फिर अगले मूल्य का उत्पादन करने के लिए x12, x13, आदि का एक नया सेट चुना जाता है। और यह 10 ^ 5 से 10 ^ 6 बार करना होगा ...
EDIT3: अब तक के सुझावों और चर्चा के लिए धन्यवाद ... मैं कोशिश करूंगा कि किसी भी तरह कोड जेनरेशन पर लूप रोल करूं, यकीन नहीं हो रहा है कि यह कैसे होगा, ईमानदार होना चाहिए, लेकिन यह सबसे अच्छा दांव है।
BTW, मैं "यह वैज्ञानिक कंप्यूटिंग है - अनुकूलन का कोई तरीका नहीं" के पीछे छिपाने की कोशिश नहीं की। यह सिर्फ इतना है कि इस कोड का आधार कुछ ऐसा है जो एक "ब्लैक बॉक्स" से निकलता है, जहां मेरे पास कोई वास्तविक पहुंच नहीं है और इसके अलावा, पूरी चीज ने सरल उदाहरणों के साथ बहुत अच्छा काम किया है, और मैं मुख्य रूप से एक वास्तविक में क्या होता है से अभिभूत महसूस करता हूं विश्व अनुप्रयोग ...
EDIT4: तो, मैंने csc
कंप्यूटर बीजगणित प्रणाली ( Mathematica ) में अभिव्यक्तियों को सरल करके एक के बाद एक परिभाषाओं के कोड आकार को कम करने में कामयाबी हासिल की है । मैं अब इसे कोड के निर्माण से पहले कुछ अन्य ट्रिक्स लागू करके या इसे कम करने का कोई तरीका देखता हूं (जो कि इस हिस्से को लगभग 100 एमबी तक लाएगा) और मुझे उम्मीद है कि यह विचार काम करेगा।
अब आपके उत्तरों से संबंधित: मैं लूप्स को फिर से func
एस में रोल करने की कोशिश कर रहा हूं , जहां कैस ज्यादा मदद नहीं करेगा, लेकिन मेरे पास पहले से ही मेरे विचार हैं। उदाहरण के लिए, जैसे चर द्वारा भावों को x12, x13,...
छाँटना, csc
पायथन के साथ s को पार्स करना और उन तालिकाओं को उत्पन्न करना जो उन्हें एक दूसरे से संबंधित करते हैं। फिर मैं कम से कम इन भागों को छोरों के रूप में उत्पन्न कर सकता हूं। जैसा कि यह अब तक का सबसे अच्छा समाधान प्रतीत होता है, मैं इसे सर्वश्रेष्ठ उत्तर के रूप में चिह्नित करता हूं।
हालाँकि, मैं वीजेओ को भी क्रेडिट देना चाहूंगा। जीसीसी 4.6 वास्तव में बहुत बेहतर काम करता है, छोटे कोड का उत्पादन करता है और तेज होता है। बड़े मॉडल का उपयोग कोड के रूप में काम करता है। इसलिए तकनीकी रूप से यह सही उत्तर है, लेकिन पूरी अवधारणा को बदलना बेहतर दृष्टिकोण है।
आपके सुझाव और मदद के लिए आप सभी का धन्यवाद। अगर किसी को दिलचस्पी है, तो मैं तैयार होते ही अंतिम परिणाम पोस्ट करने जा रहा हूं।
टिप्पणी: कुछ अन्य जवाबों के लिए बस कुछ टिप्पणी: मैं जिस कोड को चलाने की कोशिश कर रहा हूं, वह सरल कार्यों / एल्गोरिदम के विस्तार में नहीं है और अनावश्यक अनावश्यक घूमना है। वास्तव में क्या होता है कि हम जो सामान शुरू करते हैं वह बहुत जटिल गणितीय वस्तुएं होती हैं और उन्हें संख्यात्मक रूप से गणना करने योग्य रूप में लाती है । समस्या वास्तव में अंतर्निहित भौतिक सिद्धांत में निहित है। मध्यवर्ती अभिव्यक्तियों की जटिलता तथ्यात्मक रूप से तराजू है, जो अच्छी तरह से ज्ञात है, लेकिन जब भौतिक रूप से औसत दर्जे का कुछ करने के लिए इस सामान को जोड़ते हैं - तो यह केवल एक मुट्ठी भर छोटे कार्यों को उबालता है जो अभिव्यक्तियों का आधार बनाते हैं। (सामान्य के साथ इस संबंध में निश्चित रूप से कुछ "गलत" है और केवल उपलब्ध हैansatz जिसे "गड़बड़ी सिद्धांत" कहा जाता है) हम इस ansatz को दूसरे स्तर पर लाने की कोशिश करते हैं, जो कि विश्लेषणात्मक रूप से संभव नहीं है और जहां आवश्यक कार्यों का आधार ज्ञात नहीं है। तो हम इसे इस तरह से बल देने की कोशिश करते हैं। सबसे अच्छा तरीका नहीं है, लेकिन उम्मीद है कि अंत में भौतिकी की हमारी समझ में मदद करता है ...
पिछले संस्करण:
आपके सभी सुझावों के लिए धन्यवाद, मैंने मैथमैटिका और func
शीर्ष उत्तर की तर्ज पर कुछ हद तक कोड जनरेटर के संशोधन का उपयोग करके कोड आकार को काफी कम करने में कामयाब रहा है :)
मैंने csc
Mathematica के साथ कार्यों को सरल किया है , इसे 92 एमबी तक लाया है। यह इर्रिडिएबल पार्ट है। पहले प्रयास ने हमेशा के लिए ले लिया, लेकिन कुछ अनुकूलन के बाद अब यह एक सीपीयू पर लगभग 10 मिनट चलता है।
func
एस पर प्रभाव नाटकीय था: उनके लिए पूरे कोड का आकार लगभग 9 एमबी तक है, इसलिए कोड अब 100 एमबी की सीमा में है। अब यह अनुकूलन को चालू करने के लिए समझ में आता है और निष्पादन काफी तेज है।
फिर से, आप सभी को आपके सुझावों के लिए धन्यवाद, मैंने बहुत कुछ सीखा है।
mmap
यह रनटाइम के दौरान बाहरी बाइनरी से खुद को निकालना होगा ।