LINUX.ORG.RU
ФорумTalks

-O2 лучше чем -O3?


0

0

ради прикола сделал умножение 2-х матриц 300х300 и получил следующее:

-O2:

real 0m0.643s

user 0m0.430s

sys 0m0.140s

-O3:

real 0m1.048s

user 0m0.870s

sys 0m0.010s

gcc 2.95.3 на чем использование -O3 дает выигрыш?

anonymous

а можно код посмотреть??

-O3 инлайнит функции и в некоторых местах от этого только хуже. Но если у тебя просто цикл, то как-то все странно..

dilmah ★★★★★
()

да собсно ничего особенногo

#include<stdio.h>

#include<stdlib.h>

#include<time.h>

#define MM 300

#define MN 300

#define ML 300

float* MulMatr(float* a,float* b,int m,int n,int l)

{

clock_t time1;

int i,j,j1;

float s;

float *c=malloc(sizeof(float)*m*l);

if (c!=NULL)

{

time1=clock();

for (i=0;i<m;i++)

for (j=0;j<l;j++)

{

c[i*l+j]=0;

for (j1=0;j1<n;j1++)

c[i*l+j]+=a[i*n+j1]*b[j1*l+j];

}

time1=clock()-time1;

printf("Multiplying of two matrices processed for a %d ticks \n",time1);

}

return(c);

}

int main(int argc,char* argv[],char* env[])

{

int i;

float *a=malloc(sizeof(float)*MM*MN);

float *b=malloc(sizeof(float)*MN*ML);

float *c;

for (i=0;i<MM*MN;i++)

*(a+i)=rand();

for (i=0;i<MN*ML;i++)

*(b+i)=rand();

c=MulMatr(a,b,MM,MN,ML);

free(a);

free(b);

free(c);

return(0); }

теперь что, все программы два раза компилировать :(

anonymous
()

Кто так матрицы умножает надо столбец в буфер класть Да если на 2000х2000 будет работать дольше 2 сек то говно твой алгоритм

anonymous
()

э-э-э я вообще-то не силен в программировании, простите какой-такой буфер? можно поподробнее?

anonymous
()

anonymous (*) (2002-09-26 01:59:23.495) наверно имел в виду что писать нужно в cache-friendly манере. А это значит что предпочтительнее доступ по непрерывным адресам чем с большим шагом -- иначе кэш очень расточительно расходуется. Но строки левой матрицы у тебя и так будут кэшироваться -- и на столбцах по моему ничего не выиграешь..

dilmah ★★★★★
()

Тогда не просветите ли меня по следующим вопросам: не являтся ли это уклоном под определенную архитектуру, и писать на языке высокого уровня оптимизируя под определенную архитектуру это хорошо или плохо?

anonymous
()

не знаю..

Имхо это здравая оптимизация. В сами стандарты Си закладывается модель машины с последовательностью char-ячеек. И здраво предполагать что для этой последовательности есть кэш. Также предположение о том что кэш лучше справляется с локализованным доступом здраво. И писать код который не будет хуже работать на машине без кэша, но лучше на реально имеющихся машинах с кэшем здраво. Кэш все таки не интел придумала.

С теми же предсказаниями переходов. Имхо если есть хоть какие-то зачатки предсказания бранчей то они начнутся с того что условные переходы назад предсказываются выполненными, а вперед невыполненными. Потому что это здраво. Поэтому в if'е я ставлю более вероятный бранч первым. Это может быть смешно, но я выработал в себе такую привычку потому что это здравый регулярный стиль написания. Хотя на конкретном компиляторе и конкретном пентиуме это скорее всего не имеет никакого эффекта.

dilmah ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.