2016-12-20 2 views
3

Мне нужно заставить компилятор металла развернуть цикл в моей функции вычисления ядра. До сих пор я пытался поставить #pragma unroll(num_times) перед циклом for, но компилятор игнорирует этот оператор.Loop разворачивается в ядрах ядер

Кажется, что компилятор не разворачивает петли автоматически - я сравнивал время выполнения для 1) кода с циклом for 2) того же кода, но с ручным разверткой. Развернутая вручную версия была в 3 раза быстрее.

т.д .: Я хочу, чтобы перейти от этого:

for (int i=0; i<3; i++) { 
    do_stuff(); 
} 

к этому:

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

Есть даже что-то вроде петли разворачивания на языке C++ Metal? Если да, как я могу сообщить компилятору, я хочу развернуть цикл?

ответ

3

Металл - это подмножество 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.

См. Также: Self-unrolling macro loop in C/C++

Смежные вопросы