Вложение циклов галоидной суммы

Вложенность печатных циклов для Halide::sum не эквивалентна оптимальной, как написано в учебник.

Этот код предоставляет отдельные циклы для нулевой инициализации и суммирования.

  Halide::Func f("f");
  Halide::Var x("x");
  Halide::RDom r(0, 3);

  f(x) = Halide::sum(r + x);
  f.print_loop_nest();

  f.realize(10);

выход:

produce f:
  for x:
    produce sum:
      for x:
        sum(...) = ...
      for x:
        for r4:
          sum(...) = ...
    consume sum:
      f(...) = ...

Можно ли плавить эти петли или это не влияет на производительность? Спасибо!


Обновление: слияние выглядит следующим образом:

produce f:
  for x:
    produce sum:
      for x:
        sum(...) = ...
        for r4:
          sum(...) = ...
    consume sum:
      f(...) = ...

person Dmitry Kurtaev    schedule 16.01.2017    source источник


Ответы (1)


Это тот случай, когда print_loop_nest сбивает с толку. Этот внутренний цикл над x имеет размер 1, поэтому он исчезает. Скомпилированное гнездо цикла — это то, что вам нужно. Внешний цикл над x является нетривиальным, поэтому на самом деле происходит следующее:

produce f:
  for x:
    produce sum:
      sum(...) = ...
      for r4:
        sum(...) = ...
    consume sum:
      f(...) = ...
person Andrew Adams    schedule 17.01.2017