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
Статус: Не в сети Регистрация: 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;
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
если тебе интересно Добавлено спустя 39 секунд и медленный idiv тут присутствует) Добавлено спустя 1 минуту, 16 секунд Надо было цикл делать тоже ассемблером, а то непонятно, что получается…
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, притом что знакового деления здесь никогда не будет!!!
Advanced member
Статус: Не в сети Регистрация: 30.08.2003 Откуда: Санкт-Петербург
-=alex-forewer=-
Цитата:
инструкции shr, shl делят и умножают только на степени двойки, а у меня призводится деление на все числа до заданного поделённое на два, то не подходит твой вариант!!!
напишите полностью алгоритм целочисленного деления на асме, вместо использования div далее - можно сразу оптимизировать код:
а) 1 - простое число
б) 2 - единственное простое четное число.
в) далее все простые числа - нечетные.
Посему можно проверять число на четность, а затем делить на 3,5,7....
А вообще надо профайлер юзать - например, Intel VTune. С помощью него можно посмотреть что именно тормозит программу, вплоть до процессорных инструкций.
_________________ {:€ дед в законе :-) нородный окодемег почетный пользователь OpenSuSE 11.3 Ремонт и модернизация ноутбуков IBM (Lenovo) ThinkPad
Всем спасибо . Дальше ускарять нет смысла, поскольку для числа 4.000.000 (точки для наглядности) вычисления занимают 5 секунд, а вывод в ListBox 60 секунд. Добавлено спустя 2 часа, 48 минут, 29 секунд Root
Цитата:
Посему можно проверять число на четность
Попробовал, но прироста производительности ноль, ведь во вставке три присваивания и одно условие, плюс условие на выходе, поэтому прироста нет!
Member
Статус: Не в сети Регистрация: 05.12.2005 Откуда: Rostov-on-Don
Люди, требуется помощь. Нужны проги на TASM'е. Буду ОЧЕНЬ благодарен, кто поможет -
Цитата:
1. Найти наибольшее отрицательное число. Массив байт. 2. Ввести с клавиатуры строку, содержащую несколько слов, разделен-ных пробелом. Переставить в ней слова, поменяв местами первое слово с последним, второе с предпоследним и т.д. Вывести результаты на экран. 3. Разработать подпрограмму, которая определяет, сколько раз задан-ная подстрока встречается в строке. Разработать программу, которая вво-дит с клавиатуры две строки и определяет сколько раз вторая строка встречается в первой. 4. Вывести несколько строк произвольного текста, содержащие лишь латинские буквы. Каждые 10 секунд заглавные буквы сменяются строчны-ми и т. д.
Очень желательно с комментариями. Либо, если что-то похожее есть дайте ссылки.
Foxtrot Ну ты бы хоть что-нить сам сделал! С нуля тебе врядли кто будет писать. Если будут затыки в чем-нибудь - подскажем, а делать вместо тебя... Как-то не интересно.
_________________ I L.A.W. you, baby!
For a GNU dawn! For freedom!
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения