循环展开Metal内核

时间:2016-12-20 19:22:29

标签: ios kernel metal loop-unrolling

我需要强制Metal编译器在我的内核计算功能中展开循环。到目前为止,我已经尝试将#pragma unroll(num_times)置于for循环之前,但编译器会忽略该语句。

似乎编译器没有自动展开循环 - 我比较了执行时间为1)代码与for循环2)相同的代码,但手动展开循环。手动展开版本的速度提高了3倍。

例如:我想离开这个:

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

到此:

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

是否有类似于使用Metal C ++语言循环展开的东西?如果是,我怎么可能让编译器知道我想展开循环?

1 个答案:

答案 0 :(得分:3)

Metal是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);

}

如果有效,请告诉我!您可能需要向call添加一些参数以将参数传递给do_stuff

另请参阅:Self-unrolling macro loop in C/C++