簡體   English   中英

具有許多宏和內聯函數的C99代碼中的GCC 4.8.1編譯時間

[英]GCC 4.8.1 compile time in C99 code with many macros and inline functions

我嘗試編譯其中包含許多行代數的代碼。 基本上,它是2個張量的蠻力收縮,具有12個維度和可變模式大小。 但是,代碼的性能目前還不是問題,因為它甚至無法編譯。 代碼本身嵌入在用C99編寫的更大的框架中,該框架試圖模仿C ++的行為,即,它使用宏代替模板和許多內聯函數。 基本上,這是不能編譯的東西(我知道這不是很優雅,但是代碼是使用Mathematica生成的,以便正確獲得張量索引。稍后將對其進行優化):

void __attribute__((optimize("O0"))) MP(dineutron_uddu)(double complex* result, double complex* VVV_, double complex* vMv_, unsigned int L, int tis){

    unsigned int lt=(unsigned int)nsites_dir[TUP];
    double complex (*vMv)[L][4][lt][L][4]= (double complex (*)[L][4][lt][L][4]) vMv_;
    double complex (*vvv)[L][nt][L]= (double complex (*)[L][nt][L]) VVV_;
    unsigned int nnodes3=nnodes_dir[XUP]*nnodes_dir[YUP]*nnodes_dir[ZUP];
    unsigned int mynode3=mynode_dir[XUP]+nnodes_dir[XUP]*(mynode_dir[YUP]+nnodes_dir[YUP]*mynode_dir[ZUP]);

    {
            unsigned int tf;
            for(tf=0; tf<lt; tf++){
                    int tfs= lt*mynode_dir[TUP]+tf;

                    unsigned int n0, n1, n2, n3, n4, n5, n6, n7, n8, n9, n10, n11;
                    COMPLEX sum=0.;
                    unsigned int run=0;

                    for(n0=0; n0<L; n0++){
                            for(n1=0; n1<L; n1++){
                                    for(n2=0; n2<L; n2++){
                                            for(n3=0; n3<L; n3++){
                                                    for(n4=0; n4<L; n4++){
                                                            for(n5=0; n5<L; n5++){
                                                                    for(n6=0; n6<L; n6++){
                                                                            for(n7=0; n7<L; n7++){
                                                                                    for(n8=0; n8<L; n8++){
                                                                                            for(n9=0; n9<L; n9++){
                                                                                                    for(n10=0; n10<L; n10++){
                                                                                                            for(n11=0; n11<L; n11++){

                                                                                                                    if(run%nnodes3==mynode3){

                                                                                                                            sum += vvv[n0][n4][tfs][n8] * vvv[n1][n5][tfs][n9] * ~(vvv[n2][n6][tis][n10]) * ~(vvv[n3][n7][tis][n11]) * 

    (

     + 0.25 * vMv[0][n2][0][tf][n9][1] * vMv[0][n3][0][tf][n5][1] * vMv[0][n11][0][tf][n4][1] * vMv[0][n7][1][tf][n8][0] * vMv[0][n10][1][tf][n1][0] * vMv[0][n6][1][tf][n0][0]

.....

大約有600行代碼,與前一代碼非常相似,但是對於索引的不同組合。 它不能通過代數方式進一步簡化。 ....

然后循環關閉,就是這樣。

因此,基本上,該代碼僅使用C99雙重復雜數據類型包含復雜的加法和乘法。 循環索引在編譯時未知。 我指定了屬性O0以便進行優化以檢查是否會引起麻煩,但仍然掛起。 我的問題是:

1)你們中的任何人知道這里出了什么問題嗎? 2)如果沒有,我如何找出(即打印出編譯器正在處理的實際代碼行),即獲得編譯器所做工作的某種實時輸出。

非常感謝你

  1. 您可以將功能分成幾部分,然后將每個小型功能放入一個單獨的文件(翻譯單元)中嗎? 我想GCC會花費大量時間重新排列基本塊

  2. 也許您可以使用-fdump- ... optionis?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM