メニーコアと格闘ブログ:PGIコンパイラの新機能の性能検証~その2:関数solve中の各ループを並列化する

出典: トータル・ディスクロージャ・サイト(事実をありのままに)

結果3(別の方法で性能を再検証)

別の方法を考えて関数solve中の各ループを並列化することを試みます。
メディア:sgfdm2d03.txt
4m44sかかりました。217行目の計算に多くの時間をとられています。
sgfdm2d03.cの217行目のforループの計算結果を見ると二重ループの内外側のループだけが並列化されています。実行時間が短くならないのはこのためです。

[kim@localhost ~]$ pgcc -ta=nvidia,time -Minfo sgfdm2d03.c
solve:
   145, Generating copyout(T_new[0][1:254])
        Generating copyin(T[0:1][0:255])
   146, Loop is parallelizable
        Accelerator kernel generated
       146, #pragma for parallel, vector(254)
            Cached references to size [2x256] block of 'T'
   155, Generating copyout(T_new[255][1:h_mid-1])
        Generating copyin(T[254:255][0:h_mid])
   156, Loop is parallelizable
        Accelerator kernel generated
       156, #pragma for parallel, vector(256)
            Cached references to size [2x258] block of 'T'
   165, Generating copyout(T_new[1:254][255])
        Generating copyin(T[0:255][254:255])
   166, Loop is parallelizable
        Accelerator kernel generated
       166, #pragma for parallel, vector(32)
            Non-stride-1 accesses for array 'T'
            Non-stride-1 accesses for array 'T_new'
   175, Generating copyout(T_new[128:254][0])
        Generating copyin(T[127:255][0:1])
   176, Loop is parallelizable
        Accelerator kernel generated
       176, #pragma for parallel, vector(32)
            Non-stride-1 accesses for array 'T'
            Non-stride-1 accesses for array 'T_new'
   217, Generating copyin(T[0:255][0:255])
        Generating copyout(T_new[1:254][1:254])
   218, Loop is parallelizable
        Accelerator kernel generated
       218, #pragma for parallel, vector(254)
   219, Loop is parallelizable
main: 
   303, Memory copy idiom, loop replaced by call to __c_mcopy8
[kim@localhost ~]$ time ./a.out
gamma = 1.000244e-02
t = 0.000000
q_in = 3.200000e+06, q_out = 0.000000e+00, dQ = 3.200000e+06
FILENAME=0.000000.bmp
t = 10.000000
q_in = 6.786950e+04, q_out = 7.252066e-01, dQ = 6.786877e+04
FILENAME=10.000000.bmp
t = 10.000000
q_in = 6.786950e+04, q_out = 7.252066e-01, dQ = 6.786877e+04
FILENAME=10.000000.bmp
Accelerator Kernel Timing data
sgfdm2d03.c
  solve
    217: region entered 100000 times
        time(us): total=207462659 init=124345 region=207338314
                 kernels=113773864 data=93564450
       w/o init: total=207338314 max=2341 min=1966 avg=2073
       218: kernel launched 100000 times
           grid: [1]  block: [254]
           time(us): total=113773864 max=1299 min=1126 avg=1137
sgfdm2d03.c
  solve
    175: region entered 100000 times
        time(us): total=9727496 init=145816 region=9581680
                 kernels=1930250 data=7651430
       w/o init: total=9581680 max=231 min=85 avg=95
       176: kernel launched 100000 times
           grid: [4]  block: [32]
           time(us): total=1930250 max=126 min=16 avg=19
sgfdm2d03.c
  solve
    165: region entered 100000 times
        time(us): total=26813284 init=118187 region=26695097
                 kernels=1931400 data=24763697
       w/o init: total=26695097 max=439 min=241 avg=266
       166: kernel launched 100000 times
           grid: [8]  block: [32]
           time(us): total=1931400 max=102 min=17 avg=19
sgfdm2d03.c
  solve
    155: region entered 100000 times
        time(us): total=6890843 init=142231 region=6748612
                 kernels=2041643 data=4706969
       w/o init: total=6748612 max=195 min=60 avg=67
       156: kernel launched 100000 times
           grid: [1]  block: [256]
           time(us): total=2041643 max=115 min=18 avg=20
sgfdm2d03.c
  solve
    145: region entered 100000 times
        time(us): total=23284270 init=1340912 region=21943358
                 kernels=2167428 data=19775930
       w/o init: total=21943358 max=391 min=197 avg=219
       146: kernel launched 100000 times
           grid: [1]  block: [254]
           time(us): total=2167428 max=121 min=20 avg=21
real    4m44.835s
user    0m59.970s
sys     3m44.750s


次のようにすると217行目の二重ループの両方を並列化されます。すなわち、それぞれのfor文の条件指定のところでNW、NHが用いられていますが、別の変数n、mを定義してそれにNW、NHを代入し、このn、mをNW、NHの代わりに用います。
メディア:sgfdm2d04.txt
2m48sかかっています。少し早くなりました。それでもCPU上での実行時間(0m34s)よりかなり長いです。 さらに別の方法を考えます。

[kim@localhost ~]$
[kim@localhost ~]$ pgcc -ta=nvidia,time -Minfo sgfdm2d04.c
solve:
   149, Generating copyout(T_new[0][1:254])
        Generating copyin(T[0:1][0:255])
   150, Loop is parallelizable
        Accelerator kernel generated
       150, #pragma for parallel, vector(254)
            Cached references to size [2x256] block of 'T'
   159, Generating copyout(T_new[255][1:h_mid-1])
        Generating copyin(T[254:255][0:h_mid])
   160, Loop is parallelizable
        Accelerator kernel generated
       160, #pragma for parallel, vector(256)
            Cached references to size [2x258] block of 'T'
   169, Generating copyout(T_new[1:254][255])
        Generating copyin(T[0:255][254:255])
   170, Loop is parallelizable
        Accelerator kernel generated
       170, #pragma for parallel, vector(32)
            Non-stride-1 accesses for array 'T'
            Non-stride-1 accesses for array 'T_new'
   179, Generating copyout(T_new[128:254][0])
        Generating copyin(T[127:255][0:1])
   180, Loop is parallelizable
        Accelerator kernel generated
       180, #pragma for parallel, vector(32)
            Non-stride-1 accesses for array 'T'
            Non-stride-1 accesses for array 'T_new'
   221, Generating copyin(T[0:255][0:255])
        Generating copyout(T_new[1:254][1:254])
   222, Loop is parallelizable
   223, Loop is parallelizable
        Accelerator kernel generated
       222, #pragma for parallel, vector(16)
       223, #pragma for parallel, vector(16)
            Cached references to size [18x18] block of 'T'
main:
   307, Memory copy idiom, loop replaced by call to __c_mcopy8
[kim@localhost ~]$ time ./a.out
gamma = 1.000244e-02
t = 0.000000
q_in = 3.200000e+06, q_out = 0.000000e+00, dQ = 3.200000e+06
FILENAME=0.000000.bmp
t = 10.000000
q_in = 6.786950e+04, q_out = 7.252066e-01, dQ = 6.786877e+04
FILENAME=10.000000.bmp
t = 10.000000
q_in = 6.786950e+04, q_out = 7.252066e-01, dQ = 6.786877e+04
FILENAME=10.000000.bmp
Accelerator Kernel Timing data
sgfdm2d04.c
  solve
    221: region entered 100000 times
       time(us): total=93454799 init=121219 region=93333580
                 kernels=5296419 data=88037161
       w/o init: total=93333580 max=8723 min=866 avg=933
       223: kernel launched 100000 times
           grid: [16x16]  block: [16x16]
           time(us): total=5296419 max=6563 min=49 avg=52
sgfdm2d04.c
  solve
    179: region entered 100000 times
       time(us): total=9394419 init=136756 region=9257663
                 kernels=1964829 data=7292834
       w/o init: total=9257663 max=6632 min=84 avg=92
       180: kernel launched 100000 times
           grid: [4]  block: [32]
           time(us): total=1964829 max=6560 min=16 avg=19
sgfdm2d04.c
  solve
    169: region entered 100000 times
       time(us): total=25896000 init=134722 region=25761278
                 kernels=1945203 data=23816075
       w/o init: total=25761278 max=7139 min=240 avg=257
       170: kernel launched 100000 times
           grid: [8]  block: [32]
           time(us): total=1945203 max=6375 min=17 avg=19
sgfdm2d04.c
  solve
    159: region entered 100000 times
       time(us): total=6916123 init=138419 region=6777704
                 kernels=2019986 data=4757718
       w/o init: total=6777704 max=6581 min=59 avg=67
       160: kernel launched 100000 times
           grid: [1]  block: [256]
           time(us): total=2019986 max=634 min=18 avg=20
sgfdm2d04.c
  solve
    149: region entered 100000 times
       time(us): total=22125428 init=1308881 region=20816547
                 kernels=2220000 data=18596547
       w/o init: total=20816547 max=12819 min=196 avg=208
       150: kernel launched 100000 times
           grid: [1]  block: [254]
           time(us): total=2220000 max=6562 min=20 avg=22
real    2m48.807s
user    0m57.566s
sys     1m49.952s



この記事へのコメントをお寄せください

  • サイトへの書き込みに差し支えございましたら トータルディスクロージャーサイトサポート係へメールをお送りください
  • トータル・ディスクロージャ・サイトに投稿された文章と画像は、すべてその著作権がHPCシステムズ株式会社に帰属し、HPCシステムズ株式会社が著作権を所有することに同意してください。
  • あなたの文章が他人によって自由に編集、配布されることを望まない場合は、投稿を控えてください。
  • コメントを書き込む場合は名前にひらがなを織り交ぜてください。
  • あなたの投稿する文章と画像はあなた自身によって書かれたものであるか、パブリック・ドメインかそれに類する自由なリソースからの複製であることを約束してください。あなたが著作権を保持していない作品を許諾なしに投稿してはいけません!

<comments hideform="false" />


Comments

ノート:メニーコアと格闘ブログ:PGIコンパイラの新機能の性能検証~その2:関数solve中の各ループを並列化する

個人用ツール