5

我需要强制 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++ 语言中甚至有类似循环展开的东西吗?如果是,我怎么可能让编译器知道我想展开循环?

4

1 回答 1

8

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.

另请参阅:C/C++ 中的自展开宏循环

于 2017-01-05T03:41:13.103 回答