ライブラリ開発者のためのサンプルプログラム


【プログラム例1】

行列積の1段から16段のアンローリングをインストール時ルーチンで自動チューニングする。パラメタ推定には5次多項式を利用して最小二乗法で決定する。また標本点は、1-5、8、16を指定する。デバック表示する対象は、性能パラメタ(アンローリング段数)情報を指定する。

!ABCLib$ install unroll region start
!ABCLib$ name MyMatMul
!ABCLib$ varied (i, j) from 1 to 16
!ABCLib$ fitting least-squares 5 sampled (1-5, 8, 16)
!ABCLib$ debug (pp)
do i=1, n
 do j=1, n
  do k=1,n
   A(i, j) = A(i, j) + B(i, k) * C(k, j)
  enddo
 enddo
enddo
!ABCLib$ install unroll (i, j) region end


【プログラム例2】

実行起動前ルーチンにおいて、以下のプログラムを16段までアンローリングして最適なパラメタを決定する。パラメタ測定は、1−16段全て(=全探索法)とする。ループ導入変数が変数nしかないので、変数nがデフォルト基本パラメタであると解釈する。

!ABCLib$ static unroll (i, j) region start
!ABCLib$ name MyMatMul
!ABCLib$ varied (i, j) from 1 to 16
do i=1, n
 do j=1, n
  do k=1, n
   A(i, j) = A(i, j) +B(i, k)*C(k, j)
  enddo
 enddo
enddo
!ABCLib$ static unroll (i, j) region end


この例の場合、出力パラメタは最適な(=最もこの処理が高速となる)i、j の値となります。



【プログラム例3】

実行起動前ルーチンにおいて、以下のプログラムを16段までアンローリングし最適なパラメタを決定する。パラメタ測定は、1−16段全て(=全探索法)とする。
以下の例では、ループ終了変数がnだけではない(変数nprocsも存在する)ため、変数nと変数nprocsのどちらがデフォルト基本パラメタであるか分からない。したがって、parameter補助指定子により、ユーザによる基本パラメタの指定が必要になる。

!ABCLib$ static unroll (i, j) region start
!ABCLib$ name MyMatMul
!ABCLib$ parameter(bp n)
!ABCLib$ varied (i, j) from 1 to 16
do i=1, n/nprocs
 do j=1, n
  do k=1, n
   A(i, j) = A(i, j) +B(i, k)*C(k, j)
  enddo
 enddo
enddo
!ABCLib$ static unroll (i, j) region end




【プログラム例4】

実行起動前ルーチンにおいて、以下のプログラムを16段までアンローリングして最適なパラメタを決定する。パラメタ測定は、1−16段全て(=全探索法)とする。以下の例では、基本パラメタは変数nだけでなく、変数nprocsも基本パラメタであると指定する。


!ABCLib$ call ABCLib_BPsetVal(“nprocs”)
!ABCLib$ call ABCLib_BPsetName(STARTTUNESIZE, “nprocs”,
!ABCLib$ & “ABCLib_NprocsStartSize”)
!ABCLib$ call ABCLib_BPsetName(ENDTUNESIZE, “nprocs”,
!ABCLib$ & “ABCLib_NprocsEndSize”)
!ABCLib$ call ABCLib_BPsetName(SAMPDIST, “nprocs”,
!ABCLib$ & “ABCLib_NprocsSampDist”)
!ABCLib$ ABCLib_NprocsStartSize = 1
!ABCLib$ ABCLib_NprocsEndSize = 8
!ABCLib$ ABCLib_NprocsSampDist = 1
!ABCLib$ static unroll (i, j) region start
!ABCLib$ name MyMatMu
!ABCLib$ parameter(bp n, bp nprocs)
!ABCLib$ varied (i, j) from 1 to 16
do i=1, n/nprocs
 do j=1, n
  do k=1, n
   A(i, j) = A(i, j) +B(i, k)*C(k, j)
  enddo
 enddo
enddo
!ABCLib$ static unroll (i, j) region end



【プログラム例5】

インストール時自動チューニングルーチンのパラメタCacheSizeを参照し、さらに実行起動前にエンドユーザが固定する問題サイズ、プロセッサ台数、の基本パラメタ情報を利用して、最適な実装方式を決定する。このとき、ある基準(この場合はユーザが与える実行時間予測式)で自動選択 する。


!ABCLib$ static select region start
!ABCLib$ name ATfromCacheSize
!ABCLib$ parameter (in CacheSize, in ABCLib_PROBSIZE,
!ABCLib$ & in ABCLib_NUMPROC)
!ABCLib$ select sub region start
!ABCLib$ according estimated
!ABCLib$ & 2.0d0*CacheSize*ABCLib_PROBSIZE*ABCLib_PROBSIZE
!ABCLib$ & / (3.0d0*ABCLib_NUMPROC)
         対象処理1
!ABCLib$ select sub region end
!ABCLib$ select sub region start
!ABCLib$ according estimated 4.0d0*CacheSize*ABCLib_PROBSIZE
!ABCLib$ & *dlog(ABCLib_PROBSIZE) / (2.0d0*ABCLib_NUMPROC)
         対象処理2
!ABCLib$ select sub region end
!ABCLib$ static select region end


【プログラム例6】

プログラム中で定義するパラメタeps、iterをもとに、最適な処理を選択する。具体的には、epsが最小となるような処理を条件iter<5以内に決定する。


!ABCLib$ dynamic select ( eps, iter ) region start
!ABCLib$ name PricondSelect
!ABCLib$ parameter (in eps, in iter )
!ABCLib$ according min ( eps ) .and. condition ( iter < 5 )
!ABCLib$ select sub region start
  対象処理1
    eps=…
!ABCLib$ select sub region end
!ABCLib$ select sub region start
  対象処理2
eps=…
!ABCLib$ select sub region end
!ABCLib$ dynamic select ( eps, iter ) region end



【プログラム例7】

最適なループアンローリング段数決定に関して、以前に行った実行時最適化の最適化情報を再利用し、当該AT領域で最適化された処理を実行する。




!ABCLib$ call ABCLib_DynPefThis(“DMatVec”)

do iter=1, maxiter
…..
!ABCLib$ dynamic unroll ( i ) region start
!ABCLib$ name DMatVec
!ABCLib$ varied (i ) from 1 to 4
 do i=1, N
  y(i) = 0.0d0
  do j = ind_r(i), ind_r(i+1) - 1
   y(i) = y(i) + A(j) * x(ind_c(j))
  enddo
 enddo
!ABCLib$ dynamic unroll ( i ) region end

enddo