Российские распределенные вычисления на платформе BOINC
Форум участников распределённых вычислений.

Добро пожаловать, Гость! Чтобы использовать все возможности Вход или Регистрация.

Уведомление

Icon
Error

5 Страницы123>»
Опции
К последнему сообщению К первому непрочитанному
Online SerVal  
#1 Оставлено : 31 января 2017 г. 3:37:31(UTC)
SerVal


Статус: Administration

Медали: Донор: За финансовую помощь сайту

Группы: Editors, Administration, Russia Team Group
Зарегистрирован: 28.09.2007(UTC)
Сообщений: 3,116
Мужчина
Откуда: Москва, Ясенево.

Сказал «Спасибо»: 309 раз
Поблагодарили: 537 раз в 373 постах
В этой ветке обсуждается приложение для ГПУ.
Будет оно или нет - это пока не известно. Но ветку для обсуждения создал. smile
*****
Ну и пока сделал программульку для поиска дружественных чисел от 0 до 1 миллиарда.
Вот такой результат:
Код:

H:\>AmiSearchCuda.exe

Amicable pair : 0 .. 1000000000

Accelerator : GeForce GTX 980
Found       : 564
First pair  : 220 284
Last  pair  : 957871508 998051692
============
Exec time   : 1590 seconds.

Всем привет и хорошего настроения. Present
thanks 1 пользователь поблагодарил SerVal за этот пост.
Duce H_ K_ оставлено 12.02.2017(UTC)
Offline dimych  
#2 Оставлено : 31 января 2017 г. 7:39:42(UTC)
dimych


Статус: Старожил

Группы: Member, Crystal Dream Group
Зарегистрирован: 08.02.2011(UTC)
Сообщений: 1,835
Мужчина
Российская Федерация
Откуда: Смоленск

Сказал «Спасибо»: 445 раз
Поблагодарили: 211 раз в 170 постах
эх, все для ПЕЧек. а под OpenCL это дело никак нельзя сделать? чтоб все считали, и "зеленые" и "красные"...
ASUS P9X79 WS/I7-3930K@3.2 GHz/32 GB DDR3-1600 MHz/MSI R7950 Twin Frozr 3GD5 V2/OC 3 Gb (880/5000 MHz)
Online SerVal  
#3 Оставлено : 31 января 2017 г. 7:52:51(UTC)
SerVal


Статус: Administration

Медали: Донор: За финансовую помощь сайту

Группы: Editors, Administration, Russia Team Group
Зарегистрирован: 28.09.2007(UTC)
Сообщений: 3,116
Мужчина
Откуда: Москва, Ясенево.

Сказал «Спасибо»: 309 раз
Поблагодарили: 537 раз в 373 постах
Автор: dimych Перейти к цитате
эх, все для ПЕЧек. а под OpenCL это дело никак нельзя сделать? чтоб все считали, и "зеленые" и "красные"...

На OpenCL я не умею. И изучать его - сущее наказание. sad Не хочу.
.
Умею на "C++ AMP" и "CUDA". "C++ AMP" позволяет сделать сразу для всех видео-адаптеров.
Но у него только 32-х битные числа, поэтому он не годится.
А у "CUDA" есть 64 битные числа. Вот на ней и пробую.
*****
И ещё. Я вот перебрал "женихов" в диапазоне от 0 до 1 миллиарда. И "невест" им искал в этом же диапазоне.
Скорее всего, "невест" надо было искать в большем диапазоне.
Насколько большем я не знаю. Думаю, многие женихи из этого миллиарда остались без невест. То есть, не все пары найдены. sad

Отредактировано пользователем 31 января 2017 г. 8:08:36(UTC)  | Причина: Не указана

Offline 256Ghz  
#4 Оставлено : 31 января 2017 г. 12:30:22(UTC)
256Ghz


Статус: Частенько заглядывает

Медали: Разработчику: Автор проекта

Группы: Member
Зарегистрирован: 29.06.2016(UTC)
Сообщений: 241
Российская Федерация

Сказал(а) «Спасибо»: 33 раз
Поблагодарили: 150 раз в 83 постах
Вопрос интересующегося дилетанта smile
Если что поправьте.
Видеокарта 1080
FP32 8000 попугаев
FP64 250 попугаев

FP64 в 32 раза медленнее.
Может любить 64 не стоит ?


И стоит оптимизировать под 32.
Online SerVal  
#5 Оставлено : 31 января 2017 г. 15:02:34(UTC)
SerVal


Статус: Administration

Медали: Донор: За финансовую помощь сайту

Группы: Editors, Administration, Russia Team Group
Зарегистрирован: 28.09.2007(UTC)
Сообщений: 3,116
Мужчина
Откуда: Москва, Ясенево.

Сказал «Спасибо»: 309 раз
Поблагодарили: 537 раз в 373 постах
256Ghz написал:
FP32 8000 попугаев
FP64 250 попугаев

FP32 и FP64 - это числа с плавающей запятой - float и double(то есть, дробные, типа 1/3, 6,75 .. итд).
А в проекте используются только целые 64-х битные числа. Поэтому, смотреть надо на производительность целочисленных операций.
Offline 256Ghz  
#6 Оставлено : 31 января 2017 г. 22:20:53(UTC)
256Ghz


Статус: Частенько заглядывает

Медали: Разработчику: Автор проекта

Группы: Member
Зарегистрирован: 29.06.2016(UTC)
Сообщений: 241
Российская Федерация

Сказал(а) «Спасибо»: 33 раз
Поблагодарили: 150 раз в 83 постах
Автор: SerVal Перейти к цитате
256Ghz написал:
FP32 8000 попугаев
FP64 250 попугаев

FP32 и FP64 - это числа с плавающей запятой - float и double(то есть, дробные, типа 1/3, 6,75 .. итд).
А в проекте используются только целые 64-х битные числа. Поэтому, смотреть надо на производительность целочисленных операций.


Спасибо.
Для людей же написано Floating Point.
Не сообразил smile
Online SerVal  
#7 Оставлено : 2 февраля 2017 г. 0:38:42(UTC)
SerVal


Статус: Administration

Медали: Донор: За финансовую помощь сайту

Группы: Editors, Administration, Russia Team Group
Зарегистрирован: 28.09.2007(UTC)
Сообщений: 3,116
Мужчина
Откуда: Москва, Ясенево.

Сказал «Спасибо»: 309 раз
Поблагодарили: 537 раз в 373 постах
Тем временем, подрихтовал программку.
Добавил индикатор прогресса и научил находить все пары в заданном диапазоне.
Запускается в командной строке так:
H:\AmiSearchCuda.exe и по умолчанию ищет в диапазоне 1000127 101007473.
.
Но можно указать диапазон поиска в командной строке:
Код:

H:\>AmiSearchCuda.exe 100000000000 100020000000

Amicable pair : 100000000000 .. 100020000000

Accelerator   : GeForce GTX 980

Progress step 1: 100%
Progress step 2: 100%

Found       : 1
Amicable pair : 100016518256 104462849584
============
Exec time   : 1012 seconds.

*****
На очереди:
1. подобрать диапазон для поиска, чтобы считалось минут по 10-15.
2. придумать формат входного и выходного файла.
3. решить с какого числа начинать поиск и сгенерить тысяч 5 заданий для раздачи народу. smile
*****
И ещё. Скорость поиска прямо зависит от нахождения суммы делителей числа.
Сейчас сумма делителей находится простенькой функцией:
Код:

uint64_t SumOfDivisors(uint64_t N)
{
	uint64_t sum = 1, i, beg = 2, d = 1;
	if (N & 1)
	{
		d = 2;
		beg = 3;
	}
	for (i = beg; i*i < N; i += d)
		if (N % i == 0)
			sum += (i + N / i);
	if (i*i == N)
		sum += i;
	return sum;
}

Если кто-нибудь знает как побыстрее, прошу написать. Функция выполняется и на ЦПУ, и на видео-адаптере.
Всем привет и хорошего настроения. Present
Распаковать архив в любую папку.
Вложение(я):
AmiSearchCuda.rar (115kb) загружен 18 раз(а).
thanks 1 пользователь поблагодарил SerVal за этот пост.
AlexA оставлено 02.02.2017(UTC)
Online citerra  
#8 Оставлено : 2 февраля 2017 г. 8:55:08(UTC)
citerra


Статус: Старожил

Медали: Первооткрывателю: Нахождение пар ОДЛК в RakeSearch!Донор: За финансовую помощь сайту

Группы: Editors, Member, Russia Team Group, Moderators
Зарегистрирован: 02.10.2007(UTC)
Сообщений: 2,223

Сказал(а) «Спасибо»: 457 раз
Поблагодарили: 333 раз в 242 постах
Небольшая оптимизация, но ускорение в 1.5 раза


Код:

i=2;		if ( N % i == 0) sum += (i + N / i);
i=3;		if ( N % i == 0) sum += (i + N / i);
i=5;
	for (; i*i < N; i += 4)
{
		if ( N % i == 0) sum += (i + N / i);
i+=2;
		if ( N % i == 0) sum += (i + N / i);
}

Далее цикл с шагом не 6, а 30

Для малых N ( < 6 ) чуть подправить,можно просто прошить значения

Отредактировано пользователем 2 февраля 2017 г. 9:28:11(UTC)  | Причина: Не указана

thanks 1 пользователь поблагодарил citerra за этот пост.
SerVal оставлено 02.02.2017(UTC)
Offline Sergei Chernykh  
#9 Оставлено : 2 февраля 2017 г. 10:51:30(UTC)
Sergei Chernykh


Статус: Частенько заглядывает

Группы: Member
Зарегистрирован: 25.01.2017(UTC)
Сообщений: 125

Сказал(а) «Спасибо»: 2 раз
Поблагодарили: 98 раз в 51 постах
Я начал писать версию для OpenCL, пока ещё нечего показывать - сам толком не разобрался, как там что.
thanks 4 пользователей поблагодарили Sergei Chernykh за этот пост.
ReaDy оставлено 02.02.2017(UTC), dimych оставлено 02.02.2017(UTC), citerra оставлено 02.02.2017(UTC), Duce H_ K_ оставлено 12.02.2017(UTC)
Online SerVal  
#10 Оставлено : 2 февраля 2017 г. 16:17:09(UTC)
SerVal


Статус: Administration

Медали: Донор: За финансовую помощь сайту

Группы: Editors, Administration, Russia Team Group
Зарегистрирован: 28.09.2007(UTC)
Сообщений: 3,116
Мужчина
Откуда: Москва, Ясенево.

Сказал «Спасибо»: 309 раз
Поблагодарили: 537 раз в 373 постах
citerra написал:
Небольшая оптимизация, но ускорение в 1.5 раза..

Ничего не понял. sad
Как функция должна выглядеть? Напишите пожалуйста.
*оптимизировать для малых N не надо. Во-первых, у нас числа большие, а во-вторых, маленькие числа и так быстро считаются.
Online citerra  
#11 Оставлено : 2 февраля 2017 г. 16:24:45(UTC)
citerra


Статус: Старожил

Медали: Первооткрывателю: Нахождение пар ОДЛК в RakeSearch!Донор: За финансовую помощь сайту

Группы: Editors, Member, Russia Team Group, Moderators
Зарегистрирован: 02.10.2007(UTC)
Сообщений: 2,223

Сказал(а) «Спасибо»: 457 раз
Поблагодарили: 333 раз в 242 постах
Код:

uint64_t SumOfDivisors(uint64_t N)
{
	uint64_t sum = 0, i;
	i = 2; if (N % i == 0) sum += (i + N / i);
	i = 3; if (N % i == 0) sum += (i + N / i);

	for (i = 5; i*i <= N; i += 4)
	{
		if (N % i == 0) sum += (i + N / i);
		i += 2;
		if (N % i == 0) sum += (i + N / i);
	}
	return sum;
}
Online SerVal  
#12 Оставлено : 2 февраля 2017 г. 16:49:29(UTC)
SerVal


Статус: Administration

Медали: Донор: За финансовую помощь сайту

Группы: Editors, Administration, Russia Team Group
Зарегистрирован: 28.09.2007(UTC)
Сообщений: 3,116
Мужчина
Откуда: Москва, Ясенево.

Сказал «Спасибо»: 309 раз
Поблагодарили: 537 раз в 373 постах
citerra, Что-то тут не то. Суммы не совпадают.
Код:

N = 100016518256
Sum1 = 55529446713 // ваша функция
Sum2 = 104462849584 // старая функция

sad
Online citerra  
#13 Оставлено : 2 февраля 2017 г. 17:19:00(UTC)
citerra


Статус: Старожил

Медали: Первооткрывателю: Нахождение пар ОДЛК в RakeSearch!Донор: За финансовую помощь сайту

Группы: Editors, Member, Russia Team Group, Moderators
Зарегистрирован: 02.10.2007(UTC)
Сообщений: 2,223

Сказал(а) «Спасибо»: 457 раз
Поблагодарили: 333 раз в 242 постах
Обе функции неправильно написаны, т.к не учитывает кратность делителя, т.е когда число делится на 4,8,16

100016518256 = 2^4·23·89·3053753

Сумма делителей = 204479367840

Отредактировано пользователем 2 февраля 2017 г. 17:42:21(UTC)  | Причина: Не указана

Online SerVal  
#14 Оставлено : 2 февраля 2017 г. 17:29:24(UTC)
SerVal


Статус: Administration

Медали: Донор: За финансовую помощь сайту

Группы: Editors, Administration, Russia Team Group
Зарегистрирован: 28.09.2007(UTC)
Сообщений: 3,116
Мужчина
Откуда: Москва, Ясенево.

Сказал «Спасибо»: 309 раз
Поблагодарили: 537 раз в 373 постах
Автор: citerra Перейти к цитате
Обе функции неправильно написаны, т.к не учитывает кратность делителя, т.е когда число делится на 4,8,9,27

100016518256 = 2^4·23·89·3053753

Сумма делителей = 204479367840

sad

И что делать? Вот, есть ещё такая:

Код:

uint64_t SumOfDivisors(uint64_t N)
{
	uint64_t sum = 1;
	double m = sqrt((double)N);
	for (uint64_t i = 2; i <= m; i++)
		if (N % i == 0) sum += (i + N / i);
	return sum;
}

Медленннее процентов на 15%. Как Ваше мнение, эта-то хоть правильно считает?
Online citerra  
#15 Оставлено : 2 февраля 2017 г. 17:44:31(UTC)
citerra


Статус: Старожил

Медали: Первооткрывателю: Нахождение пар ОДЛК в RakeSearch!Донор: За финансовую помощь сайту

Группы: Editors, Member, Russia Team Group, Moderators
Зарегистрирован: 02.10.2007(UTC)
Сообщений: 2,223

Сказал(а) «Спасибо»: 457 раз
Поблагодарили: 333 раз в 242 постах
Эта да.
Там где шаг 2, то надо в начале подсчитать на какую степень двойки делится N.

while ( N % i == 0 ) {
t=2*t;
N=N/2;
}
и в конце
sum=(t-1)*sum;
Online SerVal  
#16 Оставлено : 2 февраля 2017 г. 17:58:40(UTC)
SerVal


Статус: Administration

Медали: Донор: За финансовую помощь сайту

Группы: Editors, Administration, Russia Team Group
Зарегистрирован: 28.09.2007(UTC)
Сообщений: 3,116
Мужчина
Откуда: Москва, Ясенево.

Сказал «Спасибо»: 309 раз
Поблагодарили: 537 раз в 373 постах
Цитата:
Там где шаг 2...

А где шаг 2 ?
Online citerra  
#17 Оставлено : 2 февраля 2017 г. 18:24:06(UTC)
citerra


Статус: Старожил

Медали: Первооткрывателю: Нахождение пар ОДЛК в RakeSearch!Донор: За финансовую помощь сайту

Группы: Editors, Member, Russia Team Group, Moderators
Зарегистрирован: 02.10.2007(UTC)
Сообщений: 2,223

Сказал(а) «Спасибо»: 457 раз
Поблагодарили: 333 раз в 242 постах
d = 2;
beg = 3;
}
for (i = beg; i*i < N; i += d)

делители пробегают все нечетные числа.
Online SerVal  
#18 Оставлено : 2 февраля 2017 г. 18:37:35(UTC)
SerVal


Статус: Administration

Медали: Донор: За финансовую помощь сайту

Группы: Editors, Administration, Russia Team Group
Зарегистрирован: 28.09.2007(UTC)
Сообщений: 3,116
Мужчина
Откуда: Москва, Ясенево.

Сказал «Спасибо»: 309 раз
Поблагодарили: 537 раз в 373 постах
Цитата:
d = 2;
beg = 3;

Так никакого d и beg в функции нетути. Вот же функция:
Код:

uint64_t SumOfDivisors(uint64_t N)
{
    uint64_t sum = 1;
    double m = sqrt((double)N);
    for (uint64_t i = 2; i <= m; i++)
        if (N % i == 0) sum += (i + N / i);
    return sum;
}


Где они?
Online citerra  
#19 Оставлено : 2 февраля 2017 г. 19:00:01(UTC)
citerra


Статус: Старожил

Медали: Первооткрывателю: Нахождение пар ОДЛК в RakeSearch!Донор: За финансовую помощь сайту

Группы: Editors, Member, Russia Team Group, Moderators
Зарегистрирован: 02.10.2007(UTC)
Сообщений: 2,223

Сказал(а) «Спасибо»: 457 раз
Поблагодарили: 333 раз в 242 постах
В этой функции проверяются все делители. Здесь всё хорошо.
Перед этим в функции нет четных делителей.
Offline Sergei Chernykh  
#20 Оставлено : 3 февраля 2017 г. 19:27:28(UTC)
Sergei Chernykh


Статус: Частенько заглядывает

Группы: Member
Зарегистрирован: 25.01.2017(UTC)
Сообщений: 125

Сказал(а) «Спасибо»: 2 раз
Поблагодарили: 98 раз в 51 постах
Переписал основную функцию CheckPair() на OpenCL - практически один в один с версией для CPU, которая сейчас на проекте. Естественно, GPU код пока неоптимизирован, лишь бы работал и находил дружественные числа.

Тестовый прогон, проверка 282830513 чисел, Intel Xeon CPU E5-1650 v3 (6 ядер, 12 потоков) против GeForce GTX 1070:
Код:
OpenCL: 0.830 seconds
CPU (1 thread): 14.112 seconds

CPU считал в один поток, при этом в фоне крутился Amicable_v_1_03.exe, так что на 6-ядерном CPU с включенным HT будет 1.176 секунды.

Получается, что первая неоптимизированная GPU версия на GeForce GTX 1070 быстрее на ~40%, чем до предела оптимизированный CPU код на Intel Xeon CPU E5-1650 v3 (6 ядер, 12 потоков). Значит есть смысл дальше пилить GPU-версию.

P.S. Тот же самый тест, Intel Core i7-4770K (4 ядра, 8 потоков) против GeForce GTX 770:
Код:
OpenCL: 1.992 seconds
CPU (1 thread): 14.711 seconds

Тут GPU-версия примерно вровень идёт.

Отредактировано пользователем 3 февраля 2017 г. 20:45:39(UTC)  | Причина: Не указана

thanks 2 пользователей поблагодарили Sergei Chernykh за этот пост.
SerVal оставлено 03.02.2017(UTC), AlexA оставлено 03.02.2017(UTC)
Пользователи, просматривающие эту тему
Guest
5 Страницы123>»
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.

Boinc.ru theme. Boinc.ru
Форум YAF 2.1.1 | YAF © 2003-2018, Yet Another Forum.NET
Страница сгенерирована за 0.305 секунды.