ฉันมีฟังก์ชั่นจำนวนมากรวมประมาณ 2.8 GB ของรหัสวัตถุ (น่าเสียดายที่ไม่มีวิธีการคำนวณทางวิทยาศาสตร์ ... )
เมื่อฉันพยายามที่จะเชื่อมโยงพวกเขาก็จะได้รับ (คาดว่า) relocation truncated to fit: R_X86_64_32S
ข้อผิดพลาดที่ผมหวังว่าจะหลีกเลี่ยงโดย specifing -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 MB ในไฟล์ออบเจ็กต์แยกต่างหาก) ดังนี้:
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 MB) ของรูปแบบต่อไปนี้:
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: ฉันควรเพิ่มว่า x12, x13 ฯลฯ ไม่ใช่ค่าคงที่จริงๆ ค่าเหล่านี้ถูกตั้งค่าเป็นค่าเฉพาะฟังก์ชันเหล่านั้นทั้งหมดจะรันและผลลัพธ์ที่ส่งกลับจากนั้นจึงเลือกชุดใหม่ของ x12, x13 และอื่น ๆ เพื่อสร้างค่าถัดไป และสิ่งนี้จะต้องทำ 10 ^ 5 ถึง 10 ^ 6 ครั้ง ...
แก้ไข 3: ขอบคุณสำหรับข้อเสนอแนะและการสนทนาจนถึงตอนนี้ ... ฉันจะพยายามหมุนลูปขึ้นในการสร้างโค้ดไม่แน่ใจว่าจะทำอย่างไรให้ตรงไปตรงมา แต่นี่เป็นทางออกที่ดีที่สุด
BTW ฉันไม่ได้พยายามซ่อนตัว "นี่คือการคำนวณทางวิทยาศาสตร์ - ไม่มีทางเพิ่มประสิทธิภาพ" เพียงแค่ว่าพื้นฐานของรหัสนี้เป็นสิ่งที่มาจาก "กล่องดำ" ซึ่งฉันไม่สามารถเข้าถึงได้จริงและยิ่งกว่านั้นสิ่งทั้งหมดทำงานได้ดีด้วยตัวอย่างง่ายๆและฉันรู้สึกหนักใจกับสิ่งที่เกิดขึ้นจริงเป็นหลัก แอพพลิเคชั่นโลก ...
แก้ไข 4: ดังนั้นฉันจึงสามารถลดขนาดโค้ดของcsc
คำจำกัดความได้ประมาณหนึ่งในสี่โดยการทำให้นิพจน์ง่ายขึ้นในระบบพีชคณิตคอมพิวเตอร์ ( Mathematica ) ตอนนี้ฉันเห็นวิธีการลดขนาดตามลำดับขนาดอื่นหรือมากกว่านั้นโดยใช้เทคนิคอื่น ๆ ก่อนสร้างโค้ด (ซึ่งจะทำให้ส่วนนี้ลดลงเหลือประมาณ 100 MB) และฉันหวังว่าแนวคิดนี้จะใช้ได้ผล
ตอนนี้เกี่ยวข้องกับคำตอบของคุณ: ฉันกำลังพยายามหมุนลูปสำรองอีกครั้งในfunc
s ซึ่ง CAS จะไม่ช่วยอะไรมากนัก แต่ฉันมีแนวคิดบางอย่างแล้ว ตัวอย่างเช่นการเรียงลำดับนิพจน์ตามตัวแปรเช่นx12, x13,...
แยกวิเคราะห์csc
s ด้วย Python และสร้างตารางที่เกี่ยวข้องกัน จากนั้นอย่างน้อยฉันก็สามารถสร้างส่วนเหล่านี้เป็นลูปได้ เนื่องจากนี่เป็นวิธีแก้ปัญหาที่ดีที่สุดฉันจึงทำเครื่องหมายว่านี่เป็นคำตอบที่ดีที่สุด
อย่างไรก็ตามขอให้เครดิตกับ VJo ด้วย GCC 4.6 ทำงานได้ดีกว่ามากสร้างโค้ดที่เล็กลงและเร็วขึ้น การใช้แบบจำลองขนาดใหญ่จะทำงานที่รหัสตามที่เป็นอยู่ ดังนั้นในทางเทคนิคนี่คือคำตอบที่ถูกต้อง แต่การเปลี่ยนแนวคิดทั้งหมดเป็นแนวทางที่ดีกว่ามาก
ขอบคุณทุกท่านสำหรับคำแนะนำและความช่วยเหลือ หากใครสนใจฉันจะโพสต์ผลสุดท้ายทันทีที่ฉันพร้อม
ข้อสังเกต: มีเพียงข้อสังเกตบางประการสำหรับคำตอบอื่น ๆ : รหัสที่ฉันพยายามเรียกใช้ไม่ได้เกิดจากการขยายฟังก์ชัน / อัลกอริทึมที่เรียบง่ายและการคลายตัวที่ไม่จำเป็น สิ่งที่เกิดขึ้นจริงคือสิ่งที่เราเริ่มต้นด้วยเป็นวัตถุทางคณิตศาสตร์ที่ค่อนข้างซับซ้อนและนำมันไปสู่รูปแบบที่คำนวณได้เชิงตัวเลขจะสร้างนิพจน์เหล่านี้ ปัญหาอยู่ที่ทฤษฎีทางกายภาพพื้นฐาน ความซับซ้อนของนิพจน์ระดับกลางจะปรับขนาดตามแฟกทอเรียลซึ่งเป็นที่รู้จักกันดี แต่เมื่อรวมสิ่งเหล่านี้ทั้งหมดเข้ากับสิ่งที่วัดได้ทางกายภาพซึ่งเป็นสิ่งที่สังเกตได้ - มันจะลดลงเหลือเพียงไม่กี่ฟังก์ชันที่เป็นพื้นฐานของนิพจน์ (มีบางอย่าง "ผิด" แน่นอนในแง่นี้กับทั่วไปและใช้ได้เฉพาะansatzซึ่งเรียกว่า "ทฤษฎีการก่อกวน") เราพยายามนำ ansatz นี้ไปสู่อีกระดับหนึ่งซึ่งไม่สามารถวิเคราะห์ได้อีกต่อไปและไม่ทราบพื้นฐานของฟังก์ชันที่จำเป็น เราก็เลยพยายามบังคับมันแบบนี้ ไม่ใช่วิธีที่ดีที่สุด แต่หวังว่าจะเป็นวิธีที่ช่วยให้เราเข้าใจฟิสิกส์ได้ในที่สุด ...
แก้ไขล่าสุด:
ขอบคุณคำแนะนำทั้งหมดของคุณฉันสามารถลดขนาดโค้ดลงได้มากโดยใช้ Mathematica และการปรับเปลี่ยนตัวสร้างโค้ดสำหรับfunc
s ตามแนวของคำตอบด้านบน :)
ฉันได้ทำให้csc
ฟังก์ชั่นง่ายขึ้นด้วย Mathematica โดยลดขนาดลงเหลือ 92 MB นี่คือส่วนที่ไม่สามารถแก้ไขได้ ความพยายามครั้งแรกใช้เวลาตลอดไป แต่หลังจากการเพิ่มประสิทธิภาพบางอย่างตอนนี้จะทำงานผ่านในเวลาประมาณ 10 นาทีบน CPU ตัวเดียว
เอฟเฟกต์ที่มีต่อfunc
s นั้นน่าทึ่ง: ขนาดโค้ดทั้งหมดสำหรับพวกเขาลดลงเหลือประมาณ 9 MB ดังนั้นโค้ดจึงรวมอยู่ในช่วง 100 MB ตอนนี้มันสมเหตุสมผลแล้วที่จะเปิดการเพิ่มประสิทธิภาพและการดำเนินการก็ค่อนข้างเร็ว
ขอขอบคุณทุกท่านอีกครั้งสำหรับคำแนะนำฉันได้เรียนรู้มากมาย
mmap
ด้วยตัวคุณเองจากไบนารีภายนอกที่รันไทม์