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++ 语言中甚至有类似循环展开的东西吗?如果是,我怎么可能让编译器知道我想展开一个循环?
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++ 中的自展开宏循环
| 归档时间: |
|
| 查看次数: |
868 次 |
| 最近记录: |