Для справки: Решето Эратосфена - простейший алгоритм поиска простых чисел, в базовом виде звучит(своими словами) как 1)вычеркнуть все числа, делящиеся на 2, то есть счетчик = 4, вычеркиваем четверку, счетчик +2, вычеркиваем шестерку и т.д.
2)прибавить к основанию единицу, то есть получаем 3 и вычеркиваем 6,9,12 и т.д.
3) повторяем до опупения.
все невычеркнутые числа - простые
Оптимизации которые я применял
1) брать за основание 4 ни к чему, все что делится на 4 было вычеркнуто при проходе на 2, то есть за основание берем только простые числа, то есть те числа, что вычеркнулись в предыдущих проходах за основание не берем
2) при основании например 7, вычеркивать 14 смысла не имеет, т.к. оно вычеркнулось при проходе на 2, 21 - при проходе на 3 и т.д. на все предыдущие простые числа, то есть начинать вычеркивать можно не с (основание*2) а с (основание в квадрате)
3)так как все простые числа являются нечетными и их квадраты соответственно тоже нечетны, то начиная с 3, вычеркивать можно не каждое число а через одно, то есть прибавляя каждый раз не по 3 а по 6, то есть при проходе на 3 вычеркивается 9,15,21 и т.д. вместо 6,9,12,15,18,21 и т.д.
это не все оптимизации, только наиболее просто реализуемые и более всего ускоряющие выполнение
как пользоваться
1) внести в окошко предел рассчета и нажать "Go"
2) резалты - сверху время в секундах, снизу кол-во найденных простых
3)если хотите получить файл с резалтами поставьте галочку "Save" до запуска.
ну или запустите еще раз
Заметки
1)Прога считает в 2 потока, то есть гипертрединг на пнях а так же двуядерность должны давать нехилое ускорение.
2)на месте Label5 во время рассчета отображается текущее простое, которое используется как основание, отображается само собой не на каждом проходе
ProgressBar(синяя полоска) отображает прогресс не по времени прошло/осталось а всего лиш прикидку(т.н. estimation), работает не очень точно, но не хочется тратить время на эту мелочь , ну и заодно чтоб показать что прога не повисла
3)в архиве 2 ехешника, разница между ними только в том, что erato32 использует в качестве счетчиков unsigned __int32, а erato - __int64, то есть можно заценить какую примерно разницу даст перекомпилирование под 64 битную ос. правда заценить можно только на больших пределах, миллиарда 2 и выше, на низких пределах erato32 упирается в скорость памяти
4)как бенчмарк разумеется использовать нужно erato.exe, поскольку erato32 ограничена пределом рассчета 4 млрд по объективным причинам, и пользоваться им имеет смысл только для информации
5)Гонять имеет смысл с пределом 2млрд для тех у кого 512 памяти (займет 250 мег в оперативке)
у кого гиг памяти - 6 млрд(750метров)
2 гига - 12млрд(1.5 гига)
6) 15485864 стоит по умолчанию - это предел для нахождения первого миллиона простых чисел, миллионное простое - 15485863
Сам я пока потестил только на Athlon64 3000+ (1.8ГГц), дома погоняю на своем и выложу резалты позже.
Очень хотел бы увидеть резалты двуядерных пней, и пней с гипером, а также на них же резалты для меньших пределов, чтоб можно было сравнивать, т.е. если есть гиг памяти потестить для 6 и 2 млрд.
Также хотел бы увидеть тот же резалт с Affinity на один проц, чтоб оценить какой прирост дает второе ядро и гипер
Резалт на Athlon64 3000+ (1.8ГГц) с 512 метрами памяти
__int32 версия
15485864 - 0.266сек
200млн - 3.203сек
2млрд - 34.844сек
__int64 версия
15485864 - 0.375сек
200млн - 4.953сек
2млрд - 55.812сек
разумеется в зачет из вышеприведенного только самый последний резалт -
2млрд - 55.812сек
_________________ Зовите меня просто 45194
Последний раз редактировалось B08AH 09.12.2005 12:15, всего редактировалось 1 раз.
Member
Статус: Не в сети Регистрация: 10.10.2005 Откуда: Н. Новгород
Результат на Athlon64 X2 4400+ @2.7
*15485864 - 0.125сек
*200млн - 2.219сек
2М - 24.484сек
6М - 78.765сек
12М - 165.719сек
Кстати на 2М от второго проца прирост только 50%(время в 1.5 меньше), а на 6 и 12 вообще 30%, получилось весьма зависимым оно от памяти. Сдается мне, что на пнях оно лучше будет работать.
Поисследовал также проц с частотой 1.2 и память 244(488) прирост от второго ядра достиг 72%
Member
Статус: Не в сети Регистрация: 10.07.2004 Фото: 14
Peter_P
2M вроде как я понял , если не ошибаюсь конечно , что это 2.000.000.000 Ух уж эти нолики ... ЗЫ , запускал простой Erato а не Erato32 , вроде в простом надо мерить если ничего не напутал
Цитата:
4)как бенчмарк разумеется использовать нужно erato.exe, поскольку erato32 ограничена пределом рассчета 4 млрд
Member
Статус: Не в сети Регистрация: 10.10.2005 Откуда: Н. Новгород
Цитата:
Выдало ошибку и не захотела запустится
бывает, возможно я неправильно память выделяю или это ограничение уже или компилятора борландовского или самой винды - не дает выделить одной командой new много памяти, да и с delete[] тож раньше косяки были на яву пора переходить
Member
Статус: Не в сети Регистрация: 05.06.2005 Откуда: Н. Новгород Фото: 0
О как! Чем люди занимаются!
B08AH А собственно, бенчмарк чего создавался? Проца или памяти? За минуту заюзать всю имеющуюся оперативу... кхм-м...
Кстати, любопытно просто: написан на cbuilder?
Сейчас этот форум просматривают: Mars19 и гости: 4
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения