Войти в систему

Home
    - Создать дневник
    - Написать в дневник
       - Подробный режим

LJ.Rossia.org
    - Новости сайта
    - Общие настройки
    - Sitemap
    - Оплата
    - ljr-fif

Редактировать...
    - Настройки
    - Список друзей
    - Дневник
    - Картинки
    - Пароль
    - Вид дневника

Сообщества

Настроить S2

Помощь
    - Забыли пароль?
    - FAQ
    - Тех. поддержка



Пишет qwerty ([info]qwerty)
@ 2007-10-11 18:52:00


Previous Entry  Add to memories!  Tell a Friend!  Next Entry
Хе-хе
  switch (length & 3) {
    do {
      crc = table[ ( crc ^ *data++ ) & 0xFF ] ^ (crc >> 8);
    case 3:
      crc = table[ ( crc ^ *data++ ) & 0xFF ] ^ (crc >> 8);
    case 2:
      crc = table[ ( crc ^ *data++ ) & 0xFF ] ^ (crc >> 8);
    case 1:
      crc = table[ ( crc ^ *data++ ) & 0xFF ] ^ (crc >> 8);
    default:;
    } while( data < end );
  }


(Добавить комментарий)


[info]blue_slonopotam
2007-10-12 05:59 (ссылка)
а почему не 2 и не 8 ?
цомпилятор сам цикл размотать не может ?

Из-за таких как ты Дейкстра и умер.

(Ответить) (Ветвь дискуссии)


[info]qwerty
2007-10-12 06:07 (ссылка)
На цомпилер надейся, а сам не плошай. Loop unrolling очень немногие цомпилеры умеют, а этот код критический. И если умеют, то обычно существенно менее изящно.

Сколько раз Дейкстру увидишь, столько его и убей. Предварительно подсунь статейку на память подписать.

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]nit
2007-10-12 07:09 (ссылка)
Прикольно и понятно. Не знал про такое.

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]qwerty
2007-10-12 08:20 (ссылка)
Для VLIW'ов, SIMD'ов и процессоров с длинным трубопроводом тело критического цикла раскручивают несколько раз, комбинируют инструкции для снижения их числа и шедулят для снижения задержек между инструкциями. Выполнению оптимизации мешают возможные зависимости между данными и малое число регистров (регистровое давление увеличивается примерно пропорционально кратности раскрутки).

(Ответить) (Уровень выше)


[info]ded_mitya
2007-10-12 14:57 (ссылка)
А почему не
case 3:
case 2:
case 1:
crc = table[ ( crc ^ *data++ ) & 0xFF ] ^ (crc >> 8);
default:;

(Ответить) (Ветвь дискуссии)


[info]ded_mitya
2007-10-12 15:03 (ссылка)
Читаю про Duff's device.

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]tiphareth
2007-10-21 10:25 (ссылка)
Да, феноменально заебательская штука.
Не знал про такую.

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]qwerty
2007-10-21 10:37 (ссылка)
В Википедии, кстати, ошибка при count == 0.

(Ответить) (Уровень выше)


[info]qwerty
2007-10-22 07:53 (ссылка)
Если в Википедии, то там ошибка. Правильно так:
  switch (count % 8) {
    do {
      *dst++ = *src++;
    case 7:
      *dst++ = *src++;
    case 6:
      *dst++ = *src++;
    case 5:
      *dst++ = *src++;
    case 4:
      *dst++ = *src++;
    case 3:
      *dst++ = *src++;
    case 2:
      *dst++ = *src++;
    case 1:
      *dst++ = *src++;
    default /*0*/:
      ;
    } while( (count -= 8) >= 0 );
  }

(Ответить) (Уровень выше)


[info]qwerty
2007-10-12 18:53 (ссылка)
Там break'ов нет.

(Ответить) (Уровень выше)


[info]ppkk
2007-10-12 15:06 (ссылка)
Тут опечатки (типа, сначала "switch", а потом "do {crc=..*data..>>8);*4}")?

Я на Си не очень, но то ли "case 0" не хватает, то ли вообще херня бутет если data==end с самого начала?

Читать такие штуки, когда они в каких-то вложенных макросах, особенно неприятно.

Писать — другое дело.

(Ответить) (Ветвь дискуссии)


[info]qwerty
2007-10-12 18:52 (ссылка)
Нет тут опечаток. Ошибок тоже нет.

Нежно люблю вложенные макросы.

(Ответить) (Уровень выше)


[info]skavish.livejournal.com
2007-10-12 16:39 (ссылка)
хе-хе, помнится тоже самое (почти) было в жпеговском кодере/декодере, том самом :)
тока там насколько помню раскручивали аж до 16

(Ответить)