Tôi có một số lượng lớn các chức năng tổng cộng khoảng 2,8 GB mã đối tượng (tiếc là không có cách nào xung quanh, máy tính khoa học ...)
Khi tôi cố gắng liên kết chúng, tôi nhận được relocation truncated to fit: R_X86_64_32S
lỗi (dự kiến) , mà tôi hy vọng sẽ tránh được bằng cách chỉ định cờ trình biên dịch -mcmodel=medium
. Tất cả các thư viện được liên kết thêm vào mà tôi có quyền kiểm soát đều được biên dịch với -fpic
cờ.
Tuy nhiên, lỗi vẫn tiếp diễn và tôi cho rằng một số thư viện mà tôi liên kết đến không được biên dịch bằng PIC.
Đây là lỗi:
/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
Và các thư viện hệ thống mà tôi liên kết với:
-lgfortran -lm -lrt -lpthread
Bất kỳ manh mối ở đâu để tìm kiếm vấn đề?
EDIT: Trước hết, cảm ơn bạn đã thảo luận ... Để làm rõ một chút, tôi có hàng trăm hàm (mỗi hàm có kích thước khoảng 1 MB trong các tệp đối tượng riêng biệt) như thế này:
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;
}
Đối tượng s
tương đối nhỏ và giữ các hằng số cần thiết x14, x15, ..., ds0, ..., v.v. trong khi ti
chỉ trả về một giá trị kép từ thư viện bên ngoài. Như bạn có thể thấy, csc[]
là một bản đồ giá trị được tính toán trước cũng được đánh giá trong các tệp đối tượng riêng biệt (hàng trăm với kích thước mỗi tệp khoảng ~ 1 MB) có dạng sau:
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));
}
// ...
}
Đó là về nó. Bước cuối cùng sau đó chỉ bao gồm gọi tất cả những thứ đó func[i]
và tính tổng kết quả.
Liên quan đến thực tế là đây là một trường hợp khá đặc biệt và bất thường: Vâng, nó là. Đây là những gì mọi người phải đối phó khi cố gắng thực hiện các phép tính chính xác cao cho vật lý hạt.
EDIT2: Tôi cũng nên thêm rằng x12, x13, v.v. không thực sự là hằng số. Chúng được đặt thành các giá trị cụ thể, tất cả các hàm đó được chạy và kết quả trả về, sau đó một tập hợp x12, x13, v.v. mới được chọn để tạo ra giá trị tiếp theo. Và điều này phải được thực hiện 10 ^ 5 đến 10 ^ 6 lần ...
EDIT3: Cảm ơn bạn vì những gợi ý và cuộc thảo luận cho đến nay ... Tôi sẽ cố gắng cuộn lại các vòng lặp khi tạo mã bằng cách nào đó, không chắc chắn về cách chính xác, thành thật mà nói, nhưng đây là cách tốt nhất.
BTW, tôi không cố giấu đằng sau "đây là máy tính khoa học - không có cách nào để tối ưu hóa". Chỉ là cơ sở cho mã này là một thứ gì đó xuất hiện từ "hộp đen" mà tôi không có quyền truy cập thực sự và hơn nữa, toàn bộ mọi thứ hoạt động tuyệt vời với các ví dụ đơn giản và tôi chủ yếu cảm thấy choáng ngợp với những gì xảy ra trong thực tế ứng dụng thế giới ...
EDIT4: Vì vậy, tôi đã cố gắng giảm kích thước mã của các csc
định nghĩa xuống khoảng một phần bằng cách đơn giản hóa các biểu thức trong hệ thống đại số máy tính ( Mathematica ). Tôi thấy bây giờ cũng có một số cách để giảm nó theo một thứ tự cường độ khác bằng cách áp dụng một số thủ thuật khác trước khi tạo mã (sẽ làm giảm phần này xuống khoảng 100 MB) và tôi hy vọng ý tưởng này có hiệu quả.
Bây giờ liên quan đến câu trả lời của bạn: Tôi đang cố gắng cuộn lại các vòng lặp lại trong func
s, nơi CAS sẽ không giúp được nhiều, nhưng tôi đã có một số ý tưởng. Ví dụ: sắp xếp các biểu thức theo các biến như x12, x13,...
, phân tích cú pháp các csc
s bằng Python và tạo các bảng liên quan chúng với nhau. Sau đó, ít nhất tôi có thể tạo các phần này dưới dạng vòng lặp. Vì đây có vẻ là giải pháp tốt nhất cho đến nay, tôi đánh dấu đây là câu trả lời tốt nhất.
Tuy nhiên, tôi cũng muốn ghi công cho VJo. GCC 4.6 thực sự hoạt động tốt hơn nhiều , tạo ra mã nhỏ hơn và nhanh hơn. Sử dụng mô hình lớn hoạt động ở mã như hiện tại. Vì vậy, về mặt kỹ thuật thì đây là câu trả lời chính xác, nhưng thay đổi toàn bộ khái niệm là một cách tiếp cận tốt hơn nhiều.
Cảm ơn tất cả các bạn đã góp ý và giúp đỡ. Nếu ai quan tâm, tôi sẽ đăng kết quả cuối cùng ngay khi tôi sẵn sàng.
NHẬN XÉT: Chỉ là một số nhận xét cho một số câu trả lời khác: Đoạn mã tôi đang cố chạy không bắt nguồn từ sự mở rộng của các chức năng / thuật toán đơn giản và việc mở cuộn không cần thiết một cách ngu ngốc. Điều thực sự xảy ra là thứ mà chúng ta bắt đầu là các đối tượng toán học khá phức tạp và đưa chúng về dạng số có thể tính toán được sẽ tạo ra các biểu thức này. Vấn đề thực sự nằm ở lý thuyết vật lý cơ bản. Mức độ phức tạp của các biểu thức trung gian quy mô theo thực tế, điều này ai cũng biết, nhưng khi kết hợp tất cả những thứ này với một thứ có thể đo lường được về mặt vật lý - một thứ có thể quan sát được - nó chỉ tóm gọn lại chỉ một số hàm rất nhỏ tạo thành cơ sở của biểu thức. (Ở khía cạnh này chắc chắn có cái gì đó "sai sai" với cái chung và chỉ cóansatz được gọi là "lý thuyết nhiễu loạn") Chúng tôi cố gắng đưa ansatz này lên một cấp độ khác, không còn khả thi về mặt phân tích nữa và ở đó cơ sở của các chức năng cần thiết không được biết đến. Vì vậy, chúng tôi cố gắng cưỡng bức nó như thế này. Không phải là cách tốt nhất, nhưng hy vọng một cách cuối cùng sẽ giúp ích cho sự hiểu biết của chúng ta về vật lý ...
CHỈNH SỬA CUỐI CÙNG:
Nhờ tất cả các đề xuất của bạn, tôi đã quản lý để giảm kích thước mã đáng kể, sử dụng Mathematica và một sửa đổi của trình tạo mã cho các func
phần dọc theo dòng của câu trả lời trên cùng :)
Tôi đã đơn giản hóa các csc
chức năng với Mathematica, giảm nó xuống 92 MB. Đây là phần không thể thay đổi được. Những lần thử đầu tiên mất nhiều thời gian, nhưng sau một số tối ưu hóa, điều này hiện chạy trong khoảng 10 phút trên một CPU.
Ảnh hưởng đối với các func
s là rất đáng kể: Toàn bộ kích thước mã cho chúng giảm xuống còn khoảng 9 MB, vì vậy mã hiện tổng cộng trong phạm vi 100 MB. Giờ đây, việc bật tối ưu hóa là rất hợp lý và việc thực thi diễn ra khá nhanh.
Một lần nữa, cảm ơn tất cả các bạn đã góp ý, tôi đã học được rất nhiều.
mmap
đó là chính nó từ tệp nhị phân bên ngoài trong thời gian chạy.