Re: Что будет работать быстрее???

zamorin31

for (i=0;i<500;i++) for(j=0;j<500;j++) a[i*n+j]=...
или
for (i=0;i<500;i++) for(j=0;j<500;j++) *(a+m*i+j)=...
и почему?

bleyman

Одинаково.
Потому что это одно и то же.

zamorin31

А как с помощью указателей можно ускорить
for (i=0;i<500;i++) for(j=0;j<500;j++) a[i*n+j]=... ?

bleyman

int * p = a;
for (i=0;i<500;i++) for(j=0;j<500;j++, p++)
{
*p=...
}

bleyman

Заодно точно проверить, что для вычисления "..." тебе нужны i и j, если нет, то оставить один цикл.

vall

m == 500 && n == 500 ?
это фигня какая-то получается

okunek

товарищ походу просто опечатался

Olenenok

Говорю по собственному опыту, разницы в скорости практически нет. Лучше подумать об эффективном кешировании и конвейризации. Без них всё обычно упирается в память.

vall

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

ava3443

> ну естественно - два цикла с константными пределами - такое даже gcc наверно разрулит.
А я почти уверен, что не разрулит, при всём моём уважении к gcc. По крайней мере, gcc 3.x.

Olenenok

Не разрулит. Недавно знакомый чувак писал метод гаусса. Всё тип-топом, кеширование есть, но не стал циклы развёртывать, понадеялся на gcc - в итоге на П4 2.4 метод работал быстрее чем на А64 3000+ Винчестер. Развернул циклы - на Атлоне метод ускорился в 5 раз. Т.е. у gcc плохо с разруливанием циклов.

Olyalyau

А он в опциях gcc указал -funroll-all-loops или -funroll-loops?
Насколько я помню, по -O... развёртывание циклов в gcc не включается (по крайней мере для -O2 и ниже).
Оставить комментарий
Имя или ник:
Комментарий: