> man operating_systems
Центр информации по операционным системам :: Форумы :: Программирование :: Инструментарий
 
<< Предыдущая тема | Следующая тема >>
inline asm в GCC (i686)... оч.косвенная адресация..
Переход на страницу  1 [2]
Модераторы: Roman I Khimov, Wanderer, Dron
Автор Добавил
vv40in
Пятница 24.04.2009 10:31
ID пользователя #1076
Зарегистрирован: Суббота 07.06.2008 12:10
Сообщений: 62
какой алгоритм ??? теперь речь не об алгоритме, а о работе FreeBSD.
я написал тест на С и скомпилял его на MSVC. посмотрел его дисасм и реализовал его один к одному в gcc (inline asm). В WinXP тест реботает 15 сек, а в FreeBSD 20 сек!!!!!!!!!!!
вот исходники:


// тест скорости в зависимости от объема памяти

#if defined(_MSC_VER) || defined(_WIN32) || defined(WIN32)
#include <Windows.h>
#endif

#include <errno.h>
#include <stdlib.h> 
#include <stdio.h> 
#include <memory.h>
#include <ctype.h>
#include <locale.h>
#include <signal.h>
#include <time.h>

#if defined(__CYGWIN__) // !defined(_MSC_VER) 
#include <basetyps.h>
#elif !defined(_MSC_VER)
#include <stdint.h>
#endif

typedef unsigned long  u32;

#ifdef _MSC_VER
typedef unsigned __int64 u64;
#else
typedef uint64_t u64;
#endif

u64 overclock()
{
#ifndef _MSC_VER
    clock_t t2, t1 = clock();
    do {
        t2 = clock();
    } while (t1 == t2);
    return  t2;
#else
#if 0
    return GetTickCount();
#else
    //u32 c=0;
    FILETIME t1,t2;
    GetSystemTimeAsFileTime(&t1);
    do {
        GetSystemTimeAsFileTime(&t2);
        //c++;
    } while (t1.dwLowDateTime == t2.dwLowDateTime);
    //fprintf(stderr,"c=%u t: 0x%X 0x%X dt: %u\n", c, t1.dwLowDateTime, t2.dwLowDateTime, (t2.dwLowDateTime-t1.dwLowDateTime));fflush(stderr);
    return (((u64)(t2.dwHighDateTime)) << 32) + t2.dwLowDateTime;
#endif
#endif
}

u64  myclock()
{
#ifndef _MSC_VER
    return clock();
#else
#if 0
    return GetTickCount();
#else
    FILETIME t;
    GetSystemTimeAsFileTime(&t);
    return (((u64)(t.dwHighDateTime)) << 32) + t.dwLowDateTime;
#endif
#endif
}

void print_dtime(const char* s, u64* t1, u64* t2)
{
#ifdef _MSC_VER
    double dt = ((double)(__int64)(*t2-*t1)) / 10000.0;
    fprintf(stderr, "%s%I64u = %f ms\n", s, (*t2-*t1), dt);
#else
    double dt = ((double)(*(clock_t*)(t2) - *(clock_t*)(t1))) ;/// 10000.0;
    fprintf(stderr, "%s%f ms \n", s, dt*10);
#endif
    fflush(stderr);
}

//#include "getopt.h"
//#include "thetypes.h"

volatile unsigned int buf[0x10000];
#define  _MAX_CNT ((1<<17 )-1)

#define _DNOP3   "nop;nop;nop\n\t"

int test()
{
    u32 i=0,j=0;
    u64 t1,t2;
    printf("start\n");
    t1 = overclock();
#ifdef __FREEBSD__
    //gccalign8;
    __asm__ __volatile__( 
        "nop;nop; \n" /* для выравнивания на 16 байт, как в MSVC. подбирал вручную */
        "xorl         %%edi,%%edi \n\t"
        "jmp          30f \n"
        "nop;nop;nop;nop; \n" /* для выравнивания на 16 байт. */
        "nop;nop;nop;nop; \n"
        "nop;nop;nop;nop; \n"
        "\n30:\n\t" /*L_start_prep*/
        "xorl         %%esi,%%esi \n\t"
        "jmp          1f \n"
        "1: \n\t" 
        "leal         (%%esi,%%edi), %%ecx \n\t"
        "andl         $0x0FFFF, %%ecx \n\t"
        "movl         %%esi, (%%edx,%%ecx,4) \n\t"
        "addl         $1, %%esi \n\t"
        "cmpl        $0x1FFFF, %%esi \n\t"
        "jb          1b \n\t " 
        "add         $1, %%edi \n\t" 
        "cmpl        $0x1FFFF, %%edi \n\t"
        "jb          30b \n\t " 
    :
    : "d"(buf)
    :"esi","edi"
    );

#else
    for (i=0; i<_MAX_CNT; ++i)
    {
        for (j=0; j<_MAX_CNT; ++j)
        {
            //buf[(i+j)&(0x10000-1)] = j;
            buf[(i+j)&(0x10-1)] = j;
        }
    }
    /*
    это дисасм
    00401055  xor         edi,edi 
    00401057  jmp         test+60h (401060h) 
    00401059  lea         esp,[esp] 
        94:     {
        95:         for (j=0; j<_MAX_CNT; ++j)
    00401060  xor         esi,esi   ;;;выравнено на 16 байт
    00401062  jmp         test+70h (401070h) 
                    ...  ;хлам-заполнитель для выравнивания на 16 байт
        96:         {
        97:             buf[(i+j)&(0x10000-1)] = j;
    00401070  lea         ecx,[esi+edi] ;;;выравнено на 16 байт
    00401073  and         ecx,0FFFFh 
    00401079  mov         dword ptr _buf (4033A0h)[ecx*4],esi 
    00401080  add         esi,1 
    00401083  cmp         esi,1FFFFh 
    00401089  jb          test+70h (401070h) 
    0040108B  add         edi,1 
    0040108E  cmp         edi,1FFFFh 
    00401094  jb          test+60h (401060h) 
    */
#endif
    t2 = myclock();
    print_dtime("finish ", &t1, &t2);
    printf("finish i,j (%u,%u)\n",i,j);
    return 0;
}

int main(int argc, char* argv[])
{
    test();
    return 0;
}


щас еще на Linux попробую запустить. найти бы здесь Linux...
:`( полная задница :`(
Наверх
vv40in
Пятница 24.04.2009 13:06
ID пользователя #1076
Зарегистрирован: Суббота 07.06.2008 12:10
Сообщений: 62
ХА-ХА-ХА-ХА-ХА-ХА-ХА-ХА-ХА-ХА-ХА-ХА-ХА-ХА-ХА-ХА!!!!
Linux выполняет тот же код, и не важно - inline asm или просто С-код за столько же, за сколько WinXP, т.е. быстрее, чем FreeBSD на 25% !!!!!!!!!!!!!!!!!
кто может объяснить? может FreeBSD постоянно прерывает процесс, переключая контексты? зачем? у меня i7 c 6(!!!) ядрами!!! на ядре с тестом ничего больше не работает.
Может какие-н. ключи компиляции ядра (не)надо вкючать?
Наверх
ossadchy
Пятница 24.04.2009 16:18
ID пользователя #941
Зарегистрирован: Среда 10.10.2007 22:55
Местонахождение: Украина, Николаевская обл., г. Первомайск
Сообщений: 181
А как отрабатывает в разных системах код сгенерированный просто компилятором(можно, думаю, попробовать и MinGW собрать под Win).
Тесты производятся на разных машинах?
Наверх
Сайт
Dron
Понедельник 27.04.2009 11:34


ID пользователя #13
Зарегистрирован: Понедельник 05.07.2004 11:16
Местонахождение: Москва
Сообщений: 651
Возможно, это связано с архитектурой менеджера памяти.
Перед тестом проинициализируй всю используемую память.
Порой в сторону prefetch, возможно, что разница нивелируется.

Кстати мне так до конца не понятно что ты тестируешь.
Ты не мог бы не морочить нам голову оптимизацией, а просто написать на си, чего ты хочешь. (тем более что асм ниче не дает.

Вообще какая практическая польза от бенчмарков памяти? ну окромя сравнения двух версий одного ядра.

[ Редактирование Понедельник 27.04.2009 11:41 ]

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

Андрей Валяев
Наверх
Сайт
vv40in
Понедельник 27.04.2009 11:45
ID пользователя #1076
Зарегистрирован: Суббота 07.06.2008 12:10
Сообщений: 62
я нашел у себя ошибку. неверно измерял время
извините за потраченное вами время. всем спасибо.
Наверх
Dron
Понедельник 27.04.2009 21:38


ID пользователя #13
Зарегистрирован: Понедельник 05.07.2004 11:16
Местонахождение: Москва
Сообщений: 651
Нет, ты погоди... ты на вопросы отвечай...

Какой смысл в бенчмарках???

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

Андрей Валяев
Наверх
Сайт
WiseMan
Пятница 01.05.2009 23:24
ID пользователя #703
Зарегистрирован: Среда 19.07.2006 02:08
Местонахождение: Kyiv, Ukraine
Сообщений: 2
Как я понял, у парня критично время. Прерывание или что-то realtime'овое. Если так, то нужно таки-да замерять какие инструкции будут быстрее.

UPD
Еще раз покурил весь топик. Присоединяюсь к вопросу о маниакальном стремлении все в 1 инструкцию впихнуть. Мб x86-64? Там регистров достаточно

[ Редактирование Пятница 01.05.2009 23:36 ]
Наверх
Chizh
Среда 19.08.2009 17:52
ID пользователя #90
Зарегистрирован: Понедельник 13.09.2004 18:42
Сообщений: 170
Просто у Intel Pentium нет способа адресации "указатель на указатель", поэтому адрес нужно сначала извлекать из стека, а уж потом использовать. Для начала надо было ассемблер изучить.
Наверх
Сайт
Переход на страницу  1 [2]  

Перейти:     Наверх

Транслировать сообщения этой темы: rss 0.92 Транслировать сообщения этой темы: rss 2.0 Транслировать сообщения этой темы: RDF
Powered by e107 Forum System

© OSRC.info, 2004-2010.
Авторские права на любые материалы, авторы которых явно указаны, принадлежат их авторам. По вопросам публикации таких материалов обращайтесь к авторам.
Авторские права на любые другие материалы принадлежат OSRC.info.
Сайт является помещением библиотеки. Копирование, сохранение на жестком диске или иной способ сохранения произведений осуществляются пользователями на свой риск.
При использовании материалов сайта ссылка на OSRC.info обязательна.