SORU
9 HAZİRAN 2011, PERŞEMBE


Hata ile > GCC derlemek;2 kod GB

Fonksiyonlar nesne kodu (ne yazık ki, bilimsel hesaplama ... yol yok) yaklaşık 2.8 GB toplam çok sayıda var

Onları bağlamak için çalıştığımda, (beklenen) relocation truncated to fit: R_X86_64_32S hatalar, derleyici bayrağı belirlenerek çizimde aşmak için umut -mcmodel=medium olsun. Kontrol ettim, bu ek olarak, bağlı tüm kütüphaneleri -fpic bayrağı ile derlenir.

Yine de hata devam ederse, ve ben link kitaplıklar PİC ile derlenir sanırım.

İşte hata:

/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

Ve sistem kütüphaneleri ben karşı link:

-lgfortran -lm -lrt -lpthread

Bu sorun için herhangi bir ipucu?

EDİT: Öncelikle, bu tartışma için teşekkür ederim ... Biraz açıklığa kavuşturmak için, bu gibi işlevleri (Ayrı nesne dosyaların her birinin boyutu yaklaşık 1 MB) yüzlerce var:

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;
}

Nesne s nispeten küçük ve gerekli sabitler x14, x15, ..., ds0, ..., vb tutar. ti sadece bir çift harici bir kütüphane verir. Görebilirsiniz, csc[] olarak da aşağıdaki formu ayrı nesne dosyaları (tekrar boyutu ~1 MB her biri hakkında yüzlerce ile) değerlendirilir değerleri önceden hesaplanan bir harita:

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));
    }

    // ...
}

Bunun hakkında. Son adım sonra sadece func[i] tüm bu arama ve sonuç toplamından oluşur.

Bu çok özel ve sıra dışı bir durum olduğu gerçeği ile ilgili: Evet, öyle. Bu insanlar parçacık fiziği için yüksek hassasiyetli hesaplamalar yapmak için çalışırken ile başa çıkmak zorunda.

EDİT2: Da x 12, x13, vb eklemek gerekir. gerçekten sabitler. Belirli değerleri için, tüm bu fonksiyonları çalıştırmak ve sonuç verdiğini ve sonra da x 12, x13, vb yeni bir dizi. sonraki değer üretmek için seçilir. Ve bu^6 10 times 10^5 bitti

EDİT3: Teşekkür ederim için öneriler ve tartışma şimdiye kadar denerim rulo döngüler üzerine kod oluşturma bir şekilde, değil emin ne bu tam olarak, dürüst olmak gerekirse, ama bu en iyi bahis.

BTW, arkasında saklamaya çalışmadım "bu bilimsel bir bilgi optimize etmek için hiçbir yol yoktur". Sadece temel için bu kodu bir şeyler çıkıyor, bir "kara kutu" nerede ben gerçek bir erişim ve dahası, her şey harika çalıştı ile basit örnekler, ve ben esas bunalmış hissediyorum ile ne olur bir gerçek dünya uygulama ...

EDİT4: Yani, bir tarafından csc tanımları kod boyutunu ileri bilgisayar Cebir sistemi ifadeleri (Mathematica) basitleştirerek azaltmak için başarmış. Görüyorum ki şimdi de bir şekilde indirilmesi ile başka bir sipariş büyüklüğü kadar uygulayarak diğer bazı hileler önce oluşturma kodu (hangi getir bu kısmı için yaklaşık 100 MB) ve umarım bu fikir çalışır.

Şimdi cevapları ile ilgili: Döngüler tekrar bir CAS çok yardımcı olmaz burada funcs, çıkmak için çalışıyorum, ama zaten bazı fikirlerim var. Örneğin, cscayrıştırma x12, x13,..., gibi değişkenler tarafından ifadeleri sıralama Python ile s ve onları birbirleri ile ilişkili tablo oluşturmak. O zaman en azından döngüler olarak bu parçalar üretebilirsiniz. Bu en iyi çözüm, bugüne kadar olduğu gibi en iyi cevap olarak işaretliyorum.

Ancak, aynı zamanda kredi VJo vermek istiyorum. GCC 4.6 işe yarıyorçokdaha iyi, daha küçük ve daha hızlı kod üretir. Büyük modeli kullanarak kodu olduğu gibi çalışır. Yani teknik olarak bu doğru cevap var, ama bütün konsepti değiştirerek çok daha iyi bir yaklaşımdır.

Öneriler ve yardımlarınız için hepinize teşekkür ederim. Eğer ilgilenen olursa, nihai sonuca hazırım en kısa sürede yayınlayacağım.

AÇIKLAMALAR: Diğer bazı cevaplar için sadece bazı açıklamalar: çalıştırmak için çalışıyorum kod basit işlevleri bir genişleme/algoritmalar ve aptal gereksiz bir çözümü olarak ortaya çıkmaz. Aslında ne ile başlıyoruz şeyler matematiksel nesneler karmaşık ve sayısal olarak vermekten çok güzelhesaplanabilirform bu ifadeler oluşturur. Sorun aslında Temel fiziksel teorisi yatıyor. Karmaşıklık Ara ifade ölçekler factorially olduğu bilinen, ama ne zaman birleştirerek tüm bu şeyler için bir şey fiziksel olarak ölçülebilir bir gözlemlenebilir -- aşağı kaynar için sadece bir avuç çok küçük fonksiyonlar form olarak ifadeleri. (Kesinlikle bir şey "" genel kurulu bu konuda bir yanlış var ^em>sadecedenilen 33* *mevcut "kuantum teorisi") uygun analitik olarak gerekli fonksiyonlar olarak bilinen değil artık ve başka bir düzeyde, bu ansatz getirmek için çalışıyoruz. Kaba kuvvet için çalışıyoruz, hepsi bu kadar. En iyi yol değil, ama sonunda eldeki fizik anlayışımız ile yardımcı olur umarım

SON DÜZENLEME: Teşekkürler tüm öneriler, başardım azaltmak için kod ölçü aleti kullanarak Sturm ve bir değiştirme kodu jeneratör için funcs biraz boyunca çizgiler üst cevap :)

* csc fonksiyonları, 92 MB indirmeyi basitleştirilmiş var. Bu indirgenemez parçasıdır. İlk girişimleri uzun sürdü, ama bazı iyileştirmeler sonra bu artık tek bir CPU üzerinde yaklaşık 10 dakika içinde çalışır.

Dramatik s funcetkisi: onlar için tüm kod boyutu yaklaşık 9 MB aşağı, kod, şimdi 100 MB aralığında toplamları. Şimdi çok iyi duruma getirmeleri devre yapar ve yürütme oldukça hızlı.

Tekrar teşekkür ederim önerileriniz için, bir çok şey öğrendim.

CEVAP
9 HAZİRAN 2011, PERŞEMBE


Yani, zaten bu metin üreten bir program var:

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] -...

ve

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 -...

değil mi?

Eğer tüm fonksiyonları benzer "(n sayı m kez çarpın ve sonuçları - ya da ona benzer bir şey ekleyin) sonra ben bunu yapabileceğini düşünüyor:" biçiminde varsa

  • değişim çıkış uzaklıklar için jeneratör programı yerine bir dize (dize yerine yani.ds0" üretecek offsetof(ProcessVars, ds0)
  • bu uzaklıklar bir dizi oluşturun
  • yukarıdaki dizi kabul eden bir değerlendiricisi yazıp yapısının temel adresler ve göstericiler bir sonuç üretir

Dizi değerlendiricisi işlevleri aynı mantığı temsil edecek, ama tek değerlendiricisi kod olacak. Dizi "veri" ve ya çalışma zamanında oluşturulacak veya disk üzerine kaydedilir ve ben okuma parçalarını ya da bellek eşlenen dosya ile.

Sizin örnekte func1 hayal nasıl olur yeniden fonksiyonu üzerinden bir değerlendiricisi varsa erişmek için taban adresi s csc ve aynı zamanda bir vektör gibi temsil sabitler ve uzaklıklar ihtiyacın eklemek base adreslerini almak için x14, ds8 csc[51370]

"Veri" işlevleri büyük numaranızı geçmesi gerçek verileri işlemek için nasıl anlatacağız. yeni bir form oluşturmanız gerekir

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • finalcall07

    finalcall07

    11 NİSAN 2008
  • NewsyTech

    NewsyTech

    2 AĞUSTOS 2010
  • RogerBuckChrist

    RogerBuckChr

    9 Temmuz 2011