2016-12-20 10 views
3

カーネルコンピューティング関数でループをアンロールするように強制する必要があります。これまで私はforループの前に#pragma unroll(num_times)を入れようとしましたが、コンパイラはそのステートメントを無視します。メタルカーネルでのループアンロール

コンパイラが自動的にループを展開していないようです - 実行時間を1)forループのコードと比較しました2)同じコードですが手で展開されたループがあります。手に展開されたバージョンは3倍速かった。

例えば:私はこれから行きたい:これまで

for (int i=0; i<3; i++) { 
    do_stuff(); 
} 

do_stuff(); 
do_stuff(); 
do_stuff(); 

も、メタルC++言語でループアンローリングのようなものはありますか?はいの場合、ループをアンロールする方法をコンパイラに知らせるにはどうすればよいですか?

答えて

3

メタルはサブセットC++ 11であり、テンプレートメタプログラミングを使用してループをアンロールすることができます。私はそれを適切にテストする時間を持っていないものの、金属でコンパイル以下:

template <unsigned N> struct unroll { 

    template<class F> 
    static void call(F f) { 
     f(); 
     unroll<N-1>::call(f); 
    } 
}; 

template <> struct unroll<0u> { 

    template<class F> 
    static void call(F f) {} 
}; 

kernel void test() { 

    unroll<3>::call(do_stuff); 

} 

それが動作するかどうか私に教えてください!引数をdo_stuffに渡すには、おそらくcallにいくつかの引数を追加する必要があります。

も参照してください。Self-unrolling macro loop in C/C++

関連する問題