Saya memiliki sejumlah besar fungsi dengan total sekitar 2,8 GB kode objek (sayangnya tidak ada jalan lain, komputasi ilmiah ...)
Ketika saya mencoba menautkannya, saya mendapatkan relocation truncated to fit: R_X86_64_32S
kesalahan (yang diharapkan) , yang saya harap dapat dihindari dengan menentukan flag compiler -mcmodel=medium
. Semua perpustakaan yang ditautkan selain yang saya kendalikan dikompilasi dengan -fpic
bendera.
Namun, kesalahan tetap ada, dan saya berasumsi bahwa beberapa perpustakaan yang saya tautkan tidak dikompilasi dengan PIC.
Inilah kesalahannya:
/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
Dan pustaka sistem yang saya tautkan:
-lgfortran -lm -lrt -lpthread
Ada petunjuk di mana mencari masalahnya?
EDIT: Pertama-tama, terima kasih untuk pembahasannya ... Untuk sedikit memperjelas, saya memiliki ratusan fungsi (masing-masing berukuran sekitar 1 MB dalam file objek terpisah) seperti ini:
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;
}
Objek s
relatif kecil dan membuat diperlukan konstanta x14 itu, x15, ..., DS0, ..., dll sementara ti
hanya kembali ganda dari sebuah perpustakaan eksternal. Seperti yang Anda lihat, csc[]
adalah peta nilai yang telah dihitung yang juga dievaluasi dalam file objek terpisah (lagi-lagi ratusan dengan ukuran masing-masing sekitar ~ 1 MB) dengan bentuk berikut:
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));
}
// ...
}
Itu saja. Langkah terakhir kemudian hanya terdiri dari memanggil semua itu func[i]
dan menjumlahkan hasilnya.
Mengenai fakta bahwa ini adalah kasus yang agak khusus dan tidak biasa: Ya, benar. Inilah yang harus dihadapi orang ketika mencoba melakukan perhitungan presisi tinggi untuk fisika partikel.
EDIT2: Saya juga harus menambahkan bahwa x12, x13, dll. Sebenarnya bukan konstanta. Mereka ditetapkan ke nilai tertentu, semua fungsi tersebut dijalankan dan hasilnya dikembalikan, dan kemudian set baru x12, x13, dll. Dipilih untuk menghasilkan nilai berikutnya. Dan ini harus dilakukan 10 ^ 5 hingga 10 ^ 6 kali ...
EDIT3: Terima kasih atas saran dan diskusi sejauh ini ... Saya akan mencoba memutar loop pada pembuatan kode entah bagaimana, tidak yakin bagaimana tepatnya, jujur, tapi ini adalah taruhan terbaik.
BTW, saya tidak mencoba bersembunyi di balik "ini adalah komputasi ilmiah - tidak ada cara untuk mengoptimalkan". Hanya saja, dasar untuk kode ini adalah sesuatu yang keluar dari "kotak hitam" di mana saya tidak memiliki akses nyata ke dan, terlebih lagi, semuanya bekerja dengan baik dengan contoh sederhana, dan saya terutama merasa kewalahan dengan apa yang terjadi di dunia nyata. aplikasi dunia ...
EDIT4: Jadi, saya telah berhasil mengurangi ukuran kode csc
definisi sekitar satu per empat dengan menyederhanakan ekspresi dalam sistem aljabar komputer ( Mathematica ). Sekarang saya juga melihat beberapa cara untuk menguranginya dengan urutan besaran lain atau lebih dengan menerapkan beberapa trik lain sebelum membuat kode (yang akan menurunkan bagian ini menjadi sekitar 100 MB) dan saya harap ide ini berhasil.
Sekarang terkait dengan jawaban Anda: Saya mencoba memutar kembali loop di func
s, di mana CAS tidak akan banyak membantu, tetapi saya sudah punya beberapa ide. Misalnya, mengurutkan ekspresi berdasarkan variabel seperti x12, x13,...
, mengurai csc
s dengan Python dan menghasilkan tabel yang menghubungkannya satu sama lain. Maka saya setidaknya dapat menghasilkan bagian ini sebagai loop. Karena ini tampaknya menjadi solusi terbaik sejauh ini, saya menandai ini sebagai jawaban terbaik.
Namun, saya juga ingin memberikan penghargaan kepada VJo. GCC 4.6 memang bekerja jauh lebih baik, menghasilkan kode yang lebih kecil dan lebih cepat. Menggunakan model besar berfungsi dengan kode sebagaimana adanya. Jadi secara teknis ini adalah jawaban yang benar, tetapi mengubah keseluruhan konsep adalah pendekatan yang jauh lebih baik.
Terima kasih atas saran dan bantuan Anda. Jika ada yang tertarik, saya akan memposting hasil akhirnya segera setelah saya siap.
KOMENTAR: Hanya beberapa komentar untuk beberapa jawaban lain: Kode yang saya coba jalankan tidak berasal dari perluasan fungsi / algoritme sederhana dan pembukaan gulungan yang tidak perlu dan bodoh. Apa yang sebenarnya terjadi adalah hal-hal yang kita mulai dengan objek matematika yang cukup rumit dan membawanya ke bentuk yang dapat dihitung secara numerik menghasilkan ekspresi ini. Masalahnya sebenarnya terletak pada teori fisika yang mendasarinya. Kompleksitas ekspresi menengah berskala secara faktorial, yang sudah diketahui, tetapi ketika menggabungkan semua hal ini menjadi sesuatu yang dapat diukur secara fisik - yang dapat diamati - itu hanya bermuara pada segelintir fungsi yang sangat kecil yang membentuk dasar ekspresi. (Pasti ada sesuatu yang "salah" dalam hal ini dengan jenderal dan hanya tersediaansatz yang disebut "teori perturbation") Kami mencoba membawa ansatz ini ke level lain, yang tidak lagi layak secara analitis dan dimana dasar dari fungsi yang dibutuhkan tidak diketahui. Jadi kami mencoba memaksa seperti ini. Bukan cara terbaik, tapi semoga cara yang membantu pemahaman kita tentang fisika di tangan pada akhirnya ...
EDIT TERAKHIR:
Terima kasih atas semua saran Anda, saya telah berhasil mengurangi ukuran kode secara signifikan, menggunakan Mathematica dan modifikasi generator kode untuk func
s yang agak mirip dengan jawaban teratas :)
Saya telah menyederhanakan csc
fungsi dengan Mathematica, menurunkannya menjadi 92 MB. Ini adalah bagian yang tidak dapat direduksi. Upaya pertama memakan waktu lama, tetapi setelah beberapa pengoptimalan, ini sekarang berjalan dalam waktu sekitar 10 menit pada satu CPU.
Efeknya func
dramatis: Seluruh ukuran kode untuk mereka turun menjadi sekitar 9 MB, jadi kode sekarang berjumlah total dalam kisaran 100 MB. Sekarang masuk akal untuk mengaktifkan pengoptimalan dan eksekusinya cukup cepat.
Sekali lagi, terima kasih atas saran Anda, saya telah belajar banyak.
mmap
sendiri dari biner eksternal pada waktu proses.