Модераторы: bsa

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> msvc2008 bug??? 
:(
    Опции темы
GoldFinch
Дата 8.12.2008, 23:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: 6
Всего: 26



J0ker, эти строчки - nop. они ничего не делают. И таких строчек в том коде много. Вы вообще смотрели тот код который выложили? Да там оптимизацией и не пахнет.

Добавлено через 6 минут
По оптимизации - вот это вот
004016DE  push        ecx  
004016DF  fld         dword ptr [esp+38h] 
004016E3  fstp        dword ptr [esp] 
004016E6  call        00401650 
заменяется на
push dword ptr [esp+38h]  
call 00401650
и т.д. и т.п.

не верите? проверьте в ольке 

PM MAIL ICQ   Вверх
J0ker
Дата 8.12.2008, 23:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 986
Регистрация: 17.9.2008

Репутация: 9
Всего: 14



Цитата(GoldFinch @  8.12.2008,  23:09 Найти цитируемый пост)
J0ker, эти строчки - nop. они ничего не делают.

да неужели?
а давайте проверим - вот конкретно эти строчки
Код

// здесь ST0 = +7.5899997329711936e+0000
00401658  fstp        dword ptr [esp+4] 
0040165C  fld         dword ptr [esp+4]
// а здесь ST0 = +7.5899996757507324e+0000

вы мысль улавливаете, да?  smile

Добавлено через 1 минуту и 32 секунды
Цитата(GoldFinch @  8.12.2008,  23:09 Найти цитируемый пост)
По оптимизации - вот это вот
004016DE  push        ecx  
004016DF  fld         dword ptr [esp+38h] 
004016E3  fstp        dword ptr [esp] 
004016E6  call        00401650 
заменяется на
push dword ptr [esp+38h]  
call 00401650
и т.д. и т.п.

не верите? проверьте в ольке 

только если нет преобразования типов
ага  smile 


--------------------
user posted image
PM MAIL   Вверх
GoldFinch
Дата 8.12.2008, 23:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: 6
Всего: 26



J0ker, уловил. Только в чем смысл округления 80-разрядного значения в стеке сопроцессора до 32-разрядного? Я чтото не представляю себе жизненных случаев где это может пригодиться.

Добавлено @ 23:33
мм... развечто при сравнении... так тогда и надо округлять перед сравнением, а не всегда и везде, иначе какая это оптимизация %)


так или иначе, разговор начался с копирования float в стек, *уже округленного* float в стек.

Это сообщение отредактировал(а) GoldFinch - 8.12.2008, 23:35
PM MAIL ICQ   Вверх
J0ker
Дата 8.12.2008, 23:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 986
Регистрация: 17.9.2008

Репутация: 9
Всего: 14



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

Добавлено через 10 минут
Цитата(GoldFinch @  8.12.2008,  23:30 Найти цитируемый пост)
так или иначе, разговор начался с копирования float в стек, *уже округленного* float в стек.

это вы знаете, что у вас там float, а процессору это нужно доказать  smile 


--------------------
user posted image
PM MAIL   Вверх
GoldFinch
Дата 8.12.2008, 23:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: 6
Всего: 26



Цитата(J0ker @  8.12.2008,  23:36 Найти цитируемый пост)
в том, что вы не можете просто так отрезать лишние биты при трансфере чисел с плавающей точкой

Так я и не понял с этими отрезаниями.....
У меня в памяти есть 32-разрядный float. Готовый, правильный, безо всяких подвохов float. Почему компилятор не копирует его в стек командой push [mem32], а генерит fld [mem32] / fstp [mem32] ?? В стеке же оказывается одно и тоже значение...
Цитата(J0ker @  8.12.2008,  23:36 Найти цитируемый пост)

я совершенно согласен, что можно, и даже иногда нужно оптимизировать вычисления на FPU на ассемблере, т.к. стандартные типы пока не вмещают полноразмерные числа с ПТ

кто невмещает? в С++ нет 10-байтового вещественного чтоли?

Добавлено через 2 минуты и 56 секунд
действительно нет.... везде есть, а в С++ нет.... как же так %)
PM MAIL ICQ   Вверх
J0ker
Дата 8.12.2008, 23:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 986
Регистрация: 17.9.2008

Репутация: 9
Всего: 14



c'est la vie



--------------------
user posted image
PM MAIL   Вверх
GoldFinch
Дата 8.12.2008, 23:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: 6
Всего: 26



Цитата(J0ker @  8.12.2008,  23:36 Найти цитируемый пост)
это вы знаете, что у вас там float, а процессору это нужно доказать 

что доказать????
004016DE  push        ecx  ; sub esp,SizeOf(dword)
004016DF  fld         dword ptr [esp+38h] 
004016E3  fstp        dword ptr [esp] 
004016E6  call        00401650 
float и dword это одно и то же, что тут доказывать процессору?
PM MAIL ICQ   Вверх
J0ker
Дата 9.12.2008, 00:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 986
Регистрация: 17.9.2008

Репутация: 9
Всего: 14



опа, вот и я не прав
long double в стандарте оказывается... проморгал smile

Добавлено через 2 минуты и 34 секунды
Цитата(GoldFinch @  8.12.2008,  23:53 Найти цитируемый пост)
004016DF  fld         dword ptr [esp+38h] 
004016E3  fstp        dword ptr [esp] 
004016E6  call        00401650 
float и dword это одно и то же, что тут доказывать процессору? 

я ж вам уже сказал - что у вас там лежит в памяти известно только вам


--------------------
user posted image
PM MAIL   Вверх
Kallikanzarid
Дата 9.12.2008, 00:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 240
Регистрация: 9.11.2008

Репутация: 2
Всего: 3



Итак, it's a showdown!!!

Алгоритм - интегрирование методом трапеций. Интегрируется косинус, при этом специально не используется его свойство периодичности. В общем, смотри код:
Код

#include <cstdlib>
#include <cmath>
#include <iostream>
using namespace std;

const float pi = static_cast<float>( M_PI );

float cosint( float a, float b, int N ) {
    float sum = 0.0f;
    float h = (b - a) / N;
    for( float cur = a + h; cur < b; cur += h )
        sum += cos( cur );
    return ( sum + ( cos(a) + cos(b) ) * 0.5f ) * h;
}

int main() {
    clock_t before = clock();
    float result = cosint( 0.0f, 1000.0f * pi, 10000000 );
    clock_t after = clock();
    
    cout << result << " -- " << (after - before) / 1000.0 << " seconds." << endl;
}



Код, кстати, кроссплатформенней некуда. Компилировал с помощью MinGW со следующими параметрами=:

g++ -msse3 -mfancy-math-387 -m80387 -mhard-float -mtune=pentium4 -march=pentium4 -mthreads -mfp-ret-in-387 -mieee-fp -O3 -funroll-loops  -o showdown.exe showdown.cpp

После этого прогнал через strip:
strip -s showdown.exe

Прикладываю экзешник. Удачи, чувак  smile 

Присоединённый файл ( Кол-во скачиваний: 7 )
Присоединённый файл  showdown.rar 89,97 Kb
PM MAIL   Вверх
GoldFinch
Дата 9.12.2008, 14:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: 6
Всего: 26



Kallikanzarid, ты бы перед тем как выкладывать код с бинарником, убедился бы в их качестве
код - неудобный, хз как у вас а меня еще в школе учили в конце консольной программы вставлять паузу.
функция - неоптимизирована, про использование for я вообще промолчу... 

а самое главное, в бинарнике видно что компилятор заинлайнил cosint() и заменил ее аргументы константами.
получилось както так:
Код

    clock_t before = clock();
    float sum = 0.0f;
    float h = 1000.0f * pi / 10000000;
    for( float cur = h; cur < 1000.0f * pi; cur += h )
        sum += cos( cur );
    result =  ( sum + cos(1000.0f * pi) * 0.5f ) * h;
    clock_t after = clock();

так и было задумано?) а что сразу так не написал?)))
PM MAIL ICQ   Вверх
Kallikanzarid
Дата 9.12.2008, 15:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 240
Регистрация: 9.11.2008

Репутация: 2
Всего: 3



GoldFinch,

1) За годы практики я убедился, встроенная в саму программу пауза - это зло. Намного лучше создавать для этой цели .bat-файл.
2) Я специально ничего не оптимизировал, чтобы функция выполнялась достаточно долго, и чтобы компилятор мог проявить себя в раскрутке циклов и т. д.
3) for и правда не самый оптимальный (и, к тому же, накапливающий погрешность), но мы ведь спорили об оптимизации FPU-кода, так? Вот я и стараюсь загрузить его по максимуму.
4) Инлайн есть гут smile Оптимизирующий компилятор ведь должен оптимизировать, так? Но в любом случае я сомневаюсь, что один дополнительный вызов бы сделал погоду.
5) Да, так и было задумано smile

Добавлено через 3 минуты и 8 секунд
float вместо double я тоже использовал в своих корыстных целях, дабы векторизация дала прирост x4, а не x2. Хотя этот алгоритм не особенно хорош для SSE, так что, может быть, код там использует только FPU. Хз, я через BIEW не прогонял.
PM MAIL   Вверх
GoldFinch
Дата 9.12.2008, 17:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: 6
Всего: 26



Решение "в лоб", без FPU-оптимизации, бинарник (2кб) в архиве
Код

include 'win32a.inc'
include 'hll.inc'
format PE GUI 4.0
;=====================================================
section '.data' data readable writeable
;------------------------
IMPORTS KERNEL32.DLL, <ExitProcess,GetTickCount,Sleep>,\
        USER32.DLL,   <wsprintfA,MessageBoxA>
;------------------------
m dd 100000000 ;8digits=32/4
gRealBuf: dt ?
gMsgBuf db 1024 dup ?
;=====================================================
section '.code' code readable executable
entry $
; float result = cosint( 0.0f, 1000.0f * pi, 10000000 );
      GetTickCount()
      push eax
;A=0
;B=1000.0f * pi
      ;-----------------------------------------------------
      jmp @f
      b_pi dd 1e+3 ;b/pi
      h_pi dd 1e-4 ;h/pi=(b/pi)/N
      _0.5 dd 0.5
@@:
      fldpi ;pi
      fmul [h_pi] ;h

      fldpi ;pi,h
      fmul [b_pi] ;b,h
      fcos ;cos(b),h
      fmul [_0.5] ;sum,h

      fld st1 ;cur,sum,h
      mov ecx,10000000
      dec ecx ;N-1
.loo:               ;cur,sum,h
      fld st0       ;cur,cur,sum,h
      fcos          ;cos(cur),cur,sum,h
      faddp st2,st0 ;cur,sum',h
      fadd st0,st2  ;cur',sum',h
      loop .loo
      fxch st2      ;h,sum,cur
      fmul st0,st1  ;result
      ;-----------------------------------------------------
      GetTickCount()
      pop edx
      sub eax,edx
      fimul [m]
      fbstp tword [gRealBuf]
      wsprintfA(gMsgBuf,"Result = %x.%08x, Time = %dms",[gRealBuf+4],[gRealBuf],eax)
      MessageBoxA(0,gMsgBuf,"Result",0)
      ExitProcess()
;=====================================================
section '.reloc' fixups data discardable


на моем компе код Kallikanzarid'а работает 704мс, мой код работает 563мс, 20% разница
P4 3ГГц, WinXPSp2

Это сообщение отредактировал(а) GoldFinch - 9.12.2008, 17:14

Присоединённый файл ( Кол-во скачиваний: 5 )
Присоединённый файл  response.rar 2,30 Kb
PM MAIL ICQ   Вверх
Kallikanzarid
Дата 9.12.2008, 18:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 240
Регистрация: 9.11.2008

Репутация: 2
Всего: 3



Хорошо... но недостаточно!
Я немного подправил код, сделав цикл целочисленным. Это скостило совсем немного, зато точность возрасла до твоей. Зато потом я дорвался до документации GCC, хехе. В общем, качай.

Присоединённый файл ( Кол-во скачиваний: 4 )
Присоединённый файл  showdown.rar 91,33 Kb
PM MAIL   Вверх
J0ker
Дата 9.12.2008, 19:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 986
Регистрация: 17.9.2008

Репутация: 9
Всего: 14



Kallikanzarid, я те советую воспользоваться OpenMP
и пусть GoldFinch, попробует угнаться  smile 


--------------------
user posted image
PM MAIL   Вверх
GoldFinch
Дата 9.12.2008, 19:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: 6
Всего: 26



Kallikanzarid, осталось время измерять не +-10%
какбэ clock() вызывает GetSystemTimeAsFileTime, а это очень плохой метод измерения, да и увеличивать время измерения увеличивая время работы тестируемого алгоритма не самый лучший подход

кстати, что это у тя прога весит 275кб и требует несистемную дллку msvcrt.dll? а зачем у тя в архиве дллка mingwm10.dll, для весу?

ЗЫ: между прочим, мы начинали разговор именно о MSVC

Это сообщение отредактировал(а) GoldFinch - 9.12.2008, 19:38
PM MAIL ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

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


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0635 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.