在金属内核中循环展开

sar*_*ati 4 kernel ios loop-unrolling metal

我需要强制 Metal 编译器在我的内核计算函数中展开一个循环。到目前为止,我已经尝试放在循环#pragma unroll(num_times)之前for,但编译器忽略了该语句。

似乎编译器不会自动展开循环——我比较了 1) 带有for循环的代码2) 相同代码但带有手动展开循环的执行时间。手动展开的版本快了 3 倍。

例如:我想从这个开始:

for (int i=0; i<3; i++) {
    do_stuff();
}
Run Code Online (Sandbox Code Playgroud)

对此:

do_stuff();
do_stuff();
do_stuff();
Run Code Online (Sandbox Code Playgroud)

在 Metal C++ 语言中甚至有类似循环展开的东西吗?如果是,我怎么可能让编译器知道我想展开一个循环?

Tay*_*lor 7

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

}
Run Code Online (Sandbox Code Playgroud)

请让我知道它是否有效!您可能需要添加一些参数call以将参数传递给do_stuff.

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