LLVM 分析パスを使用して、プログラムで合体分析を実行しようとしています。
基本的には、配列アクセスを見て、メモリ アクセスが合体できるかどうか、つまりアクセス式が帰納変数に対して単調かどうかを調べる必要があります。
次の問題に直面しています。LLVM IR では、配列アクセスは getelementptr 命令で表現されます。そこからどのように表現を再構築できるでしょうか。
静的分析を使用してそれが不可能な場合は、動的分析も実行します。
それが役立つ場合は、次のアルゴリズムを実装しようとしています:
procedure getCoalescingFactor(f, warpSize, reqLineSize)
x ← the variable that corresponds to the x grid coordinate
fw ← f where all variables are fixed except x grid coordinate
mono ← monotonicity(fw , x)
if mono is unknown then
culprits ← variables in fw which do not have a sign
fw ← fw where each variable in culprits is assumed positive
mono ← monotonicity(fw , x)
end if
if mono is monotonic then
if mono is increasing then
size ← f (x + warpSize) − f (x)
else
size ← f (x) − f (x + warpSize)
end if
return reqLineSize
else
offsets ← [fw (x), fw (x + 1), . . . , fw (x + warpSize)]
uniqOffsets ← removeDuplicates(offsets)
return size(uniqOffsets)
end if
end procedure