Metal内核中的循环展开

5
我需要强制Metal编译器在我的内核计算函数中展开循环。目前我尝试在for循环之前放置#pragma unroll(num_times)语句,但是编译器忽略了这个语句。
看来编译器不会自动展开循环 - 我比较了执行时间:1)带有for循环的代码,2)相同的代码但手动展开循环的版本。手动展开的版本速度快了3倍。
例如:我想从这个开始:
for (int i=0; i<3; i++) {
    do_stuff();
}

转换为:

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

Metal C++语言中是否有类似于循环展开的东西?如果有,我该如何让编译器知道我想要展开一个循环?
1个回答

8

Metal是C++11的一个子集,您可以尝试使用模板元编程来展开循环。以下代码在Metal中编译通过,但我没有时间进行适当的测试:

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
另请参阅:C/C++中的自展开宏循环

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接