Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проблемы с определением скорости работы, timeGetTime и asm вставка rdtsc 
V
    Опции темы
Kuvaldis
Дата 23.7.2007, 23:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


механик-вредитель
***


Профиль
Группа: Участник Клуба
Сообщений: 1189
Регистрация: 16.6.2006
Где: Минск

Репутация: нет
Всего: 61



Всем доброго времени суток
Есть проект, в котором тестится время работы блока: вычисление суммы эл-тов массива, а также скорость доступа в зависимости от доступа через индекс или через указатель
Проблема в том, что работает не всегда корректно: через раз, через 2 выводятся нули, хотя этого быть НЕ ДОЛЖНО. Я не совсем врубаюсь, где я не прав. У меня VS 2005 
Вот функция окна:
Код

// по клику считаем время вычисления суммы массива MATRIX_SIZE x MATRIX_SIZE

int    matr[MATRIX_SIZE][MATRIX_SIZE];

LRESULT APIENTRY WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{    
    DWORD    time, time1, count, count1;
    double   result, result1;
    int         sum;
    char     buf[120] = { 0 };
    int        i, k;

    switch ( msg )
    {
        case WM_DESTROY:                
            PostQuitMessage( 0 );
            return 0;

        case WM_LBUTTONUP:            // считаем индексную адресацию через timeGetTime() 
            // инициализация, чтобы забить кеш-память
            for( int i = 0; i < MATRIX_SIZE; i++ )
            {
                for( int k = 0; k < MATRIX_SIZE; k++ )
                {
                    matr[i][k] = i * k;
                }
            }
            count = 0;
            sum = 0;
            time1 = timeGetTime();

            // основной цикл    
            while ( ( ( time = timeGetTime() ) - time1 ) < REP_COUNT )
            {
                count++;        // считаем повторения
                for( i = 0; i < MATRIX_SIZE; i++ )
                {
                    for( k = 0; k < MATRIX_SIZE; k++ )
                    {
                        sum += matr[i][k];
                    }
                }
            }
            result = 1000.0 * REP_COUNT / count;        // получить время в микросекундах

            // считаем временные издержки на каждой итерации
            count1 = count;
            time1 = timeGetTime();
            while ( ( ( time = timeGetTime() ) - time1 ) < REP_COUNT )
            {
                if ( ! (-- count1) )
                    break;                
            }            
            result1 = 1000.0 * (time - time1) / count;    // издержки в микросекундах на накладные расходы    
            sprintf( buf, "Накладные затраты %0.12lf мкс \n Время %0.12lf мкс",  result1, result - result1 );

            MessageBox( hwnd, buf, MY_WINDOW_NAME,  MB_OK | MB_ICONINFORMATION );
            break;


        case WM_RBUTTONUP:        // сравнить время доступа через индекс и через указатель
            // инициализация, чтобы забить кеш-память
            for( i = 0; i < MATRIX_SIZE; i++ )
            {
                for( k = 0; k < MATRIX_SIZE; k++ )
                {
                    matr[i][k] = i * k;
                }
            }
            count = 0;
            sum = 0;            
            time1 = HightTime();

            for( i = 0; i < MATRIX_SIZE; i++ )        // основной цикл
            {
                for( k = 0; k < MATRIX_SIZE; k++ )
                {
                    sum += matr[i][k];
                }
            }
            time = HightTime();
            result = time - time1 - SpeedCPU.over;        // получить время в микросекундах

            sum = 0;
            int* p = & matr[0][0];
            time1 = HightTime();

            for( i = 0; i < MATRIX_SIZE; i++ )
            {
                for( k = 0; k < MATRIX_SIZE; k++ )
                {
                    sum += *p++;
                }
            }
            time = HightTime();
            result1 = time - time1 - SpeedCPU.over;        // получить время в микросекундах
            sprintf( buf, " Накладные затраты %d тактов \n Время доступа через индекс %0.12lf\n Время доступа через указатель %0.12lf",  
                SpeedCPU.over , result / SpeedCPU.speed, result1 / SpeedCPU.speed );

            MessageBox( hwnd, buf, MY_WINDOW_NAME,  MB_OK | MB_ICONINFORMATION );
            break;        
    }
    return DefWindowProc( hwnd, msg, wParam, lParam );
}
//----------------------------------------------------------------------------------------------------------------------

Причем такие приколы с Release версией
С debug тоже есть прикол (хотя и не критичный) : в данном случае доступ через индеск получается быстрее (должно быть наоборот)
Прикрепляю проект и хотел бы услышать конструктивную критику по теме.

СУВ, Kuvaldis 

Это сообщение отредактировал(а) Kuvaldis - 24.7.2007, 22:04

Присоединённый файл ( Кол-во скачиваний: 4 )
Присоединённый файл  RdTSC.zip 3,14 Kb


--------------------
Помни - когда ты спишь, враг не дремлет
Спи чаще и дольше, изматывай врага бессоницей
PM MAIL ICQ   Вверх
dumb
Дата 24.7.2007, 01:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


Профиль
Группа: Экс. модератор
Сообщений: 2929
Регистрация: 16.6.2006

Репутация: 27
Всего: 158



Код

                if ( ! (-- count1) )

вместо этого надо делать декремент dword'а в цикле в течение 1 миллисекунды, смотреть сколько "нащелкало" и потом соотносить это с твоим count1. ибо несколько десятков таких итераций врядли выйдут за пределы миллисекунды.

первое, что попалось на глаза - очепятка: HightTime... smile
ну а основной косяк - округление 64х-битного результата rdtsc до dword'а: DWORD time = HightTime(); а младший dword довольно интенсивно "колбасит" через 0.
PM MAIL   Вверх
Kuvaldis
Дата 24.7.2007, 22:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


механик-вредитель
***


Профиль
Группа: Участник Клуба
Сообщений: 1189
Регистрация: 16.6.2006
Где: Минск

Репутация: нет
Всего: 61



dumb
Спасибо за помощь и толковые советы. Это помогло (поэтому репой по фейсу smile 0
Но оставались несуразные цифры в вычислениях: т.е. вычисление контрольного участка по времени было соизмеримо с накладными затратами.
Путем долгих мучений это было вылечено настройками оптимизации:
1. Оптимизация была просто отключена
2. Взведен флаг Inline Function Expansion в Any Suitable



--------------------
Помни - когда ты спишь, враг не дремлет
Спи чаще и дольше, изматывай врага бессоницей
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

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


 




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


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

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