Часовой пояс: UTC + 3 часа




Начать новую тему Новая тема / Ответить на тему Ответить  Сообщений: 641 • Страница 17 из 33<  1 ... 14  15  16  17  18  19  20 ... 33  >
  Пред. тема | След. тема 
В случае проблем с отображением форума, отключите блокировщик рекламы
Автор Сообщение
 

Member
Статус: Не в сети
Регистрация: 01.04.2005
Откуда: Москва-Лубянка
L.A.W. Я к тому, что он в курсе, каким способом CPU Informer получает инфу, ему догадываться не надо…

_________________
AnossovPavel в проекте F@H (TSC!Russia)
退屈な祖父 ¤ παππούς ¤ («клан дедов»)



Партнер
 

Member
Статус: Не в сети
Регистрация: 14.01.2004
Откуда: Киев, Украина
Anoss детект этих моделей был разработан еще до моего участия.
L.A.W. я просто прекрасно знаю, как он работает, и что кроме cpuid инструкции, не использует других методов для детекта процессоров.
Вообщем решил я открыть Intel Processor Identification and the CPUID Instruction. Там есть следующие строки:
Цитата:
The Intel486 family and subsequent Intel processors provide a straightforward method for determining whether the processor's internal architecture is able to execute the CPUID instruction.

_________________
Ку ку


 

Member
Статус: Не в сети
Регистрация: 13.08.2005
Daemon писал(а):
Вообщем решил я открыть Intel Processor Identification and the CPUID Instruction. Там есть следующие строки:

Хм... Я вроде в нем же и видел инфу о том, что CPUID они не держат... Странно, но ладно!

_________________
I L.A.W. you, baby!
For a GNU dawn! For freedom! :-)


 

Надо запрограммировать внешний АЦП. Что-то никак не въеду как это сделать


 

Member
Статус: Не в сети
Регистрация: 13.08.2005
Lusi писал(а):
то-то никак не въеду как это сделать

А как именно ты с ним работать собираешься?

_________________
I L.A.W. you, baby!
For a GNU dawn! For freedom! :-)


 

Member
Статус: Не в сети
Регистрация: 18.08.2005
Откуда: Новороссийск
Есть ли аналог инструкции C++ "%" в ассемблере?


 

Member
Статус: Не в сети
Регистрация: 01.04.2005
Откуда: Москва-Лубянка
-=alex-forewer=- После DIV в edx сохраняется остаток...

_________________
AnossovPavel в проекте F@H (TSC!Russia)
退屈な祖父 ¤ παππούς ¤ («клан дедов»)


 

Member
Статус: Не в сети
Регистрация: 18.08.2005
Откуда: Новороссийск
Anoss
Енто я знаю!!! Дело в том, что нам дали задание заполнить список простыми числами, я полагаесь на могущество ассемблера решил делить именно его инструкциями, а не C++, но ассемблерное деление для заполнения списка простыми числами из диапазона 100000 заняло больше времени чем оператор % в C++!!!
Т.е. почему этот код выполняется долше:
Код:
for (int i = 2; i < k; i++)
{
    __asm
    {
        mov EAX, num
        cdq
        div i
        cmp EDX, 0
        jne m
        mov primit, 1
        m:
    }
    if (primit) return false;
}

чем этот:
Код:
for (int i = 2; i < k; i++)
    if (num%i == 0) return false;

А вообще кто нибудь знает как ускорить этот код используя ассемблер:
Код:
//---------------------------------------------------------------------------
void __fastcall TPrimitiveNumbersForm::BtnFillClick(TObject *Sender)
{
    int num = 0;
    unsigned int i, X;

    if(Edit->Text.IsEmpty())
    {
        MessageDlg("Введите число!", mtInformation, TMsgDlgButtons() << mbOK, 0);
    }
    else
    {
        X = Edit->Text.ToInt();

        for(i = 1; i <= X; i++)
            if(Test(i) && i!=4)
                {
                    num++;
                    ListBox->Items->Add(IntToStr(num) + " : " + IntToStr(i));
                }
    }
}
//---------------------------------------------------------------------------
bool TPrimitiveNumbersForm::Test(unsigned int num)
{
        unsigned int i, k;

        asm mov EAX, num
        asm shr EAX, 1
        asm mov k, EAX

        for (int i = 2; i < k; i++)
                if (num%i == 0) return false;
        return true;
}
//---------------------------------------------------------------------------

этот код предназначен для заполнения списка (C++ Builder) простыми числами, сейчас на моей системе список с заданным числом 100000 (X = 100000) заполняется 3,25 секунд, я хочу быстрее!!!


Последний раз редактировалось -=alex-forewer=- 26.10.2006 0:56, всего редактировалось 1 раз.

 

Advanced member
Статус: Не в сети
Регистрация: 30.08.2003
Откуда: Санкт-Петербург
-=alex-forewer=-
Например, потому что div - очень медленная инструкция. Замените на что-нить более быстрое (варианты с shr/shl и пр.) и все запашет шустрее, а вообще на текущий момент времени компиляторы генерируют достаточно оптимальный код....

_________________
{:€ дед в законе :-) нородный окодемег
почетный пользователь OpenSuSE 11.3
Ремонт и модернизация ноутбуков IBM (Lenovo) ThinkPad


 

Member
Статус: Не в сети
Регистрация: 01.04.2005
Откуда: Москва-Лубянка
вот это
Код:
int main()
{
int num = 10000;
int k = 1000;
for (int i = 2; i < k; i++)
    if (num%i == 0) return false;
}

у меня копилируется билдером в
Код:
.text:00401200 ; int __cdecl main(int argc,const char **argv,const char *envp)
.text:00401200 _main           proc near               ; DATA XREF: .data:0040904Co
.text:00401200
.text:00401200 argc            = dword ptr  8
.text:00401200 argv            = dword ptr  0Ch
.text:00401200 envp            = dword ptr  10h
.text:00401200
.text:00401200                 push    ebp
.text:00401201                 mov     ebp, esp
.text:00401203                 push    ebx
.text:00401204                 push    esi
.text:00401205                 mov     ebx, 2710h
.text:0040120A                 mov     esi, 3E8h
.text:0040120F                 mov     ecx, 2
.text:00401214                 cmp     esi, ecx
.text:00401216                 jle     short loc_40122A
.text:00401218
.text:00401218 loc_401218:                             ; CODE XREF: _main+28j
.text:00401218                 mov     eax, ebx
.text:0040121A                 cdq
.text:0040121B                 idiv    ecx
.text:0040121D                 test    edx, edx
.text:0040121F                 jnz     short loc_401225
.text:00401221                 xor     eax, eax
.text:00401223                 jmp     short loc_40122C
.text:00401225 ; ---------------------------------------------------------------------------
.text:00401225
.text:00401225 loc_401225:                             ; CODE XREF: _main+1Fj
.text:00401225                 inc     ecx
.text:00401226                 cmp     esi, ecx
.text:00401228                 jg      short loc_401218
.text:0040122A
.text:0040122A loc_40122A:                             ; CODE XREF: _main+16j
.text:0040122A                 xor     eax, eax
.text:0040122C
.text:0040122C loc_40122C:                             ; CODE XREF: _main+23j
.text:0040122C                 pop     esi
.text:0040122D                 pop     ebx
.text:0040122E                 pop     ebp
.text:0040122F                 retn
.text:0040122F _main           endp

если тебе интересно :)
Добавлено спустя 39 секунд
и медленный idiv тут присутствует)
Добавлено спустя 1 минуту, 16 секунд
Надо было цикл делать тоже ассемблером, а то непонятно, что получается…

_________________
AnossovPavel в проекте F@H (TSC!Russia)
退屈な祖父 ¤ παππούς ¤ («клан дедов»)


 

Member
Статус: Не в сети
Регистрация: 18.08.2005
Откуда: Новороссийск
Root инструкции shr, shl делят и умножают только на степени двойки, а у меня призводится деление на все числа до заданного поделённое на два, то не подходит твой вариант!!! Если ты заметил то shr я уже использовал!!!

Думаю тут (исходя из дизассемблерного кода):
Код:
for (int i = 2; i < k; i++)
{
    __asm
    {
        mov EAX, num
        cdq
        div i
        cmp EDX, 0
        jne m
        mov primit, 1
        m:
    }
    if (primit) return false;
}

работу тормозит cmp EDX, 0 ведь test вроде быстрее работает!
Anoss писал(а):
и медленный idiv тут присутствует)

Ага, причём idiv, притом что знакового деления здесь никогда не будет!!!


 

Member
Статус: Не в сети
Регистрация: 13.08.2005
-=alex-forewer=- писал(а):
работу тормозит

А ты попробуй не ассемблерными вставками, а на чистом асме все написать. Уверен, что будет быстрее!

_________________
I L.A.W. you, baby!
For a GNU dawn! For freedom! :-)


 

Member
Статус: Не в сети
Регистрация: 24.12.2005
А на... э-э, :) в смысле, зачем нужен условный переход в цикле? Выкинуть его на... , ну т.е. короче, вот:
Код:
for (int i = 2; i < k; i++)
{
    __asm
    {
        mov eax, num
        xor edx, edx
        div i
        mov primit, edx
    }
    if (!primit) return false;
}


 

Advanced member
Статус: Не в сети
Регистрация: 30.08.2003
Откуда: Санкт-Петербург
-=alex-forewer=-
Цитата:
инструкции shr, shl делят и умножают только на степени двойки, а у меня призводится деление на все числа до заданного поделённое на два, то не подходит твой вариант!!!

напишите полностью алгоритм целочисленного деления на асме, вместо использования div ;)
далее - можно сразу оптимизировать код:
а) 1 - простое число
б) 2 - единственное простое четное число.
в) далее все простые числа - нечетные.
Посему можно проверять число на четность, а затем делить на 3,5,7....

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

_________________
{:€ дед в законе :-) нородный окодемег
почетный пользователь OpenSuSE 11.3
Ремонт и модернизация ноутбуков IBM (Lenovo) ThinkPad


 

Member
Статус: Не в сети
Регистрация: 24.12.2005
Root писал(а):
напишите полностью алгоритм целочисленного деления на асме, вместо использования div
А ты уверен, что будет быстрее? Я - нет.

Root писал(а):
далее - можно сразу оптимизировать код: ...
С этого начинать надо. :)


 

Advanced member
Статус: Не в сети
Регистрация: 30.08.2003
Откуда: Санкт-Петербург
Цитата:
А ты уверен, что будет быстрее? Я - нет.

попробовать можно - мне, честно, лень :)

_________________
{:€ дед в законе :-) нородный окодемег
почетный пользователь OpenSuSE 11.3
Ремонт и модернизация ноутбуков IBM (Lenovo) ThinkPad


 

Member
Статус: Не в сети
Регистрация: 18.08.2005
Откуда: Новороссийск
Билли Бонс попробовал твой вариант, но скорость к сожалению упала.

Писать всю прогу на asm нет смысла, просто преподаватель не поймёт, ведь ему C++ надо!

Выбрал золотую серидину, всё понятно и быстро:
Код:
#include <iostream>

bool Test(unsigned int num)
{
   unsigned int i, k;

   __asm
   {
      cmp num, 1000
      jng m
      mov k, 999
      jmp fin
   m:
      mov EAX, num
      shr EAX, 1
      mov k, EAX
   fin:
   }

   for (int i = 2; i <= k; i++)
      if (num%i == 0) return false;
   return true;
}

void main()
{
   unsigned int i, x = 4000000;

   for(i = 1; i <= x; i++)
   {
      if(Test(i))
      {
         // ...
      }
   }
}


Всем спасибо :) . Дальше ускарять нет смысла, поскольку для числа 4.000.000 (точки для наглядности) вычисления занимают 5 секунд, а вывод в ListBox 60 секунд.
Добавлено спустя 2 часа, 48 минут, 29 секунд
Root
Цитата:
Посему можно проверять число на четность

Попробовал, но прироста производительности ноль, ведь во вставке три присваивания и одно условие, плюс условие на выходе, поэтому прироста нет!
Код:
for(i = 1; i <= X; i++)
{
   __asm
   {
      mov even, 1
      mov EAX, i
      and EAX, 00000000000000000000000000000001b
      cmp EAX, 0
      jz mmm
      mov even, 0
      mmm:
   }
   if(even) continue;
   else if(Test(i)) cout << i;
}


 

Member
Статус: Не в сети
Регистрация: 10.03.2003
Кто-нибудь знаком с ASM51 !?
Нужно написать программу умножения!!! Буду признателен за помощь


 

Member
Статус: Не в сети
Регистрация: 05.12.2005
Откуда: Rostov-on-Don
Люди, требуется помощь. Нужны проги на TASM'е. Буду ОЧЕНЬ благодарен, кто поможет -
Цитата:
1. Найти наибольшее отрицательное число. Массив байт.
2. Ввести с клавиатуры строку, содержащую несколько слов, разделен-ных пробелом. Переставить в ней слова, поменяв местами первое слово с последним, второе с предпоследним и т.д. Вывести результаты на экран.
3. Разработать подпрограмму, которая определяет, сколько раз задан-ная подстрока встречается в строке. Разработать программу, которая вво-дит с клавиатуры две строки и определяет сколько раз вторая строка встречается в первой.
4. Вывести несколько строк произвольного текста, содержащие лишь латинские буквы. Каждые 10 секунд заглавные буквы сменяются строчны-ми и т. д.

Очень желательно с комментариями. Либо, если что-то похожее есть дайте ссылки.

_________________
Intel Inside ;-)


 

Member
Статус: Не в сети
Регистрация: 13.08.2005
Foxtrot Ну ты бы хоть что-нить сам сделал! :-) С нуля тебе врядли кто будет писать. Если будут затыки в чем-нибудь - подскажем, а делать вместо тебя... Как-то не интересно.

_________________
I L.A.W. you, baby!
For a GNU dawn! For freedom! :-)


Показать сообщения за:  Поле сортировки  
Начать новую тему Новая тема / Ответить на тему Ответить  Сообщений: 641 • Страница 17 из 33<  1 ... 14  15  16  17  18  19  20 ... 33  >
-

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 15


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Перейти:  
Создано на основе phpBB® Forum Software © phpBB Group
Русская поддержка phpBB | Kolobok smiles © Aiwan