Page 88 - 《软件学报》2024年第6期
P. 88

2664                                                       软件学报  2024  年第  35  卷第  6  期



                    /*手工双缓冲示优化编程示例*/                        if(bix+BLOCK<WGSIZE)
                                                             for(int k=0;k<5;k++)
                    #define WGSIZE 4096                       dma_get(ldm_poses[k+off1],&poses[k][CCC_TID*WGSIZE]
                    #define BLOCK 256                        [bix+BLOCK],sizeof(float)*BLOCK,MEM_TO_LDM);
                    float LDM_Tbuf=(float*)ldm_malloc(10*1024)  for(int ix=0; ix<BLOCK; ix++)
                    float *ldm_poses[10];                   {
                    for(int k=0;k<5;k++)                       //Compute transformation matrix
                    {                                           const float sx = sinf(ldm_poses[0+off0][ix]);
                       ldm_poses[k]=LDM_Tbuf[BLOCK*k];          const float cx = cosf(ldm_poses[0+off0][ix]);
                       ldm_poses[k+5]=LDM_Tbuf[BLOCK*(k+5)];    const float sy = sinf(ldm_poses[1+off0][ix]);
                    }                                           const float cy = cosf(ldm_poses[1+off0][ix]);
                    for(int k=0;k<5;k++)                        const float sz = sinf(ldm_poses[2+off0][ix]);
                    {                                           const float cz = cosf(ldm_poses[2+off0][ix]);
                    dma_get(ldm_poses[k],&poses[k][CCC_TID*WGSIZE][0],s  …//其他与优化无关代码
                    izeof(float)*BLOCK,MEM_TO_LDM);             Transform[0][3][ix] = ldm_poses[3+off0][ix];
                    }                                           …//其他与优化无关代码
                    intbflag=0;                                 Transform[1][3][ix] = ldm_poses[4+off0][ix];
                    for(intbix=0;bix<WGSIZE;bix+=BLOCK)         …//其他与优化无关代码
                    {                                           Transform[2][3][ix] = ldm_poses[5+off0][ix];
                      bflag++;                                  …//其他与优化无关代码
                      int off0=(bflag^1)*5;                  }//ix
                      int off1=((bflag−1)^1)*5;             }//bix

                                           图 16 手工实现的双缓冲优化程序代码示意

                 5.2   mem2ldm  优化编译指示测试分析
                    mem2ldm  优化编译指示的测试程序为第          5.1  节中使用的迷你分子动力学程序         MiniBude.
                    本文对该程序的直接访问主存、基于编译指示的编译器自动单缓冲优化、手工实现的单缓冲优化、基于编
                 译指示的编译器自动双缓冲优化、手工实现的双缓冲优化等                      5  个版本的程序在数组容量        4 KB、8 KB、12 KB、
                 16 KB  这  4  个规模下进行了测试, 测试结果如图       17  所示, 图中展示各种规模下的程序运行时间对比.

                    10.00                                         20.00
                     9.00                                         18.00
                                                                  16.00
                     8.00    7.50                                 15.00
                                                                           14.99
                   运行时间 (ms)  6.00                               运行时间 (ms)  12.00
                                                                  14.00
                     7.00
                     5.00
                                                                  10.00
                                                                  8.00
                     4.00
                     3.00
                     2.00                                         6.00
                                                                  4.00
                     1.00          0.49   0.48   0.44   0.44      2.00           0.96  0.95  0.89  0.88
                       0                                            0
                            未优化 自动单 手工单 自动双 手工双                           未优化 自动单 手工单 自动双 手工双
                                  缓冲   缓冲   缓冲    缓冲                            缓冲   缓冲    缓冲   缓冲
                                     (a) 4 KB 规模                                  (b) 8 KB 规模
                    30.00                                         35.00
                                                                           29.88
                                                                  30.00
                    25.00
                             22.43                                25.00
                   运行时间 (ms)  15.00                              运行时间 (ms)  20.00
                    20.00
                    10.00
                     5.00                                         10.00
                                                                   5.00
                                  1.44   1.42   1.33   1.32                     1.92   1.90   1.77   1.75
                      0                                             0
                            未优化 自动单 手工单 自动双 手工双                           未优化 自动单 手工单 自动双 手工双
                                  缓冲   缓冲   缓冲    缓冲                            缓冲    缓冲   缓冲   缓冲
                                    (c) 12 KB 规模                                  (d) 16 KB 规模
                                               图 17 mem2ldm  优化效果对比图
   83   84   85   86   87   88   89   90   91   92   93