Могу ли я использовать устройство Даффа на массиве в C? - PullRequest
5 голосов
/ 01 мая 2010

У меня есть цикл, и я хочу, чтобы он работал быстрее. Я передаю в большом массиве. Я недавно слышал об устройстве Даффа, это может быть применено к этому для цикла? есть идеи?

for (i = 0; i < dim; i++) {
    for (j = 0; j < dim; j++) {
        dst[RIDX(dim-1-j, i, dim)] = src[RIDX(i, j, dim)];
    }
}

Ответы [ 13 ]

0 голосов
/ 01 мая 2010

Устройство Даффа не может быть оптимизированным решением в развернутом цикле.

У меня была функция, которая отправляла бит на порт, а затем тактовый импульс на другой порт. Для каждого бита функции были:

  if (bit == 1)
  {
     write to the set port.
  }
  else
  {
     write to the clear port.
  }
  write high clock bit.
  write low clock bit.

Это было введено в цикл устройства Даффа, наряду со сдвигом и увеличением числа битов.

Я улучшил эффективность цикла, используя вместо битов значения полубайта (полубайт 4 бита). Оператор switch был основан на значении клева. Это позволило обрабатывать 4 бита без каких-либо операторов if, улучшая поток через кэш команд (конвейер).

Бывают случаи, когда устройство Даффа не может быть оптимальным решением; но может стать основой для более эффективного решения.

0 голосов
/ 01 мая 2010

Если вы используете его, убедитесь, что вы измерили его, чтобы определить, что улучшение является реальным, значительным и необходимым с точки зрения ваших требований к производительности. Я сомневаюсь, что это будет.

Для больших циклов остаток, обрабатываемый устройством Даффа, будет незначительной частью операции, а для небольших циклов, где остаток значительный, вы увидите преимущество, только если у вас будет много таких циклов (самих в цикле) потому что маленькие циклы по определению не занимают так много времени! Даже тогда оптимизатор компилятора, вероятно, будет делать то же самое или лучше, не делая ваш код нечитаемым. Также возможно, что применение устройства Даффа не позволит оптимизатору применить более, возможно, эффективные оптимизации, поэтому, если вы используете его, вам нужно его измерить.

Все время, которое вы, вероятно, сэкономите на этом (если есть), вы, вероятно, потратили несколько раз на чтение ответов на этот вопрос.

0 голосов
/ 01 мая 2010

педантично, нет.Устройство Даффа предназначалось для записи в аппаратный регистр (таким образом, целью копии всегда был один и тот же адрес).

Вы можете реализовать нечто очень похожее на устройство Даффа для такой копии,но будет ясность и стоимость обслуживания.Я бы сначала профиль, чтобы убедиться, что это проблема.Я также рассмотрю вопрос о том, можете ли вы упростить индексацию, поскольку это может позволить компилятору выполнить грязную работу по развертыванию цикла.

...