我需要强制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 ++语言循环展开的东西?如果是,我怎么可能让编译器知道我想展开循环?
答案 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
。