Менять float на int?
От: Gosha Украина  
Дата: 20.01.02 21:06
Оценка:
Привет Всем!!!

У меня есть одна задачка, в которой приходится иметь дело с большим количество массивов float-ов (к тому же не слабых по размерам). Данные в этих массивах перемножаются, деляться, ... большое количесто раз. Все это считается очень долго (от 20мин. и более на P3 700). Вообщем все большое Вот и задумался я, а не быстрее ли будет перевести все это в целые числа ? Операции с целыми идут ведь быстрее. Чтобы оценить примерный рост производительности написал код, приведенный ниже. Полученный мною результат составил ~2.3 раза (int быстрее). Однако эта цифра сильно плавала в зависимости от типа оптимизации компилятора, причем не в пользу int-а. Собственно вопрос(ы): кто-нибудь исследовал этот вопрос, может прояснить ситуацию, стоит ли менять float на int и на какие цифры (прирост производительности) можно расчитывать? Может сам код не годится для такого исследования, и если так, то как его исправить? С компилятором может какие-нибудь хитрости есть?

#include "stdafx.h"
#include <windows.h>

#define HEIGHT    500
#define WIDTH    500
#define TIMES    3000

int main(int argc, char* argv[])
{
    int i,x,y;
    DWORD fbegin,fend,ibegin,iend;

    printf("Float or int... Who's faster?\n");
    
    printf("Creating float 2d array\n");
    float * pfloat=new float [HEIGHT*WIDTH];
    float ** ppfloat=new float* [HEIGHT];
    for (i=0;i<HEIGHT;i++)
        ppfloat[i]=pfloat+i*WIDTH;

    printf("Counting float ...\n");
    fbegin=GetTickCount();

    for (i=0;i<TIMES;i++)
        for(y=0;y<HEIGHT;y++)
            for(x=0;x<WIDTH;x++)
                ppfloat[y][x]=1.0f*x*y;

    fend=GetTickCount();
    printf("Float finished. Ticks = %d\n",int(fend-fbegin));

    delete [] ppfloat;
    delete [] pfloat;

    printf("##################################\n");
    
    printf("Creating int 2d array\n");
    int * pint=new int [HEIGHT*WIDTH];
    int ** ppint=new int* [HEIGHT];
    for (i=0;i<HEIGHT;i++)
        ppint[i]=pint+i*WIDTH;

    printf("Counting int ...\n");
    ibegin=GetTickCount();

    for (i=0;i<TIMES;i++)
        for(y=0;y<HEIGHT;y++)
            for(x=0;x<WIDTH;x++)
                ppint[y][x]=100000*x*y;
    //100000 - точность, нужная от float (5 знаков после запятой)
    
    iend=GetTickCount();
    printf("Int finished. Ticks = %d\n",int(iend-ibegin));

    delete [] ppint;
    delete [] pint;

    printf("##################################\n");
    printf("(float ticks)/(int ticks) = %.3f\n",
        (float)(fend-fbegin)/(float)(iend-ibegin));


    return 0;
}
Re: Менять float на int?
От: Gosha Украина  
Дата: 20.01.02 21:11
Оценка:
Кстати, несколько раз уже замечал, что [ссоdе] не очень дружит с символами табуляции в коде, линии плывут влево
Re: Менять float на int?
От: VuDZ Россия  
Дата: 21.01.02 03:12
Оценка:
Здравствуйте Gosha, Вы писали:

G>Привет Всем!!!


Для эитх целей был придуман intel C++ Compiler
MS cl /Og /Os /G6 = 1.212 (float = 12888)
icl /Og /Os /G7 /QaxiMKW /QIfist /Qprec /Qprec_div 1.657 (float ~ 10500)

Athlon 1000/133

так что при использование icl скорость выростает значительно...

ЗЫ а может этот код оптимизировать под MMX, SSE, 3DNow! ?
Re[2]: Менять float на int?
От: Gosha Украина  
Дата: 21.01.02 22:08
Оценка:
Здравствуйте VuDZ, Вы писали:

VDZ>Здравствуйте Gosha, Вы писали:


G>>Привет Всем!!!


VDZ>Для эитх целей был придуман intel C++ Compiler

VDZ>MS cl /Og /Os /G6 = 1.212 (float = 12888)
VDZ>icl /Og /Os /G7 /QaxiMKW /QIfist /Qprec /Qprec_div 1.657 (float ~ 10500)

VDZ>Athlon 1000/133


VDZ>так что при использование icl скорость выростает значительно...


VDZ>ЗЫ а может этот код оптимизировать под MMX, SSE, 3DNow! ?

Я бы рад, но в АСМе (почти) нечего не смыслю . Хотя, наверное, придется потом и туда долезть . Но насколько я понял оптимизировать работу с целыми это не тоже самое, что работать с плавающей запятой. Поэтому и спросил нужно ли менять. Типа: сначала на целых выиграть, а потом еще и на асм перевести. Или Вы имели ввиду под оптимизацией игры с компилятором?
По поводу Intel C++ Compiler (5.0 ?). Действительно вещь хорошая? Я тут зашел на их сайт, там вроде написано, что работа с ним ведется через IDE от VC 6.0. Интересно, тогда зачем такая инсталляция толстая? Хотел trial скачать, а он на 42М Или с ним еще и своя оболочка идет? Правильно ли я понял, что можно попеременно компилить то им, то MS-овским? Много ли проблем со сборкой проектов (совместимось)? Как-то пробовал lcc, так тот в упор не признавал VC-шные ресурсы...
Re[3]: Менять float на int?
От: VuDZ Россия  
Дата: 21.01.02 22:21
Оценка: 3 (1)
Здравствуйте Gosha, Вы писали:

G>Я бы рад, но в АСМе (почти) нечего не смыслю . Хотя, наверное, придется потом и туда долезть . Но насколько я понял оптимизировать работу с целыми это не тоже самое, что работать с плавающей запятой.

ну, можно переписать под 3dNow || SSE — если числа не превышают 2^16 макс., то можно за один проход сразу с 4 работать, если превышают, то с 2. Но это лучше почитать доку по MMX & SSE

G>Поэтому и спросил нужно ли менять. Типа: сначала на целых выиграть, а потом еще и на асм перевести.

Чуть выше ответ
G>Или Вы имели ввиду под оптимизацией игры с компилятором?
Intel'овский компилятор полезен для мат. расчётов, т.к. генерит очень хороший код — при отсутствие большого опыта писания под асм сложно сделать лучше, так что попробуйте

G>По поводу Intel C++ Compiler (5.0 ?). Действительно вещь хорошая?

Великолепная по многим причинам, только вот компилит медленно
G>Я тут зашел на их сайт, там вроде написано, что работа с ним ведется через IDE от VC 6.0. Интересно, тогда зачем такая инсталляция толстая?
25 метров — компилер для Itanium, 12 — их дебагер. сам компилер ~ 13 после установки
G>Хотел trial скачать, а он на 42М Или с ним еще и своя оболочка идет?
нет её
G>Правильно ли я понял, что можно попеременно компилить то им, то MS-овским?
да, есть утилита для выбора компилятора — переключение мгновенное
G>Много ли проблем со сборкой проектов (совместимось)? Как-то пробовал lcc, так тот в упор не признавал VC-шные ресурсы...
проблем нет — ещё не одной не видет. только вот коды ошибоки предупреждений — другие. и поддержка C99 полная — наличие 64 битных целочисленных переменных и пр.
В общем, всё лучшее познаётся в сравнение
Re[3]: Менять float на int?
От: sluge  
Дата: 30.01.02 13:50
Оценка:
Здравствуйте Gosha, Вы писали:

G>Здравствуйте VuDZ, Вы писали:


VDZ>>Здравствуйте Gosha, Вы писали:


G>>>Привет Всем!!!


VDZ>>Для эитх целей был придуман intel C++ Compiler

VDZ>>MS cl /Og /Os /G6 = 1.212 (float = 12888)
VDZ>>icl /Og /Os /G7 /QaxiMKW /QIfist /Qprec /Qprec_div 1.657 (float ~ 10500)

VDZ>>Athlon 1000/133


VDZ>>так что при использование icl скорость выростает значительно...


VDZ>>ЗЫ а может этот код оптимизировать под MMX, SSE, 3DNow! ?

G>Я бы рад, но в АСМе (почти) нечего не смыслю . Хотя, наверное, придется потом и туда долезть . Но насколько я понял оптимизировать работу с целыми это не тоже самое, что работать с плавающей запятой. Поэтому и спросил нужно ли менять. Типа: сначала на целых выиграть, а потом еще и на асм перевести. Или Вы имели ввиду под оптимизацией игры с компилятором?
G>По поводу Intel C++ Compiler (5.0 ?). Действительно вещь хорошая? Я тут зашел на их сайт, там вроде написано, что работа с ним ведется через IDE от VC 6.0. Интересно, тогда зачем такая инсталляция толстая? Хотел trial скачать, а он на 42М Или с ним еще и своя оболочка идет? Правильно ли я понял, что можно попеременно компилить то им, то MS-овским? Много ли проблем со сборкой проектов (совместимось)? Как-то пробовал lcc, так тот в упор не признавал VC-шные ресурсы...

Вещь хорошая но медленная, но полезно им иногда собирать т.к. в нем есть такие предупреждения каких нет в M$!
Re[4]: Менять float на int?
От: Рек Россия  
Дата: 03.02.02 14:22
Оценка:
Здравствуйте VuDZ, Вы писали:

G>>По поводу Intel C++ Compiler (5.0 ?). Действительно вещь хорошая?

VDZ>Великолепная по многим причинам, только вот компилит медленно

Ага. Точно великолепная!
Я тоже перекомпилил свою програмулину под icl
и сразу получил выигрыш в скорости на 20% !!

Заплатить пришлось размером ехешника (он стал процентов на 25 больше)
и медленной компиляцией (очень, в разы).

Непонятные ворнинги — это пустяки.
Размер — это не страшно совсем.
А скорость — так верь сборка релиз-версии не терпит суеты...

Так что думаю, что если это вся плата(?), то игра стоит свеч.

Только, вот вопрос... а это действительно вся плата?
Re: Менять float на int?
От: RA/ET Россия ra-excess.narod.ru
Дата: 03.02.02 18:26
Оценка:
Здравствуйте Gosha, Вы писали:

G>Привет Всем!!!


G>У меня есть одна задачка, в которой приходится иметь дело с большим количество массивов float-ов (к тому же не слабых по размерам). Данные в этих массивах перемножаются, деляться, ... большое количесто раз. Все это считается очень долго (от 20мин. и более на P3 700). Вообщем все большое Вот и задумался я, а не быстрее ли будет перевести все это в целые числа ? Операции с целыми идут ведь быстрее. Чтобы оценить примерный рост производительности написал код, приведенный ниже. Полученный мною результат составил ~2.3 раза (int быстрее). Однако эта цифра сильно плавала в зависимости от типа оптимизации компилятора, причем не в пользу int-а. Собственно вопрос(ы): кто-нибудь исследовал этот вопрос, может прояснить ситуацию, стоит ли менять float на int и на какие цифры (прирост производительности) можно расчитывать? Может сам код не годится для такого исследования, и если так, то как его исправить? С компилятором может какие-нибудь хитрости есть?


Я понятия не имею как все обстоит на самом деле но я бы сделал такое предположение... Тормоза начинаются когда используется мат. процессор... А если число целое и допустим влезает в разрядность регистра... то ее уже можно считать на проце без мата Вот вроде и все... а правильно это или нету... не могу сказать точно этотолько лишь предположение
Re[5]: Менять float на int?
От: VuDZ Россия  
Дата: 04.02.02 18:17
Оценка:
Здравствуйте Рек, Вы писали:

Рек>Здравствуйте VuDZ, Вы писали:


G>>>По поводу Intel C++ Compiler (5.0 ?). Действительно вещь хорошая?

VDZ>>Великолепная по многим причинам, только вот компилит медленно

Рек>Ага. Точно великолепная!

Рек>Я тоже перекомпилил свою програмулину под icl
Рек>и сразу получил выигрыш в скорости на 20% !!

Рек>Заплатить пришлось размером ехешника (он стал процентов на 25 больше)

Рек>и медленной компиляцией (очень, в разы).

Рек>Непонятные ворнинги — это пустяки.

Они более информативны
Рек>Размер — это не страшно совсем.
Больший размер из-за большего размера ассемблерного кода
Рек>А скорость — так верь сборка релиз-версии не терпит суеты...

Рек>Так что думаю, что если это вся плата(?), то игра стоит свеч.

есть 2 трудности:
1. более строгое следование стандарту — м.б. проблема с "кривыми исходниками"
2. сложно по нормальному вставить 3dNow!

Рек>Только, вот вопрос... а это действительно вся плата?

Вроде вся... А можешь доплатить больше?
Re[2]: Менять float на int?
От: VuDZ Россия  
Дата: 06.02.02 07:11
Оценка:
Здравствуйте RA/ET, Вы писали:

RA/ET>Я понятия не имею как все обстоит на самом деле но я бы сделал такое предположение... Тормоза начинаются когда используется мат. процессор
Ну, это было истинной в эпоху х87, когда сопроцессор был маленьким и слабеньким
>... А если число целое и допустим влезает в разрядность регистра... то ее уже можно считать на проце без мата
да, вот только регистров мало >:
>Вот вроде и все... а правильно это или нету... не могу сказать точно этотолько лишь предположение

в общем — SSE или 3DNow! были для этого и придуманы...
Re[6]: Менять float на int?
От: Рек Россия  
Дата: 06.02.02 13:42
Оценка:
Здравствуйте VuDZ, Вы писали:

VDZ>Здравствуйте Рек, Вы писали:


Рек>>Здравствуйте VuDZ, Вы писали:


G>>>>По поводу Intel C++ Compiler (5.0 ?). Действительно вещь хорошая?

VDZ>>>Великолепная по многим причинам, только вот компилит медленно

Рек>>Ага. Точно великолепная!

Рек>>Я тоже перекомпилил свою програмулину под icl

Рек>>Непонятные ворнинги — это пустяки.

VDZ>Они более информативны

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

Так что мнение только укрепилось: icl =
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.