GCC 4.8.1使用许多宏和内联函数在C99代码中编译时间

时间:2014-02-05 00:49:30

标签: c gcc macros inline c99

我尝试使用多行代数编译代码。基本上,它是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 个答案:

答案 0 :(得分:1)

  1. 您可以将您的功能分成几个部分,并将每个迷你功能放入一个单独的文件(翻译单元)吗?我想GCC在重新排列basic blocks

  2. 时需要花费指数长时间
  3. 也许你可以玩-fdump- ... optionis?