powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / C++ BigIntegers parallel library
104 сообщений из 104, показаны все 5 страниц
C++ BigIntegers parallel library
    #38388694
SerVal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Не могу найти ничего подходящего. Погуглил, есессно. Все библиотеки используют только один процессор.
Кроме того, конструкторов типа

Код: plaintext
1.
2.
3.
4.
5.
6.
std::string string1="123456789...."; // строка с миллионом цифр 

cout << "Constructing Big Intintegers."<< endl;

BigInt bigInt1(string1);
BigInteger bigInteger1 = stringToBigInteger(string1);


- так и не дождался. До умножения и деления, есессно, дело не дошло. :(

У меня в компику 8 процессорных ядер у CPU и 1600 ядер у GPU и ничего они в это время не делают.
Если кому-нибудь известна библиотека - поделитесь, пожалуйста, ссылкой.
*писать самому как-то не очень.. типа изобретать велосипед. :(
...
Рейтинг: 0 / 0
C++ BigIntegers parallel library
    #38388829
skynowa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
CUDA
...
Рейтинг: 0 / 0
C++ BigIntegers parallel library
    #38388886
SerVal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо за ответ, однако, не совсем понял, при чём здесь CUDA ? CUDA - это технология программирования видеоадаптеров nVidia.
Программировать видеоадаптеры я пока не планирую. Ищу обыкновенный класс BigInt.
Ну и сложение, умножение.. к нему. Типа:
Код: plaintext
1.
2.
3.
BigInt a("1");
BigInt b("2");
BigInt c = a +b;


Сейчас лазию по Интернету... мож кто-нибудь уже написал.
Заодно проверил и библиотеку Microsoft BigInteger для C# (numerics.dll). Она тоже одноногая(еле ползает). :(
Ну и всякие самописные смотрю.. они в лучшем случае на уровне студенческих лабораторных работ.
С большими числами они не работают. *точнее, делают вид, что работают.
...
Рейтинг: 0 / 0
C++ BigIntegers parallel library
    #38388976
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SerValСпасибо за ответ, однако, не совсем понял, при чём здесь CUDA ? CUDA - это технология программирования видеоадаптеров nVidia.
Программировать видеоадаптеры я пока не планирую. Ищу обыкновенный класс BigInt.


CUDA здесь при том, что оно именно это и делает -- параллельные вычисления на, по странному стечению обстоятельств, видеопроцессоре.
...
Рейтинг: 0 / 0
C++ BigIntegers parallel library
    #38389014
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SerValИщу обыкновенный класс BigInt.
Ну и сложение, умножение.. к нему.
Если бы ты его не искал, а запрограммировал сам, то понял бы что
1) Это быстрее чем искать
2) Сложение и умножение последовательны и, как следствие, не распараллеливаются.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
C++ BigIntegers parallel library
    #38389028
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovSerValИщу обыкновенный класс BigInt.
Ну и сложение, умножение.. к нему.
Если бы ты его не искал, а запрограммировал сам, то понял бы что
1) Это быстрее чем искать
2) Сложение и умножение последовательны и, как следствие, не распараллеливаются.


Векторов -- параллелятся.
...
Рейтинг: 0 / 0
C++ BigIntegers parallel library
    #38389052
SerVal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день MasterZiv .
Посмотрел я КУДУ. И никакой библиотеки класса типа BigInt и интерфейса к нему не обнаружил.
*вероятно, по странному стечению обстоятельств.

Не могли бы Вы привести простенький примерчик типа:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
#include "мояCUDA.h"
int main( int argc, char *argv[])
{
BigInt a("1");
BigInt b("2");
BigInt c = a + b;

cout << a<< "+" <<b <<" = " << c << endl;
}


Ну и откуда скачать header и саму библиотеку. Возможно, я просто не нашёл, или чего-то не понимаю.
*****
Взглянул на ещё одну библиотеку: http://www.shoup.net/ntl/ .. компилится, но тоже использует только один процессор.
*****
...
Рейтинг: 0 / 0
C++ BigIntegers parallel library
    #38389068
SerVal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry SibiryakovЕсли бы ты его не искал, а запрограммировал сам, то понял бы что
1) Это быстрее чем искать
2) Сложение и умножение последовательны и, как следствие, не распараллеливаются.

Добрый день Дмитрий.
1) Самому написать, к сожалению, не быстрее.
2) сложение и умножение замечательно распараллеливаются. *написать простенький пример на C++- дело 10-15 минут.
Впрочем, Вы и сами можете взглянуть:
"Introduction to parallel & distributed algorithms"
Adding big integers: http://www.toves.org/books/distalg/#3.3
...
Рейтинг: 0 / 0
C++ BigIntegers parallel library
    #38389085
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SerValВпрочем, Вы и сами можете взглянуть:
А мне-то зачем? Это же тебе библиотека нужна...
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
C++ BigIntegers parallel library
    #38389097
SerVal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry SibiryakovА мне-то зачем? Это же тебе библиотека нужна...
Ну, хотя бы затем, чтобы в следующий раз не писать такое:
Dimitry SibiryakovСложение и умножение последовательны и, как следствие, не распараллеливаются..
А то неудобно как-то.

*такая библиотека много кому нужна. :)
...
Рейтинг: 0 / 0
C++ BigIntegers parallel library
    #38389102
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SerValНу, хотя бы затем, чтобы в следующий раз не писать такое:

Видишь ли, теория, описанная в книгах, несколько отличается от практики. Да, я верю, что
распараллеливание арифметики над числами в миллионы бит даёт выйгрышь. Но на тысячах бит
накладные расходы на создание и координацию потоков съедают всю прибыль. И чем расписывать
все эти тонкости для чайника, проще сказать "сложение не распараллеливается".
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
C++ BigIntegers parallel library
    #38389108
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SerVal*такая библиотека много кому нужна. :)
Это спорное утверждение.
Целые большие числа нужны только в криптографии. А там нет таких разрядностей - миллион цифр.
Максимум тысячи, и то двоичных разрядов.

Касательно торможения при инициализации числа - вполне возможно тормозит не преобразование из строки, а выделение памяти под результат (перевыделение при росте массива).
Если эта догадка верна, то распараллеливание вам не поможет :)
...
Рейтинг: 0 / 0
C++ BigIntegers parallel library
    #38389117
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyКасательно торможения при инициализации числа - вполне возможно
тормозит не преобразование из строки, а выделение памяти под результат
Умножение на 10. Фиг знает как они его делают...
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
C++ BigIntegers parallel library
    #38389121
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SerVal
Не могли бы Вы привести простенький примерчик типа:


Ты бы лучше объяснил, что же тебе нужно.
...
Рейтинг: 0 / 0
C++ BigIntegers parallel library
    #38389208
SerVal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
АнатолийЦелые большие числа нужны только в криптографии. А там нет таких разрядностей - миллион цифр. Анатолий , называть "большими" числа размером меньше миллиона цифр даже как-то неудобно.
АнатолийКасательно торможения при инициализации числа - вполне возможно тормозит не преобразование из строки, а выделение памяти под результат (перевыделение при росте массива).
Если эта догадка верна, то распараллеливание вам не поможет :)
Я посмотрел. Ребятки не умеют параллельно запихивать циферки из строки в массив. Или не хотят?
Я как вижу что-нибудь вроде:
Код: plaintext
1.
2.
3.
4.
for(int i=0 i<strlen(str);  i++
{
  array[i]=(char)str[i];
}

Сразу понятно, что дальше ничего приличного не будет.
А утверждают, что их библиотеки для больших чисел. Мда... программисты ещё те...
*********
MasterZivТы бы лучше объяснил, что же тебе нужно.
Я ж говорю - билиотека, которая на самом деле работает, а не делает вид.
И есть проект распределённых вычислений PrimeGrid@home , который ищет всякие там числа Мерсена, Вудала.. и прочие простые.
И регулярно утверждают, что нашли что-то большое и ценное. А проверить их невозможно. Может врут, а может не очень..
Во: Record prime Fermat divisor:
57^22747499+1 Divides F(2747497)

Ясное дело, я не такой придурок, чтобы самому эти числа искать(кому они нужны), но проверить хочется.
*это для начала. есть и другая нужда. :)
******
Сейчас прикинул мож и правда самому натяпать? Ребятки, такая структура подойдёт:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
class BigInt {
public:
BigInt() { };
BigInt(const std::string&); // конструктор из строки
private:
std::vector<int> number;
};


*Ну, ещё операторов натяпать и можно пробовать чё-нибудь сложить.
******
...
Рейтинг: 0 / 0
C++ BigIntegers parallel library
    #38389246
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SerValИ есть проект распределённых вычислений PrimeGrid@home , который ищет всякие там числа Мерсена, Вудала.. и прочие простые.
И регулярно утверждают, что нашли что-то большое и ценное. А проверить их невозможно. Может врут, а может не очень..
Я сначала надеялся что это распараллеливание для чего-то действительно полезного нужно.
Но судя по всему оно вообще не нужно. Никому. И вам в том числе.
Так что удачи в мечтаниях .
...
Рейтинг: 0 / 0
C++ BigIntegers parallel library
    #38389275
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SerValMasterZivТы бы лучше объяснил, что же тебе нужно.
Я ж говорю - билиотека, которая на самом деле работает, а не делает вид.


В общем, я понял (далеко не сразу), что ему нужно.
Ему нужна библиотека для поддержки вычислений очень больших точных чисел (не с плавающей точкой),
которая поддерживала бы распараллеливание вычислений.

Если что не так -- поправь.
...
Рейтинг: 0 / 0
C++ BigIntegers parallel library
    #38389282
SerVal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Anatoly Moskovsky , очень приятно, что Вы знаете, кому что нужно и полезно(тем более мне).
... просто удивительно, почему Вы ещё не депутат Государственной Думы.
...
Рейтинг: 0 / 0
C++ BigIntegers parallel library
    #38389291
SerVal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MasterZiv , Вы совершенно правы.
И мне всё равно как она будет считать: параллельно или перпендикулярно. Лишь бы быстро.
*пока такой библиотеки нетути. :(
...
Рейтинг: 0 / 0
C++ BigIntegers parallel library
    #38389431
?
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
?
Гость
SerValИ есть проект распределённых вычислений PrimeGrid@home , который ищет всякие там числа Мерсена, Вудала.. и прочие простые.
И регулярно утверждают, что нашли что-то большое и ценное. А проверить их невозможно. Может врут, а может не очень..
Во: Record prime Fermat divisor:
57^22747499+1 Divides F(2747497)

Ясное дело, я не такой придурок, чтобы самому эти числа искать(кому они нужны), но проверить хочется.
А вы что собственно проверить хотите? Что число 57^22747499+1? Как именно? Или что 57^22747499+1 делит F(2747497)? Каким способом? Чтобы проверить, нужен нетривиальный софт. И арифметические операции с большими числами - это только очень маленький его кусочек.
...
Рейтинг: 0 / 0
C++ BigIntegers parallel library
    #38389488
SerVal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
GuestА вы что собственно проверить хотите? Что число 57^22747499+1? Как именно?
Чтобы проверить, нужен нетривиальный софт.
Для начала, то что число простое. Чего ж тут сложного?

К примеру, пишем:
Код: plaintext
1.
2.
3.
4.
BigInt candidate;
candidate=Parse("2^12345+1");
if((candidate%2) == 0 )
cout << "candidate is NOT prime number."<< endl;


Собственно, нужна только библиотека. А уж всяких алгоритмов достаточно. Начиная от простого решета, до Рабина-Мюллера :)
...
Рейтинг: 0 / 0
C++ BigIntegers parallel library
    #38389760
?
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
?
Гость
SerVal, Рабин-Мюллер не дает гарантию что число простое. А перебрать все возможные делители в ближайший миллиард лет вам никак не успеть, ни на одном процессоре ни на 1000.
...
Рейтинг: 0 / 0
C++ BigIntegers parallel library
    #38389768
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
?Рабин-Мюллер не дает гарантию что число простое.
В качестве проверки можно сгенерить из этого числа RSA ключ. Сработает - точно простое.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
C++ BigIntegers parallel library
    #38389920
SerVal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
GuestSerVal, Рабин-Мюллер не дает гарантию что число простое. А перебрать все возможные делители в ближайший миллиард лет вам никак не успеть, ни на одном процессоре ни на 1000.
Ясное дело, Мюллер для предварительной проверки перед Лемнером. Но ето ещё рано обсуждать.
А насчёт "не успеть".. так моя бабушки считала на калькуляторе "Феликс".. тож говорила, что до конца года не успеть..
У них там цельный отдел ручки крутил.

Dimitry SibiryakovВ качестве проверки можно сгенерить из этого числа RSA ключ. Сработает - точно простое.
А генератор RSA ключа может генерить ключ из числа с 1 000 000 000 цифрами ? Если может, то за сколько он примерно это сделает?
*****************************
Ну да ладно, натяпал пока простенький класс BigInt:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
class BigInt {
public:
    BigInt() { };
	BigInt(const std::string&);
	virtual ~BigInt()	{ };

	friend	std::ostream &operator<<(std::ostream&, BigInt&); 
	friend void BigInt::parseSubstring(const std::string& str, size_t start_pos, const size_t  block_size, const size_t block_num, std::vector<int>* x);
	size_t getLength() const { return number.size();}

	BigInt Parse(const std::string);
	enum Sign { negative = -1, zero = 0, positive = 1 };
private:
Sign sign;
std::vector <int> number;
};


Ну и конструктор из строки(заполнение вектора). Правда работает чёта медленно.
Строку из 1 000 000 000 циферок запихивает в вектор за 180 секунд. :(

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
D:\aProjects\TestBigInt\x64\Debug>TestBigInt.exe -amd
Accelerator : ATI Radeon HD 5800 Series
==================
Preparing string1 for BigInt1.
string1 size=1000000000 digits.
CPU: constructing BigInt1.
Exec time : 180 seconds.
==================



Посмотрю пока, чегой-то всё так медленно?

Ах да, скачал ещё одну библиотеку для больших чисел: C++ Big Integer Library https://mattmccutchen.net/bigint/
Тож одноногая. Однако, надо же что-то для сравнения результатов и времени.
*строки больше 10-20 тыс знаков она не переваривает. Подсунул этой библиотеке строку из 100 тыс. цифров..
Уж и в магазин сходил, а у неё всё конструктор хрюкает. Не дождался. :(
******
Всем привет и хорошего настроения. :)
...
Рейтинг: 0 / 0
C++ BigIntegers parallel library
    #38389943
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SerValПосмотрю пока, чегой-то всё так медленно?
Или код кривой, или распараллелить забыл.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
C++ BigIntegers parallel library
    #38389972
SerVal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry SibiryakovИли код кривой, или распараллелить забыл.
Аха, пожадничал. 128 процессов в вектор пихали..
Переделал. Поставил - не создавать процессов более чем число ядер CPU:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
//***********************************************
// parse substring of long string.
void parseSubstring(const std::string& str, const size_t  start_pos, const size_t end_pos, size_t idx, std::vector<int>*x)
{
	for (size_t i = start_pos; i<end_pos; i++)
	{
		char chr=str[i];
		x->at(idx)=atoi(&chr);
		idx--;
	}
};

BigInt::BigInt(const std::string& str)
{
	size_t num_cores = std::thread::hardware_concurrency(); // число ядер
	size_t str_size= str.size();

	const size_t block_size=str_size/num_cores;
	number= std::vector<int>(str_size);

	if(block_size==0) // do sequental parse
	{
		parseSubstring(str, 0, str_size, str_size-1, &number);
	}

	// do parallel parse into vector
	size_t idx=0;
	size_t block_num=0;
	size_t start_pos=0;
	size_t n_blocks=str_size/block_size;
	size_t end_pos=0;

	std::thread *threads= new std::thread[n_blocks];

	for(size_t block_num=0; block_num<n_blocks; block_num++)
	{
		start_pos=block_num*block_size;
		end_pos=start_pos+block_size;
		idx=str_size-block_size*block_num-1;
		threads[block_num]= std::thread(parseSubstring, str, start_pos, end_pos, idx, &number);
	}

	for(size_t i=0; i<n_blocks; i++)
		threads[i].join();
	
	// остаток. the remaining digits
	if(end_pos<str_size)
	{
		idx--; start_pos++;
		parseSubstring(str, start_pos, str_size, idx, &number);
	}
}


Exec time : 39.6 seconds.
Ща натяпаю каких-нить операторов присваивания, сравнения.. и можно приступать к сумматору, типа A+B=C :)
...
Рейтинг: 0 / 0
C++ BigIntegers parallel library
    #38389976
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Отдельный int на каждую десятичную цифру... Шикарно живёшь, суммирование просядет.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
C++ BigIntegers parallel library
    #38389988
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SerValExec time : 39.6 seconds.
У меня нет пяти гигабайт ОЗУ, поэтому я ограничился миллионом цифр. Код, абсолютно
аналогичный твоему, только без распараллеливания и использования STL, отработал на атомном
недобуке за 31мс. Т.е. если бы у меня было ОЗУ, то миллиард цифр был бы всосан за 31
секунду. К чему бы это?..
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
C++ BigIntegers parallel library
    #38389992
SerVal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry SibiryakovОтдельный int на каждую десятичную цифру... Шикарно живёшь, суммирование просядет.
Ну, в этом есть некоторое преимущество: сложение и умножение цифр одного разряда никогда не вылезут за пределы int-a.
То есть, переполнения можно не ожидать. И есть предположение, что с флагами переноса будет проще.
Как надо складывать/умножать/делить я пока не знаю.
Зато как решить проблему с недостатком памяти - любой чайник знает. И я тоже. :)

*схожу, пожалуй, за колбасятиной, потом чего-нибудь натяпаю.
...
Рейтинг: 0 / 0
C++ BigIntegers parallel library
    #38389994
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я дико извиняюсь, но не могу больше ржать, глядя на эти чудеса оптимизации.


1. Вы понимаете, что вот это вообще не работает, т.к нет завершающего нуля?
Код: plaintext
1.
2.
		char chr=...;
		...=atoi(&chr);


2. Если хранить каждую десятичную цифру в отдельном элементе массива, то время парсинга миллиона цифр должно быть не больше нескольких миллисекунд (безо всяких потоков). Откуда там взялись десятки секунд, можно только догадываться.
Впрочем долго гадать не придется. atoi на каждую цифру, ОМГ. Вообще-то int digit = str[i] - '0' - вполне достаточно.
...
Рейтинг: 0 / 0
C++ BigIntegers parallel library
    #38389995
SerVal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry SibiryakovК чему бы это?..
К тому, что 1 миллиард циферок - это немного больше, чем 1 миллион. :)
...
Рейтинг: 0 / 0
C++ BigIntegers parallel library
    #38390011
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SerValК тому, что 1 миллиард циферок - это немного больше, чем 1 миллион. :)

В тысячу раз, да. И что самое забавное - секунда во столько же раз больше миллисекунды.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
C++ BigIntegers parallel library
    #38390018
SerVal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
автор1. Вы понимаете, что вот это вообще не работает, т.к нет завершающего нуля?
К сожалению не понимаю. И основная причина непонимания в том, что это работает. :)
(конструкторе я пока ничего менять не буду, поскольку натяпываю сумматор).

А если Вам не поржать, то Вы могли бы заметить, что никакой проверки строки на корректность - нетути.
Так что без получения char-а и его проверки на цифру не обойтись. Это, как сказал бы Рабинович "Раз".
В предложенным Вами варианте не просматривается возможность проверки.
*конструкции типа int digit = str[i] - '0' - это к доктору или для наладонников и наколенников.
(не смотря на то, что вроде бы как работает).

По поводу оптимизации : до неё ещё далеко.
Потому как если оптимизировать char-ы - до сложения не дойдёшь. Это "Два" (того-же автора).
Перегруженный
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
std::ostream &operator<<(std::ostream &out, BigInt &c) 
{
	size_t size= c.number.size();
	for (long i = size-1; i>=0; i--)
	{
		out<< c.number[i];
	}
	return out;
}


- тоже имеется(как известно, он выводит циферки и буковки на экран).
Так вот, циферки на экране просто замечательные. И, по совершенно невероятной причине, именно те что надо!

Впрочем, думаю, к вечеру натяпаю простенький сумматор - выложу скрин с короткими цифрами. :)
...
Рейтинг: 0 / 0
C++ BigIntegers parallel library
    #38390026
SerVal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov , я ведь написал, что конструктор работает медленнно . И сравнить его, увы, не с чем.
Вот у меня ужо есть библиотека, которая за 40 секунд засасывает миллиард цифр. (складывать она пока не умеет :) )
Я привёл достаточно ссылок на библиотеки. Вам известна хоть какая-то, конструктор которой работает быстрее?
(точнее, хоть как-то работает с миллиардом цифр). Кстати, библиотека делается для больших чисел, а не для какого-то жалкого миллиона.

*и ваще: "Нам что... шашечки или ехать надо"?
...
Рейтинг: 0 / 0
C++ BigIntegers parallel library
    #38390031
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SerValавтор1. Вы понимаете, что вот это вообще не работает, т.к нет завершающего нуля?
К сожалению не понимаю. И основная причина непонимания в том, что это работает. :)
(конструкторе я пока ничего менять не буду, поскольку натяпываю сумматор).

Ну я и не сомневался в этом (и в том что вы не понимаете, и в том что скажете что "работает").
Вам следует сначала изучить понятие undefined behavior его последствия, и тогда уже делать выводы работает или нет.
А если Вам не поржать, то Вы могли бы заметить, что никакой проверки строки на корректность - нетути.
Так что без получения char-а и его проверки на цифру не обойтись. Это, как сказал бы Рабинович "Раз".
В предложенным Вами варианте не просматривается возможность проверки.
*конструкции типа int digit = str[i] - '0' - это к доктору или для наладонников и наколенников.
(не смотря на то, что вроде бы как работает).

Можно подумать atoi дает вам возможность проверки :)
Притом, что мой вариант как раз дает такую возможность: if (digit < 0 || digit > 9) ...

Ладно, я тут не хотел надолго отвлекать вас, желаю вам удачи и до конца жизни сопровождать этот код.
...
Рейтинг: 0 / 0
C++ BigIntegers parallel library
    #38390036
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я тут подумал, что слишком жестоко было бы сопровождать такой код до конца жизни.
Поэтому вот вам объяснение почему atoi(&ch) - не работает.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
void fn1()
{
    char ch = '1';
    cout << atoi(&ch) << endl;
}
void fn2()
{
    char ch = '1';
    char ch2 = '2';
    cout << atoi(&ch) << endl;
    cout << (void*)&ch << " " << (void*)&ch2 << endl;
}
int main()
{
    fn1();
    fn2();
   return 0;
}
...
Рейтинг: 0 / 0
C++ BigIntegers parallel library
    #38390055
SerVal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Anatoly MoskovskyНу я и не сомневался в этом (и в том что вы не понимаете, и в том что скажете что "работает").
Любезный Анатолий, уж не полагаете ли Вы, что приведённые мной циферки я натяпываю ручками?
*типа, чтобы ввести народ в заблуждение? Честно-пречестно говорю, что это не я, а программа!
Это всё она так выводит на экран, а я только копирую и вставляю сюда.
Почему она подлая работает и правильно выводит циферки дело тёмное. :)

Ну и есть небольшая разница между моим и Вашим кодом: мой код - вот он - каждый может посмотреть и покритиковать.
А Ваш код - он как мёд - вроде бы он есть, а вроде бы его уже и нет...

К сожалению, и приведённые Вами функции fn1 и fn2 в программе использовать не удалось. :(
хотя написали Вы намного больше, чем натяпанная мной atoi.
Надо признаться, я вообще не понял, к какому месту приграммы относятся эти функции.
Вроде бы конструктор не должен ничего выводить на экран...

Однако ж спасибо за пожелание удачи.
*на курсы Ликбеза я обязательно пойду. Скорее всего, после того, как доделаю библиотеку.
и сопровождать код мне не придётся, потому как делаю для себя. :)
*****
Ах да, выражение int digit = str[i] - '0' довело меня до когнитивного диссонанса. :)
*****
И видеоадаптер чёта моргает и драйвер падает когда я в него массив засовываю.
Не хочет суммировать... Ща ещё погляжу. :)
...
Рейтинг: 0 / 0
C++ BigIntegers parallel library
    #38390063
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SerValЯ привёл достаточно ссылок на библиотеки. Вам известна хоть какая-то,
конструктор которой работает быстрее?
У той, которую я написал за пять минут конструктор работает быстрее. Без
распараллеливания. И единственная причина почему она не работает на миллиарде цифр -
отсутствие пяти гигабайт виртуальной памяти. Если её скомпилировать на 64-х битах - будет
работать и на миллиарде. По прежнему быстрее вашей.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
C++ BigIntegers parallel library
    #38390079
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SerValПочему она подлая работает и правильно выводит циферки дело тёмное. :)
Так ничего удивительного: http://lurkmore.to/Индусский_код
...
Рейтинг: 0 / 0
C++ BigIntegers parallel library
    #38390090
SerVal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov , приветствую в Вашем лице всё прогрессивное человечество.
Dimitry SibiryakovУ той, которую я написал за пять минут конструктор работает быстрее. Без распараллеливания.
Замечательно! Вот где наши Российские таланты! Библиотек, правда, нетути...а талантов у нас огого!.
Похоже библиотеки в закромах Родины.. "Если завтра война, если завтра в поход..." вот тогда мы покажем кузькину мать..:)
Dimitry SibiryakovИ единственная причина почему она не работает на миллиарде цифр - отсутствие пяти гигабайт виртуальной памяти. Если её скомпилировать на 64-х битах - будет работать и на миллиарде. По прежнему быстрее вашей.
Ну да, ну да.. почему пушки не стреляли ?.. "Во первых не было патронов..."..

Мда, Дмитрий, Вы тоже вводите меня в ступор. Не работающая библиотека, которая работает быстрее моей. О, как!
Как тут не вспомнить классика: "Никогда ж такого не было, и вот опять!..."(с) Виктор Черномырдин.

Ну и Ваш код и обладает тем же свойством, что и у Московского товарища из Одессы.. никто его не видел, не щупал и сказать о нём нечего.
******
Сумматор без переноса я сделал. Ща проверю на мелких цифрах для CPU и GPU. И таймеры вкрячу.
7654321 и
1234567
Сумма должна быть: 8888888

Ну а потом строки 7654321 и 1234567 раскручу в цикле:
Код: plaintext
1.
2.
3.
4.
5.
   for(size_t i=0; i<10000000; i++)
   {
	   string1 += string1;
	   string2 += string2;
   }


Получатся миллиардные цифры, которые можно будет сложить без переносов и в сумме все цифры будут восьмёрки.
Ежели сегодня успею приведу тайминги. :)
******
Фу-ты ну-ты.. память у моих видеоадаптеров только по 1 гигабайту. Похоже, миллиардные слагаемые не влезут.
Ладно, напишу про те которые влезут. :)
...
Рейтинг: 0 / 0
C++ BigIntegers parallel library
    #38390093
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SerValПолучатся миллиардные цифры, которые можно будет сложить без переносов
Ну да, ну да... А уж как круто было бы складывать нули...

SerValЕжели сегодня успею приведу тайминги. :)
Заодно приведи параметры компьютера на котором ты это запускаешь.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
C++ BigIntegers parallel library
    #38390303
SerVal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ну вот, можно проверить сложение с использованием всех имеющихся процессоров. :)
Компик вот такой:
*************
Процессор: i3820@4.2HGz
Материнская плата: ASUS P9X79 WS
RAM 64 GB
Сопроцессор1: NVIDIA GeForce GTX 460
Сопроцессор2: ATI Radeon HD 5800 Series
*************
Сложение на CPU(на одном ядре):

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
BigInt add(const BigInt& n1, const BigInt& n2)
{
	int n1_digit=n1.number.size();
	int n2_digit=n2.number.size();
	int n_digit=(n1_digit < n2_digit ? n1_digit : n2_digit);

	BigInt c;

	if(n1_digit>n2_digit)
	{
		n_digit=n2_digit;
		c.number = n1.number;
		
		// add
		for(int i=0; i<n_digit; i++)
		{
			c.number[i] += n2.number[i];
		}
	}
	else
	{	
		n_digit=n1_digit;
		c.number = n2.number;
		// add
		for(int i=0; i<n_digit; i++)
		{
			c.number[i] += n1.number[i];
		}
	}

	// processing carry flags
	n_digit=c.number.size()-1;
	for(int i=0; i<n_digit; i++)
	{
		if(c.number[i]>=10)
		{
			c.number[i]-=10;
			c.number[i+1]++;
		}
	}
	return c;
}


Сложение на GPU:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
BigInt add_gpu(const BigInt& n1, const BigInt& n2)
{
	std::vector<int> data1 = n1.number; // первое слагаемое
	std::vector<int> data2 = n2.number; // второе
	std::vector<int> data_out(n1.number.size());

	// массив для первого числа  
	array_view<int, 1>av1(data1.size(), data1);
	
	// массив для второго числа
	array_view<int, 1>av2(data2.size(), data2);
	
	// массив для результата
	array_view<int, 1>av_data_out(data_out.size(),data_out);
	av_data_out.discard_data();

	// копируем массивы в видеоадаптер и суммируем 
	parallel_for_each(av1.extent, [=](concurrency::index<1> idx) restrict(amp)
	{
		av_data_out[idx] = av1[idx] + av2[idx];
	});

	// пересылаем результат в память процессора
	av_data_out.synchronize();
	
	// возвращаем результат
	BigInt c;
	c.number= data_out;
	return c;
}



Закатал в строки
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
   string string1;
   string string2;
 
   for(size_t i=0; i<10000000; i++)
   {
	   string1 += "7654321765";
	   string2 += "1234567123";
   }


- штоб числа были по 100 миллионов цифр. Занимают в акселераторе 765 MBytes памяти. больше не лезет.

Результат:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
D:\aProjects\TestBigInt\x64\Debug>TestBigInt.exe -ati
Accelerator : ATI Radeon HD 5800 Series
==================
Строки для BigInt1 и BigInt2.
строка1 : 100000000 цифр.
строка2 : 100000000 цифр.
Конструируем 2 числа:
Exec time : 7.9 seconds.
==================
CPU: A = add(B,C)
Exec time : 16.9 seconds.
==================
GPU: A = add_gpu(B,C)
Exec time : 41.5 seconds.
==================


Хм.. результат как бы заставляет задуматься. :(
Ща посмотрю в чём дело.
...
Рейтинг: 0 / 0
C++ BigIntegers parallel library
    #38390471
SerVal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Размеры чисел уменьшил до 10 миллионов цифр и переделал умножение на GPU:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
BigInt add_gpu(BigInt& n1, BigInt& n2)
{
	BigInt c; c.number.resize(n1.number.size()); // результат

	// массив для первого числа. первое слагаемое
	array_view<int,1>av1(n1.number.size(),  dynamic_cast<std::vector<int>&>(n1.number)); 

	// массив для второго числа. второе слагаемое
	array_view<int,1>av2(n2.number.size(),  dynamic_cast<std::vector<int>&>(n2.number)); 

	// массив для результата
	array_view<int, 1>av_data_out(c.number.size(),c.number);
	av_data_out.discard_data();

	// копируем массивы в видеоадаптер и суммируем 
	parallel_for_each(av1.extent, [=](concurrency::index<1> idx) restrict(amp)
	{
		av_data_out[idx] = av1[idx] + av2[idx];
	});

	// пересылаем результат в память процессора
	av_data_out.synchronize();
	
	// возвращаем результат
	return c;
}



Результат уже лучше:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
D:\aProjects\TestBigInt\x64\Debug>TestBigInt.exe -ati
Accelerator : ATI Radeon HD 5800 Series
==================
Строки для BigInt1 и BigInt2.
строка1 : 10000000 цифр.
строка2 : 10000000 цифр.
Конструируем 2 числа:
Exec time : 0.8 seconds.
==================
CPU: A = add(B,C)
Exec time : 1.69 seconds.
==================
GPU: A = add_gpu(B,C)
Exec time : 1.45 seconds.
==================


:)
...
Рейтинг: 0 / 0
C++ BigIntegers parallel library
    #38390649
m_Sla
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
На cpu в одном потоке.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
==================
Construct 2 strings
Exec time : 0.040000 seconds.
==================
Construct 2 numbers
Exec time : 0.046000 seconds.
==================
n1.size=10000000
n2.size=10000000
CPU: A = add(B,C)
Exec time : 0.037000 seconds.
==================
add.size=10000000

Process returned 0 (0x0)   execution time : 0.150 s
Press any key to continue.


Intel Pentium CPU G2020 2.9GHz
...
Рейтинг: 0 / 0
C++ BigIntegers parallel library
    #38390918
?
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
?
Гость
SerVal, а переносы между разрядами при сложении вы что вообще не учитываете?
...
Рейтинг: 0 / 0
C++ BigIntegers parallel library
    #38391352
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SerVal, а какие задачи ты решаешь? Криптография?
...
Рейтинг: 0 / 0
C++ BigIntegers parallel library
    #38391478
SerVal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
m_SlaНа cpu в одном потоке.... Exec time : 0.037000 seconds.
Поздравляю! ... как известно,быстрее всего работает код, которого о5 же никто не видел. :)
Вот отсюда http://www.cs.sunysb.edu/~skiena/392/programs/bignum.c
можно скопипастить исходник сложения/вычитания...итд прям вместе с main() ...мож оно ещё быстрее будет.

Однако ж не совсем понятно, что Вы хотели сказать. Что одно ядро работает быстрее нескольких?
Сколько времени занимает у Вас параллельное сложение пока не видно..
... видимо оно прячется за многозначительным "Press any key to continue.". Ждём "continue". :)

Или, давайте 10000 раз сложим числа размером в 10 000 000 цифр ?
Нуачё - вот мой код - складывает одни и те же цифры 10 000 раз:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
// складываем одни и теже числа 10000 раз
BigInt add_gpu(BigInt& n1, BigInt& n2)
{
	BigInt c; c.number.resize(n1.number.size()); // результат

	// массив для первого числа. первое слагаемое
	const array_view<int,1>av1(n1.number.size(),  dynamic_cast<std::vector<int>&>(n1.number)); 

	// массив для второго числа. второе слагаемое
	const array_view<int,1>av2(n2.number.size(),  dynamic_cast<std::vector<int>&>(n2.number)); 

	// массив для результата
	array_view<int, 1>av_data_out(c.number.size(),c.number);
	av_data_out.discard_data();

	// копируем массивы в видеоадаптер и суммируем 
	parallel_for_each(av1.extent, [=](concurrency::index<1> idx) restrict(amp)
	{

		for(int i=0; i<10000; i++) // 10000 раз
			av_data_out[idx] = av1[idx] + av2[idx];
	});

	// пересылаем результат в память процессора
	av_data_out.synchronize();
	
	// возвращаем результат
	return c;
}


Вот результат(CPU одно сложение, GPU 10 тыс):
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
D:\aProjects\TestBigInt\x64\Debug>TestBigInt.exe -ati
Accelerator : ATI Radeon HD 5800 Series
==================
Строки для BigInt1 и BigInt2.
строка1 : 10000000 цифр.
строка2 : 10000000 цифр.
Конструируем 2 числа:
Exec time : 1.89 seconds.
==================
CPU: A = add(B,C)
Exec time : 2.09 seconds.
==================
GPU: A = add_gpu(B,C)
Exec time : 10.3 seconds.
==================


*на акселераторе NVIDIA GeForce GTX 460 время такое же.

maytonSerVal, а какие задачи ты решаешь? Криптография?
Не, сам я в криптографии не разбираюсь. Но есть ребятки, которые интересуются криптоанализом шифров Bivium и Trivum.

GuestSerVal, а переносы между разрядами при сложении вы что вообще не учитываете?
Ага, не учитываю, поскольку ещё не умею, а подсказать некому. :(
Однако, сначала надо определиться, какой будет ли выигрыш в производительности.
Потому как производительность пока определяется копированием слагаемых в память видеоадаптера и копирование результата
обратно в память процессора. :(
Читаю теорию. :)
...
Рейтинг: 0 / 0
C++ BigIntegers parallel library
    #38391490
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SerValАга, не учитываю, поскольку ещё не умею, а подсказать некому. :(

А как же та книжка, которой ты хвастался на предыдущей странице? Ниасилил?..
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
C++ BigIntegers parallel library
    #38391494
SerVal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry SibiryakovА как же та книжка, которой ты хвастался на предыдущей странице? Ниасилил?..
Аха, пока ниасилил. Книжка шибко вумная. :( .. и не хвастался я совсем.

Ясное дело, осиливать надо, не изобретать же велосипед. В ближайшие дни постараюсь осилить и применить. :)
*****
Ах да, для GPU типа AMD Fusion или Intel HD Graphics использующих shared memory
всё будет на порядок быстрее, поскольку реального копирования массивов в память ускорителя не будет(Zero Copy).
*у меня такой графики нетути, поэтому попробовать не могу.
...
Рейтинг: 0 / 0
C++ BigIntegers parallel library
    #38391527
SerValDimitry SibiryakovА как же та книжка, которой ты хвастался на предыдущей странице? Ниасилил?..
Аха, пока ниасилил. Книжка шибко вумная. :( .. и не хвастался я совсем.

Ясное дело, осиливать надо, не изобретать же велосипед. В ближайшие дни постараюсь осилить и применить. :)
*****
Ах да, для GPU типа AMD Fusion или Intel HD Graphics использующих shared memory
всё будет на порядок быстрее, поскольку реального копирования массивов в память ускорителя не будет(Zero Copy).
*у меня такой графики нетути, поэтому попробовать не могу.
Bandwidth памяти RAM-GPU = 100-300 GByte/sec, а PCI-E gen2 16x = 8 GBytes/sec. Вы уверены, что RAM-GPU у вас слабое звено?
Или у вас данные в ядрах GPU окажутся в обход шины PCI-E? ;)
...
Рейтинг: 0 / 0
C++ BigIntegers parallel library
    #38391545
SerVal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
в ядрах GPU в обход шины PCI-EBandwidth памяти RAM-GPU = 100-300 GByte/sec, а PCI-E gen2 16x = 8 GBytes/sec. Вы уверены, что RAM-GPU у вас слабое звено?
Или у вас данные в ядрах GPU окажутся в обход шины PCI-E? ;)
Для AMD Fusion или Intel HD Graphics - копирования массивов не будет:
http://social.msdn.microsoft.com/Forums/vstudio/en-US/6426345c-9110-4e58-9f18-a6320b5f75ad/amp-and-zero-copy .
...
Рейтинг: 0 / 0
C++ BigIntegers parallel library
    #38391644
m_Sla
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SerValm_SlaНа cpu в одном потоке.... Exec time : 0.037000 seconds.
Поздравляю! ... как известно,быстрее всего работает код, которого о5 же никто не видел. :)
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
#include <iostream>
#include <vector>
#include <string>

#include <stdio.h>      /* printf */
#include <time.h>       /* clock_t, clock, CLOCKS_PER_SEC */

using namespace std;

//=======================================================================
class BigInt
{
public:
    BigInt() { };

    void print();
    void fromString(const std::string& str);
    void add(BigInt& num);

    size_t getLength() const
    {
        return number.size();
    }

    enum Sign { negative = -1, zero = 0, positive = 1 };
private:
    Sign sign;
    vector<char> number;
};
//=======================================================================
void BigInt::print()
{
    cout<<endl<<"num size="<<number.size()<<endl<<"num=";
    for (int i=number.size()-1; i>=0; i--)
    {
        cout<< (char)(number[i]+'0');
    }
    cout<<endl;
}
//=======================================================================
void BigInt::fromString(const std::string& str)
{
    int str_size= str.size();
    number.reserve(str_size+1);

    for (int i = str_size-1; i>=0; i--)
    {
        number.push_back(str[i]-'0');
    }
}
//=======================================================================
void BigInt::add(BigInt& summand)
{
    vector<char> rez;
    vector<char> *summand1;
    if(number.size() > summand.number.size())
    {
        rez=number;
        summand1=&summand.number;
    }
    else
    {
        rez=summand.number;
        summand1=&number;
    }

    for(size_t i=0, imax=summand1->size()-1; i<=imax; i++)
    {
        rez[i]+=summand1->at(i);

        if(rez[i]>9) //carry?
        {
            rez[i]-=10;

            if(i==imax)
            {
                rez.push_back(1);
            }
            else
            {
                rez[i+1]++;
            }
        }
    }

    number=rez;
}
//=======================================================================
int main()
{
    BigInt n1,n2;
    string num1,num2;

    clock_t t;

    t = clock();

    const size_t NUMBER_OF_DIGITS=10000000;

    num1.reserve(NUMBER_OF_DIGITS*10);
    num2.reserve(NUMBER_OF_DIGITS*10);
    for(size_t i=0; i<NUMBER_OF_DIGITS; i++)
    {
        //num1+="9999999999";
        num1+="1234567123";
        num2+="7654321765";
    }
    t = clock() - t;
    printf ("==================\nConstruct 2 strings \nExec time : %f seconds.\n==================\n",((float)t)/CLOCKS_PER_SEC);

    t = clock();
    n1.fromString(num1);
    n2.fromString(num2);
    t = clock() - t;
    printf ("Construct 2 numbers \nExec time : %f seconds.\n==================\n",((float)t)/CLOCKS_PER_SEC);

    if(n1.getLength()>1000)
    {
        cout<<"n1.size="<<n1.getLength()<<endl;
        cout<<"n2.size="<<n2.getLength()<<endl;
    }
    else
    {
        n1.print();
        n2.print();
    }

    t = clock();
    n1.add(n2);
    t = clock() - t;
    printf ("CPU: A = add(B,C)\nExec time : %f seconds.\n==================\n",((float)t)/CLOCKS_PER_SEC);

    if(n1.getLength()<=1000) n1.print();

    cout<<"add.size="<<n1.getLength()<<endl;

    return 0;
}

SerValОднако ж не совсем понятно, что Вы хотели сказать. Что одно ядро работает быстрее нескольких?
У Вас сложение на CPU по быстродействию примерно равно сложению на GPU. При этом сложение на CPU можно еще оптимизировать, например SSE прикрутить. Какой смысл в GPU и многопоточности?
...
Рейтинг: 0 / 0
C++ BigIntegers parallel library
    #38391651
m_Sla
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот результаты с использованием gmp 5.1.2
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
==================
Construct 2 strings
Exec time : 0.039000 seconds.
==================
str1 size=10000000
str2 size=10000000
Construct 2 numbers
Exec time : 4.361000 seconds.
==================
CPU: A = add(B,C)
Exec time : 0.003000 seconds.
==================

Process returned 0 (0x0)   execution time : 4.427 s
Press any key to continue.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
#include <iostream>
#include <stdio.h>
#include "gmp.h"
#include <string>
#include <stdio.h>      /* printf */
#include <time.h>       /* clock_t, clock, CLOCKS_PER_SEC */


using namespace std;

int main ()
{
    string num1,num2;

    clock_t t;

    t = clock();

    const size_t NUMBER_OF_DIGITS=1000000;

    num1.reserve(NUMBER_OF_DIGITS*10);
    num2.reserve(NUMBER_OF_DIGITS*10);
    for(size_t i=0; i<NUMBER_OF_DIGITS; i++)
    {
        //num1+="9999999999";
        num1+="1234567123";
        num2+="7654321765";
    }
    t = clock() - t;
    printf ("==================\nConstruct 2 strings \nExec time : %f seconds.\n==================\n",((float)t)/CLOCKS_PER_SEC);
    cout<<"str1 size="<<num1.size()<<endl;
    cout<<"str2 size="<<num2.size()<<endl;


    mpz_t n1, n2, sum;
    mpz_init2 (n1,40*NUMBER_OF_DIGITS);
    mpz_init2 (n2,40*NUMBER_OF_DIGITS);
    mpz_init2 (sum,40*NUMBER_OF_DIGITS);

    t = clock();
    mpz_set_str(n1,num1.c_str(),10);
    mpz_set_str(n2,num2.c_str(),10);
    t = clock() - t;
    printf ("Construct 2 numbers \nExec time : %f seconds.\n==================\n",((float)t)/CLOCKS_PER_SEC);

    t = clock();
    mpz_add(sum,n1,n2);
    t = clock() - t;
    printf ("CPU: A = add(B,C)\nExec time : %f seconds.\n==================\n",((float)t)/CLOCKS_PER_SEC);
    //cout<<"Sum is "; mpz_out_str (stdout, 10, sum); cout<<endl;

    mpz_clear (n1);
    mpz_clear (n2);
    mpz_clear (sum);

    return 0;
}

...
Рейтинг: 0 / 0
C++ BigIntegers parallel library
    #38392275
SerVal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день, m_Sla .

Про n1.add(n2) - какое ж это сложение?
Это не "А= В+С", а реализация оператора "+=". -> A += B
- теряется одно из слагаемых - оно становится результатом.
...это как говорят в Одессе - две большие разницы. :)
У меня числа складаваются и результат присваивается третьему числу:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
#include <amp.h>
#include <iostream>
#include <chrono>
#include "BigInt.h"

using namespace std;
using namespace chrono;
using namespace concurrency;

//*******************
// Выбор сопроцессора по подстроке в описании напр: "NVIDIA", "ATI", "INTEL"
// если сопроцессор найден - он устанавливается как сопроцессор по-умолчанию.
// если не найден, сопроцессором остаётся тот, что в системе по-умолчанию(тот, что выводит изображение на экран)
bool pick_accelerator(std::wstring vendor_name)
{
	accelerator accs;
	std::wstring description= accs.get_description();
	bool b_result = description.find((std::wstring)vendor_name) != std::string::npos;
	if(b_result) return true;

	std::vector<accelerator> accs_list = accelerator::get_all();
    //accelerator chosen_one;

	for(int i=0; i<accs_list.size(); i++)
	{
		accs=(accelerator)accs_list[i];
		std::wstring acc_description = accs.get_description();

		bool exists= acc_description.find(vendor_name) != std::string::npos;
		if(exists) { accelerator::set_default((accs.device_path)); return true;}
	}

	return false;
}
//*******************
void print_duration(high_resolution_clock::time_point t1, high_resolution_clock::time_point t2)
{
	std::chrono::duration<double> time_span = duration_cast<duration<double>>(t2 - t1);
	std::cout.precision(3);
	std::cout << "Exec time : " << time_span.count() << " seconds.";	std::cout << std::endl;
}

//********************************
//********************************

int main( int argc, char *argv[])
{
	setlocale(LC_CTYPE, "russian");
   	string opt="-default";
	if(argc>1) 	opt = argv[1];
	
	//**** выбор сопроцессора ****
	bool b_result=true;
	if(opt =="-nvidia")
	{
		b_result= pick_accelerator(L"NVIDIA");
		if(b_result==false)
		{std::printf("Accelerator nVIDIA not found.\n"); return 0;}
	}

	if((opt == "-ati") || (opt == "-amd"))
	{
		b_result= pick_accelerator(L"ATI");
		if(b_result==false)
		{std::printf("Accelerator AMD not found.\n"); return 0;}
	}

	if(opt == "-intel")
	{
		b_result= pick_accelerator(L"INTEL");
		if(b_result==false)
		{std::printf("Accelerator Intel not found.\n"); return 0;}
	}
	//**** конец выбора сопроцессора *****
	
	std::chrono::high_resolution_clock::time_point t1, t2;

	accelerator default_accelerator;
	std::wcout << L"Accelerator : " << default_accelerator.description<< std::endl;
	std::printf("==================\n");

	std::cout << "Строки для BigInt1 и BigInt2."<< endl;
   
   string string1;
   string string2;
 
   for(size_t i=0; i<10000000; i++)
   {
	   string1 += "7654321765";
	   string2 += "1234567123";
   }
 
   std::cout << "строка1 : "<< string1.size() << " цифр." << endl;
   std::cout << "строка2 : "<< string2.size() << " цифр." << endl;
   std::cout << "Конструируем 2 числа:"<< endl;

   t1 = std::chrono::high_resolution_clock::now();

   BigInt BigInt1(string1);
   BigInt BigInt2(string2);
   BigInt BigInt3;

   t2 = std::chrono::high_resolution_clock::now();
   print_duration(t1,t2); // время затраченное конструктором на 2 числа.
	/*
  cout << "BigInt1 = " << BigInt1 << endl;
  cout << "BigInt2 = " << BigInt2 << endl;
	*/
  //************ Начало теста ****************
   std::printf("==================\n");

   std::cout << "CPU: A = add(B,C) "<< endl;
   t1 = std::chrono::high_resolution_clock::now();
   
   BigInt3 = add(BigInt1, BigInt2);

   t2 = std::chrono::high_resolution_clock::now();
   //cout << "Длина результата : "<< BigInt3.getLength() <<endl;
   //cout << "A + B = " << BigInt3 << endl;
   print_duration(t1,t2); // CPU: время затраченное на сложение

   std::printf("==================\n");
   std::cout << "GPU: A = add_gpu(B,C)"<< endl;
   t1 = std::chrono::high_resolution_clock::now();

   BigInt3 = add_gpu(BigInt1, BigInt2);

   t2 = std::chrono::high_resolution_clock::now();
   //cout << "Длина результата : "<< BigInt3.getLength() <<endl; 
   //std::cout << "A + B = " << BigInt3 << endl;
   print_duration(t1,t2); // GPU:время затраченное на сложение
	std::printf("==================\n");
  //************ Конец теста ****************
	
	return 0;
}

про gmp 5.1.2
==================
CPU: A = add(B,C)
Exec time : 0.003000 seconds.
==================
Теряется ли в gmp 5.1.2 одно из слагаемых - не знаю.
Однако, охотно верю.
******
То что последовательное сложение у меня сделано криворуко - согласен.
Можно переписать получше. И оптимизировать его можно. Только зачем?
Как Вы показали, всё оптимизировано до нас в доступных библиотеках.
m_SlaКакой смысл в GPU и многопоточности? Похоже, уже на числах в 100 миллионами цифр, параллельное сложение обгоняет сложение на одном ядре.
Вот:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
D:\aProjects\TestBigInt\x64\Debug>TestBigInt.exe -ati
Accelerator : ATI Radeon HD 5800 Series
==================
Строки для BigInt1 и BigInt2.
строка1 : 100000000 цифр.
строка2 : 100000000 цифр.
Конструируем 2 числа:
Exec time : 7.85 seconds.
==================
CPU: A = add(B,C)
Exec time : 17 seconds.
==================
GPU: A = add_gpu(B,C)
Exec time : 14.5 seconds.
==================

*Тем не менее, сделаю сложение на CPU векторами, или попробую прикрутить gmp 5.1.2(для сравнения).
Всем привет и хорошего настроения. :)
...
Рейтинг: 0 / 0
C++ BigIntegers parallel library
    #38392381
?
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
?
Гость
SerValGuestSerVal, а переносы между разрядами при сложении вы что вообще не учитываете?
Ага, не учитываю, поскольку ещё не умею, а подсказать некому. :(
Однако, сначала надо определиться, какой будет ли выигрыш в производительности.
Угу, складываете вы параллельно к примеру 555....5555 и 444....4445. И у вас возник перенос в последнем разряде. Что толку от параллельного сложения циферок, если потом этот перенос надо будет последовательно по всем разрядам тащить? С умножением будет не лучше.
...
Рейтинг: 0 / 0
C++ BigIntegers parallel library
    #38392390
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
?Что толку от параллельного сложения циферок, если потом этот перенос надо будет
последовательно по всем разрядам тащить? С умножением будет не лучше.
Ш-ш-ш-ш, не спойлери. Дай ему пройти по всем граблям, иначе образовательного эффекта не будет.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
C++ BigIntegers parallel library
    #38392400
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SerValmaytonSerVal, а какие задачи ты решаешь? Криптография?
Не, сам я в криптографии не разбираюсь. Но есть ребятки, которые интересуются криптоанализом шифров Bivium и Trivum.

Чел, ну насколько я знаю, крипто-библиотеки просто используют MMX/SSE наборы команд чтобы работать
с длинной арифметикой. Причём у них длинная арифметика изначально, на уровне постановки ограничена
в разрядности. К примеру задались регистром в 512 бит. И работают с такими регистрами. Если там
умножение или сложение - то обычно по модулю. Тоесть переноса в самый старший разряд нету. Из
этого и танцуют. Юзать для криптографии BigInteger - ну не знаю. Наверное это слишком уж Generic-решение.

И что у тебя вообще за операции? На высоком уровне. Разложение на множители?

Я к тому что есть разные подходы к оптимизации.
...
Рейтинг: 0 / 0
C++ BigIntegers parallel library
    #38392436
SerVal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
GuestУгу, складываете вы параллельно к примеру 555....5555 и 444....4445. И у вас возник перенос в последнем разряде. Что толку от параллельного сложения циферок, если потом этот перенос надо будет последовательно по всем разрядам тащить? С умножением будет не лучше.
Ну, если бы перенос возникал только в последнем разряде - всё было бы просто:
добавить единичку в старший разряд при сложении или остаток от деления на 10 при умножении(при базе=10) :)

Однако ж, проблема давно известна, и, разумеется, решена: никто переносы последовательно не тащит. Вот тут
"Введение в параллельные и распределённые алгоритмы": описано параллельное сложение больших чисел:
http://www.toves.org/books/distalg/#3.3
Однако ж, реализации нетути. То что на аглицком, это ещё ладно. Похоже, там какие-то недоговорённости, не позволяющие ущучить смысл и реализовать на С++. Ну, или у меня недостаточно мозгов(что тоже не исключается).
Больше никакой теории найти не могу. На русском - и подавно(всё в закромах Родины).

Ежели кто знает как реализовать параллельный сумматор с переносами, прошу поделиться ссылкой(на или алгоритм или реализацию). А то чёта всё застопорилось. :(
...
Рейтинг: 0 / 0
C++ BigIntegers parallel library
    #38392443
m_Sla
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SerValДобрый день, m_Sla .

Про n1.add(n2) - какое ж это сложение?
Это не "А= В+С", а реализация оператора "+=". -> A += B
- теряется одно из слагаемых - оно становится результатом.
...это как говорят в Одессе - две большие разницы. :)
...У меня почти тоже самое:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
void BigInt::add(BigInt& summand)
{
    vector<char> rez; //все равно создаю временное хранилище
    ...

    number=rez; // а потом копирую новый результат
}

Знаю, что не оптимально, но мне переделывать лень. )))
...
Рейтинг: 0 / 0
C++ BigIntegers parallel library
    #38392453
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SerValстрока1 : 100000000 цифр.
строка2 : 100000000 цифр.
Конструируем 2 числа:
Exec time : 7.85 seconds.
==================
CPU: A = add(B,C)
Exec time : 17 seconds.

У меня больше 100 мс на сложение не получается. Даже миллиард цифр в секунду укладывается.
Безо всякой оптимизации.
Вот тупо за 5 мин накидал код. Дарю.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
#include <iostream>
#include <iomanip>
#include <fstream>
#include <string>
#include <algorithm>
#include <vector>
#include <typeinfo>
#include <boost/date_time.hpp>
#include <boost/lexical_cast.hpp>

using namespace std;

std::string gen_dec_string(size_t len)
{
    std::string res;
    res.reserve(len);
    for (size_t i = 0; i != len; ++i) {
        char ch = '0' + rand() % 10;
        res += ch;
    }
    return res;
}

struct timing
{
    boost::posix_time::ptime t;
    size_t num;
    timing()
    {
        t = boost::posix_time::microsec_clock::universal_time();
        num = 0;
    }
    void print(const std::string& msg)
    {
        cout << (++num) << ": " <<  msg << ": " << (boost::posix_time::microsec_clock::universal_time() - t) << endl;
        t = boost::posix_time::microsec_clock::universal_time();
    }
    void start()
    {
        t = boost::posix_time::microsec_clock::universal_time();
    }
};



class BigInt
{
public:
    BigInt() { set("0"); }
    BigInt(const std::string& str) { set(str); }
    void set(const std::string& str);
    void add(const BigInt& o);
    std::string to_string() const;

private:
    std::vector<boost::uint32_t> data; // base-1e9 encoded decimal, LE ordering
    static const size_t base_len = 9;
    static const boost::uint32_t base = 1000000000ul;
    //static const size_t base_len = 1; // даже так дает до 1 сек сложение
    //static const boost::uint32_t base = 10ul;
};

void BigInt::set(const std::string& str)
{
    assert(!str.empty());
    data.clear();
    data.reserve(str.size() / base_len + 2);
    size_t pos;
    for (pos = str.size(); pos >= base_len; pos -= base_len) {
        boost::uint32_t digit = boost::lexical_cast<boost::uint32_t>(str.substr(pos - base_len, base_len));
        data.push_back(digit);
    }
    if (pos) {
        data.push_back(boost::lexical_cast<boost::uint32_t>(str.substr(0, pos)));
    }
}

string BigInt::to_string() const
{
    assert(!data.empty());
    std::string res;
    res.reserve(data.size() * base_len);
    char buf[10];
    const char* format = "%u";
    for (size_t i = data.size(); i != 0; --i) {
        sprintf(buf, format, data[i - 1]);
        res += buf;
        format = "%09u";
    }
    return res;
}

void BigInt::add(const BigInt& o)
{
    assert(!data.empty());
    assert(!o.data.empty());
    if (data.size() < o.data.size()) {
        data.reserve(o.data.size() + 1);
        data.resize(o.data.size() + 1);
    }
    boost::uint32_t carry = 0;
    for (size_t i = 0; i != o.data.size(); ++i) {
        carry += data[i] + o.data[i];
        if (carry >= base) {
            data[i] = carry - base;
            carry = 1;
        }
        else {
            data[i] = carry;
            carry = 0;
        }
    }
    if (carry) {
        if (data.size() > o.data.size()) {
            data[o.data.size()] += carry;
        }
        else {
            data.push_back(carry);
        }
    }
}




int main()
{
    timing t;
    t.start();
    std::string n1s = gen_dec_string(100000000);
    t.print("gen n1");
    t.start();
    BigInt n1(n1s);
    t.print("init n1");
    t.start();
    std::string n2s = gen_dec_string(100000000);
    t.print("gen n2");
    t.start();
    BigInt n2(n1s);
    t.print("init n2");
    t.start();
    n1.add(n2);
    t.print("add n1 += n2");
    return 0;
}


...
Рейтинг: 0 / 0
C++ BigIntegers parallel library
    #38392498
SerVal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день, mayton .
maytonЮзать для криптографии BigInteger - ну не знаю. Наверное это слишком уж Generic-решение.
И что у тебя вообще за операции? На высоком уровне. Разложение на множители?
Я к тому что есть разные подходы к оптимизации.
У ребят есть свой программист на зарплате. Он им сейчас на КУДЕ делает.

Библиотека нужна мне. Ну, скажем для личных нужд. Никаких денех я за это не получаю, и в обозримом будущем не получу.
По работе я ничего не программирую. Я, вообще, не программист. С++ для меня не более, чем удобный калькулятор.
(C# тоже годится, но уж больно медленный). Ну вот захотелось мне попроверять кое-что.. у каждого свои тараканы в голове...

А числа большие, даже в памяти не помещаются. Вот и пришла мне мысль, что вычисляя параллельно на 1600 процессорах результат можно получить немного быстрее, чем на одном. Началось, как писал выше, с поиска подходящей библиотеки..которой, как оказалась нетути. Точнее, у "Cray MP" она есть.. у меня нетути. *как-то Таг :)

*простые числа, разложение на множители.. это тоже. :)
...
Рейтинг: 0 / 0
C++ BigIntegers parallel library
    #38392528
SerVal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ребятки, спасибо за отклики. Я сейчас внимательно всё посмотрю и отвечу.
Однако ж и меня к вам вопрос: Вы на самом деле считаете, что вычисления на 1600 процессорах медленнее, чем на одном???
Интересно, как бы вы рассуждали, будь у вас в процессоре хотя бы 1000 ядер?

*ладно, ладно.. помнится во времена, когда "процессоры Интел ускоряли Интернет" нам обещали 80 ядер. Ну, хоть 80. :)
...
Рейтинг: 0 / 0
C++ BigIntegers parallel library
    #38392538
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SerValА числа большие, даже в памяти не помещаются. Вот и пришла мне мысль, что вычисляя параллельно на 1600 процессорах результат можно получить немного быстрее, чем на одном. Началось, как писал выше, с поиска подходящей библиотеки..которой, как оказалась нетути. Точнее, у "Cray MP" она есть.. у меня нетути. *как-то Таг :)

*простые числа, разложение на множители.. это тоже. :)
Я думаю что это забавный мозговой эксперимент. Сама по себе задача сложения многоразрядных
чисел давно вдоль и поперёк изъезжена и ничего здесь поделать нельзя. Яркий пример - деление
или нахождение остатка от деления. Операция принципиально несократимая. Ее можно иногда
задавать таблично, иногда что-то кешировать но один хрен она - тот самый гранит который грызут
все криптоаналитики. По сути она-же защищает наши засекюренные файлы от "жены" и "спецслужб".
(подчеркнуть что опаснее !).

А если серъезно - то факторизация гораздо интереснее чем то чем ты занят. Поинтересуйся как-нибудь.
Можно зацепить краем теорвер, теорию чисел, алгебру.
...
Рейтинг: 0 / 0
C++ BigIntegers parallel library
    #38392541
?
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
?
Гость
SerValъПохоже, там какие-то недоговорённости, не позволяющие ущучить смысл и реализовать на С++ну там отсылка к разделу 3.1 (parallel prefix scan) - это самая сложная часть.
...
Рейтинг: 0 / 0
C++ BigIntegers parallel library
    #38392551
?
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
?
Гость
SerValЕжели кто знает как реализовать параллельный сумматор с переносами, прошу поделиться ссылкой(на или алгоритм или реализацию). А то чёта всё застопорилось. :( http://literaturki.net/elektronika/cifrovaya-shemotehnika1/165-parallelnye-summatory-s-parallelnym-perenosom (шутка)
...
Рейтинг: 0 / 0
C++ BigIntegers parallel library
    #38392565
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonЯ думаю что это забавный мозговой эксперимент.
Скорее это очень хороший способ прокачать мозг ТСа. Возможно, в результате он дойдёт до уровня, достаточного для того, чтобы раскрыть один маленький секрет длинной арифметики:
гораздо эффективнее и проще распараллеливать конечный алгоритм чем элементарные операции.
...
Рейтинг: 0 / 0
C++ BigIntegers parallel library
    #38393118
m_Sla
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SerValОднако ж, проблема давно известна, и, разумеется, решена: никто переносы последовательно не тащит. Вот тут
"Введение в параллельные и распределённые алгоритмы": описано параллельное сложение больших чисел:
http://www.toves.org/books/distalg/#3.3
Однако ж, реализации нетути. То что на аглицком, это ещё ладно. Похоже, там какие-то недоговорённости, не позволяющие ущучить смысл и реализовать на С++. Ну, или у меня недостаточно мозгов(что тоже не исключается).
Больше никакой теории найти не могу. На русском - и подавно(всё в закромах Родины).

Ежели кто знает как реализовать параллельный сумматор с переносами, прошу поделиться ссылкой(на или алгоритм или реализацию). А то чёта всё застопорилось. :(реализация алгоритма на С в лоб, без всякой оптимизации и без распараллеливания
см. void BigInt::parallel_add(BigInt& s):
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
191.
192.
193.
194.
195.
196.
197.
198.
199.
200.
201.
202.
203.
204.
205.
206.
207.
208.
209.
210.
211.
212.
213.
214.
215.
216.
217.
218.
219.
220.
#include <iostream>
#include <vector>
#include <string>
#include <cstring>

#include <stdio.h>      /* printf */
#include <time.h>       /* clock_t, clock, CLOCKS_PER_SEC */

#include "vectorclass.h" // http://www.agner.org/optimize/vectorclass.zip

using namespace std;

//=======================================================================
class BigInt
{
public:
    BigInt() { };

    void print();
    void fromString(const std::string& str);
    void add(BigInt& num);
    void parallel_add(BigInt& s);

    size_t getLength() const
    {
        return number.size();
    }

    enum Sign { negative = -1, zero = 0, positive = 1 };
private:
    Sign sign;
    vector<char> number;
};
//=======================================================================
void BigInt::print()
{
    cout<<endl<<"num size="<<number.size()<<endl<<"num=";
    for (int i=number.size()-1; i>=0; i--)
    {
        cout<< (char)(number[i]+'0');
    }
    cout<<endl;
}
//=======================================================================
void BigInt::fromString(const std::string& str)
{
    int str_size= str.size();
    if(str_size&15)
    {
        str_size = (str_size&0xfffffff0) + 16;
    }

    number.reserve(str_size+16);
    for (int i = str.size()-1; i>=0; i--)
    {
        number.push_back(str[i]-'0');
    }
}
//=======================================================================
void BigInt::add(BigInt& summand)
{
        //
}
//=======================================================================
void print_vector(vector<char> &v)
{
    for(size_t i=0,imax=v.size();i<imax;i++)
    {
        cout<<(char)(v[i]+'0')<<",";
    }
    cout<<endl;
}
//=======================================================================
char get_our_operator(char x, char y) //см. 3.3 табл.  x y | x &#8855; y
{
    if(y==0) //y==N?
    {
        return 0;
    }
    else if(y==1) //y==C?
    {
        return 1;
    }
    else // y == M
    {
        return x;
    }
}
//=======================================================================
//#define debug_output
void BigInt::parallel_add(BigInt& s)
{
    size_t summand_size=s.number.size();
    if(number.size() < summand_size)
    {
        number.reserve(summand_size+1);
        number.resize(summand_size);
    }

    vector<char> carry;
    vector<char> summand=s.number;

    carry.reserve(number.size()+1);
    carry.resize(number.size()+1);
    summand.reserve(number.size());
    summand.resize(number.size());

    #ifdef debug_output
    cout<<endl<<"== Add =="<<endl;
    print_vector(number);
    print_vector(summand);
    #endif

    //заполняем <c>
    for(size_t i=0,imax=number.size();i<imax;i++)
    {
        char sum=number[i]+summand[i];
        if(sum > 9)
        {
            carry[i]=1; // C
        }
        else if(sum == 9)
        {
            carry[i]=2; // M
        }
        else
        {
            carry[i]=0; // N
        }
    }
    #ifdef debug_output
    print_vector(carry);
    #endif

    // заполняем <prefix scan>, сразу оставляем 0( нет переноса - N или M ) или 1 ( есть перенос - С )
    char total = carry[0];
    carry[0] = total & 1;
    for(size_t i=1,imax=number.size();i<imax;i++)
    {
        total=get_our_operator(total,carry[i]);
        carry[i]= total & 1;
    }
    #ifdef debug_output
    print_vector(carry);
    #endif

    // из <prefix scan> получаем <carries>
    memmove(carry.data()+1,carry.data(),carry.size()-1);
    carry[0]=0;
    #ifdef debug_output
    print_vector(carry);
    #endif

    //сложение
    for(size_t i=0,imax=number.size();i<imax;i++)
    {
        number[i]=(number[i] + summand[i] + carry[i]) % 10;
    }
    if(carry.back()==1)
    {
        number.push_back(1);
    }
    #ifdef debug_output
    print_vector(number);
    #endif
}
//=======================================================================
int main()
{
    BigInt n1,n2;
    string num1,num2;

    clock_t t;

    t = clock();

    const size_t NUMBER_OF_DIGITS=10;

    num1.reserve(NUMBER_OF_DIGITS*10);
    num2.reserve(NUMBER_OF_DIGITS*10);
    for(size_t i=0; i<NUMBER_OF_DIGITS; i++)
    {
        num1+="1234567123";
        num2+="7654321765";
        //num2+="909999999";
    }
    //num1="1";

    t = clock() - t;
    printf ("==================\nConstruct 2 strings \nExec time : %f seconds.\n==================\n",((float)t)/CLOCKS_PER_SEC);

    t = clock();
    n1.fromString(num1);
    n2.fromString(num2);
    t = clock() - t;
    printf ("Construct 2 numbers \nExec time : %f seconds.\n==================\n",((float)t)/CLOCKS_PER_SEC);

    if(n1.getLength()>1000)
    {
        cout<<"n1.size="<<n1.getLength()<<endl;
        cout<<"n2.size="<<n2.getLength()<<endl;
    }
    else
    {
        n1.print();
        n2.print();
    }

    t = clock();
    //n1.add(n2);
    n1.parallel_add(n2);
    t = clock() - t;
    printf ("CPU: A = parallel_add(B,C)\nExec time : %f seconds.\n==================\n",((float)t)/CLOCKS_PER_SEC);

    if(n1.getLength()<=1000) n1.print();

    cout<<"add.size="<<n1.getLength()<<endl;

    return 0;
}

P.S. сильно не проверял, возможны ошибки
...
Рейтинг: 0 / 0
C++ BigIntegers parallel library
    #38393163
?
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
?
Гость
m_Slaреализация алгоритма на С в лоб, без всякой оптимизации и без распараллеливания
см. void BigInt::parallel_add(BigInt& s):Дык, там все самое сложное в распараллеливании prefix scan. А вы его циклом сделали, который не распараллеливается. А остальное то элементарно.
...
Рейтинг: 0 / 0
C++ BigIntegers parallel library
    #38393231
m_Sla
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
?m_Slaреализация алгоритма на С в лоб, без всякой оптимизации и без распараллеливания
см. void BigInt::parallel_add(BigInt& s):Дык, там все самое сложное в распараллеливании prefix scan. А вы его циклом сделали, который не распараллеливается. А остальное то элементарно.ну так надо ТСу, а не мне
пусть распараллеливает
...
Рейтинг: 0 / 0
C++ BigIntegers parallel library
    #38393986
SerVal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2 Anatoly Moskovsky :
Посмотрел Ваш подарок. Аппетитный такой подарок, спасибо. *правда, в нём непонятная библиотека boost. Про буст я не знаю.

m_Sla , Вы молодец, разобрались. Спасибо. Правда в Вашем коде я пока разобраться не могу.
Однако ж сам дошёл до получения вектора <carry>. Получить из <prefix scan> <carries> пока не получается. :(
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
a:                < 9, 7, 5, 3, 1> 
b:                < 3, 2, 1, 8, 6> 
c:                < C, M, N, C, N> 
prefix scan:  < C, C, N, C, N> 
carries:        < 0, 1, 1, 0, 1> 
sum:            < 2, 0, 7, 1, 8> 

// из <prefix scan> получаем <carries>
   memmove(carry.data()+1,carry.data(),carry.size()-1);
   carry[0]=0;



Как Вы получаете из <prefix scan> <carries> - ещё непонятнее. Каким-то копированием памяти? ??? Совсем непонятно.
Я пробую так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
#define _carry_ 'C'
#define _maybe_ 'M'
#define _never_ 'N'

char carryPlusOps(char x,char y)
{
	if((x==_never_) & (y==_never_)) return _never_;
	if((x==_never_) & (y==_maybe_)) return _never_;
	if((x==_never_) & (y==_carry_)) return _carry_;
	
	if((x==_maybe_) & (y==_never_)) return _never_;
	if((x==_maybe_) & (y==_maybe_)) return _maybe_;
	if((x==_maybe_) & (y==_carry_)) return _carry_;

	if((x==_carry_) & (y==_never_)) return _never_;
	if((x==_carry_) & (y==_maybe_)) return _carry_;
	if((x==_carry_) & (y==_carry_)) return _carry_;

	return x;
}

void addParallel()
{
	// заполняем цифрами из примера:
	std::vector<int> a; // <9,7,5,3,1>
	a.push_back(9); a.push_back(7); a.push_back(5);	a.push_back(3); a.push_back(1);

	std::vector<char> b; // < 3, 2, 1, 8, 6>
	b.push_back(3); b.push_back(2); b.push_back(1); b.push_back(8); b.push_back(6);
	// Ок.

	// заполняем <c> 
	std::vector<char> c(a.size(),0); // < C, M, N, C, N> 
	for(int idx=0; idx <c.size(); idx++)
	{
		int ab_sum=a[idx] + b[idx];
		if(ab_sum>=10) c[idx]= _carry_;
		else
			if(ab_sum<9) c[idx]= _never_;
			else c[idx]= _maybe_;
	}
	// Ок. <c> cоответствует.

	// заполняем <prefix scan> 
	std::vector<char> prefix_scan(c.size()); // < C, C, N, C, N> 

	char total = c[0];
    prefix_scan[0] = total;
	 
	for(size_t i=1; i< a.size(); i++)
    {
		total=carryPlusOps(total,c[i]);
		prefix_scan[i]= total;
	}
	// Ок. prefix_scan cоответствует.

	// заполняем carry
	std::vector<int> carry(a.size(), 0); // < 0, 1, 1, 0, 1>  

	for(int idx=0; idx<carry.size(); idx++)
	{
		if(prefix_scan[idx]== _carry_)
				carry[idx] = 1;
	}
	// !!! === Фигу. не соответствует. === !!! :( 

	carry[0]=0;
	// складываем, учитывая переносы
	std::vector<int> out(a.size()); 
	for(size_t n=0;  n<a.size(); n++)
	{
		out[n]= a[n]+b[n]+carry[n];
		if(out[n]>=10) out[n]-=10; 
	}
	// если есть перенос в старшем разряде - увеличить число цифр на 1.
	if(carry.back() > 0)
		out.push_back(carry.back());
	
	// out < 2, 0, 7, 1, 8> 
}


Векторы независимые, чтобы после того как заработает, распараллелить. Тружусь..
Всем привет и хорошего настроения. :)
...
Рейтинг: 0 / 0
C++ BigIntegers parallel library
    #38393997
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SerValправда, в нём непонятная библиотека boost. Про буст я не знаю.
...
Рейтинг: 0 / 0
C++ BigIntegers parallel library
    #38394006
SerVal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
maytonА если серьёзно - то факторизация гораздо интереснее чем то чем ты занят. Поинтересуйся как-нибудь.
Можно зацепить краем теорвер, теорию чисел, алгебру.
Этим всё равно придётся заняться. Патамушта держать в памяти BigInt-ы (векторы с миллиардом знаков) - это ж никакой памяти не хватит. Только для примеров.
Если число долго не используется, может быть есть смысл хранить его в факторизованном виде. Или как-то упакованным. А при необходимости - распаковывать. Но пока об этом рано говорить. Этим можно заняться после базовых операций(сложение, умножение..). Факторизация, в этом случае, тоже должна быть быстрой. Думаю, и тут 1600 процессоров помогут. :)
...
Рейтинг: 0 / 0
C++ BigIntegers parallel library
    #38394039
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SerVal, простые числа (prime numbers) не раскладываются на можнители. В этом кстати и соль
этой задачи - в поиске подобных чисел.

Природа кстати такие задачи обходит и просто не решает. Просто ей не нужна чисельная точность
до младшего разряда. Тот-же double или extended можно рассматривать как как biginteger но
с экспоненциальной сеткой. Тоесть чем больше число - тем грубее у него абсолютная погрешность.

Можно удобно посчитать соотношение поперечника вселенной к диаметру электрона и решить
это в double и получить вполне вменяемый с точки зрения физики ответ.

В твоих числах для решения этой задачи толку нет. Мы всё равно не можем с точностью
до микрометра посчитать поперечник вселенной. Погрешности числителя и знаменателя
разные.

Улавливаешь?
...
Рейтинг: 0 / 0
C++ BigIntegers parallel library
    #38394069
SerVal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
mayton , простые числа тоже как-то хранят. Типа 2^n+1. Мож и остальные так хранить.
Ну а насчёт природы.. ээ.. Неперу про его логарифмы чего только не говорили.. Лет 300 оне без применения лежали. :)
...
Рейтинг: 0 / 0
C++ BigIntegers parallel library
    #38394075
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ты нарисовал формулу похожую на "числа Мерсена". С некоторым отличием там минус 1 а не плюс. Отлично.
Но это не все простые числа а лишь ничтожно малая их часть. Кроме того тебе никто не обещал сжатия
места после факторизации. Это ты сам неверное придумал? Факторизация она ... для других дел.

Я про то что физика, как наука о природе довольствуется расчётами в double. Ей не нужны копейки в младших
разрядах.

Так-то...
...
Рейтинг: 0 / 0
C++ BigIntegers parallel library
    #38394079
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SerValдержать в памяти BigInt-ы (векторы с миллиардом знаков) - это ж никакой
памяти не хватит.
А я это говорил ещё на первой странице... Да и для целей криптографии (где простые числа в
основном и используются) гораздо выгоднее числа держать в двоичном виде, а не
двоично-десятичном как у тебя. Работает оно так потом быстрее.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
C++ BigIntegers parallel library
    #38394100
SerVal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
mayton , я с Вами полностью согласен. И с Вами, Дмитрий .
И зачем библиотеки для больших чисел.. а Микрософт недавно добавила в C#.. :)

*хранить в int-ах приходится потому, что у акселераторов пока нет типа char. Делают.
и векторы у них есть только короткие, типа rgbi.
...
Рейтинг: 0 / 0
C++ BigIntegers parallel library
    #38394122
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SerVal,

От буйной фантазии юного (ш)кодера нет спасения ни для железа ни для софта и вобщем
то голове покоя тоже нет. Я не знаю что там Mircrosoft ввела но кажется в С#/Net decimal
существовал давно и его основное назначение - работа с финансовыми расчётами
и сопряжение с типами данных в DBMS и конвертация туда и обратно.

Я не знаю зачем там тебе так сильно нужна хардкорная оптимизация сложения
ну если уж так сильно хочется - почитай про:
- BCD арифметику
- Учебник Юрова (2 издание) Assembler - Глава 8 - Арифм.операции над двоично-десятичными числами (команды
AAA, ADC, AAS, AAM, AAD).

P.S. Тут в смежном форуме тоже был один перфекционист. Пилил свою In-memory db с ооочень
быстрым откликом. Только вот любое сопряжение с ней из .Net к примеру просаживало отклики
тысячекратно. Вот такой вот архитектурный промах-с. Так ште... не ошибись дверью.
...
Рейтинг: 0 / 0
C++ BigIntegers parallel library
    #38394143
SerVal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
mayton , если я Вам так сильно мешаю. не обязательно ведь заглядывать в эту ветку. Не правда ли?
...
Рейтинг: 0 / 0
C++ BigIntegers parallel library
    #38394148
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Извини брадт. Я всё таки модератор.
...
Рейтинг: 0 / 0
C++ BigIntegers parallel library
    #38394153
SerVal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
maytonИзвини брадт. Я всё таки модератор.
Ну и замечательно.
В таком случае, не буду утомлять модераторов и остальных участников форума "буйными фантазиями юного шкодера".
Всем хорошего настроения.
За сим, разрешите откланяться.
С уважением, SerVal.
...
Рейтинг: 0 / 0
C++ BigIntegers parallel library
    #38394207
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SerValПро буст я не знаю.
Может оно и к лучшему. Меньше знаешь - крепче спишь.
Но не беспокойтесь, это вовсе не благодаря Бусту все работает быстрее в сотни раз :)
...
Рейтинг: 0 / 0
C++ BigIntegers parallel library
    #38394225
m_Sla
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SerVal m_Sla , Вы молодец, разобрались. Спасибо. Правда в Вашем коде я пока разобраться не могу.
Однако ж сам дошёл до получения вектора <carry>. Получить из <prefix scan> <carries> пока не получается. :(
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
a:                < 9, 7, 5, 3, 1> 
b:                < 3, 2, 1, 8, 6> 
c:                < C, M, N, C, N> 
prefix scan:  < C, C, N, C, N> 
carries:        < 0, 1, 1, 0, 1> 
sum:            < 2, 0, 7, 1, 8> 

// из <prefix scan> получаем <carries>
   memmove(carry.data()+1,carry.data(),carry.size()-1);
   carry[0]=0;

Как Вы получаете из <prefix scan> <carries> - ещё непонятнее. Каким-то копированием памяти? ??? Совсем непонятно.<prefix scan> сдвигаем вправо на один разряд и получается <carries>

Как распараллелить <prefix scan> написано тут http://www.toves.org/books/distalg/#3.1
...
Рейтинг: 0 / 0
C++ BigIntegers parallel library
    #38394236
?
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
?
Гость
maytonА если серъезно - то факторизация гораздо интереснее чем то чем ты занят. Поинтересуйся как-нибудь.
Можно зацепить краем теорвер, теорию чисел, алгебру.Да-да. Попробуйте разложить на множители число ну хотя бы с 300 десятичными цифрами.
...
Рейтинг: 0 / 0
C++ BigIntegers parallel library
    #38395193
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
?maytonА если серъезно - то факторизация гораздо интереснее чем то чем ты занят. Поинтересуйся как-нибудь.
Можно зацепить краем теорвер, теорию чисел, алгебру.Да-да. Попробуйте разложить на множители число ну хотя бы с 300 десятичными цифрами.
При чём здесь 300? Я автору предложил интересное поле для экспериментов. Задача факторизации
более интересна и познавательна чем сложение. Я сам не претендую ни на что. Только подсказываю.
...
Рейтинг: 0 / 0
C++ BigIntegers parallel library
    #38395440
?
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
?
Гость
maytonПри чём здесь 300?Ну просто типичный размер для RSA
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
C++ BigIntegers parallel library
    #38929993
SerVal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ребятки, я тут маленько сложение доделал. Однако ж результаты не впечатляют. :(

D:\aProjects\TestBigInt\x64\Release>TestBigInt.exe -nvidia
Accelerator : NVIDIA GeForce GTX 980
==============
BigInt1 размер : 10 миллионов цифр.
BigInt2 размер : 10 миллионов цифр.
Loop = 100

Addition on CPU: 33.8 seconds.
Addition on GPU: 26.8 seconds.
******
При сложении на видеокарте она загружена на 3-5%, а ЦПУ на все 100%.
Понятно, что и ускорения как такового нетути. Подозреваю, что это из-за неподходящей структуры BigInt.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
class BigInt {
public:
BigInt() { };
BigInt(const std::string&); // конструктор из строки

private:
std::vector<int> number; // здесь хранятся цифры
};


Вектор для хранения удобен, но очень медленно заполняется значениями: resize(), push(), push()..
Нельзя ли заполнить вектор из строки параллельно? (чёта никакой идеи по этому поводку нетути).
Или изменить сам класс BigInt? *идеи тоже нетути.
...
Рейтинг: 0 / 0
C++ BigIntegers parallel library
    #38930008
SerVal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Понатыкал где только можно #pragma loop(hint_parallel(4))
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
//***************************
// конструктор из строки
BigInt::BigInt(const std::string& str)
{
    int str_size= str.size();
    number.reserve(str_size+1);

   #pragma loop(hint_parallel(4))
    for (int i = str_size-1; i>=0; i--)
    {
        number.push_back(str[i]-'0');
     }
}

... но не помогло. :)
...
Рейтинг: 0 / 0
C++ BigIntegers parallel library
    #38930019
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SerValВектор для хранения удобен, но очень медленно заполняется значениями: resize(), push(), push()..


Есть мощный ускоритель -- reserve().

SerValНельзя ли заполнить вектор из строки параллельно?


resize(), push(), push( -- это:

выделение новой памяти нужного нового размера

копирование элементов из старой памяти в новую в пределах минимума из старого и нового размера

выполнение конструкторов для элементов (новый размер - старый размер)

выполнение деструкторов для элементов (старый размер - новый размер)

сам подумай, какие из этих операций можно распараллеливать.
...
Рейтинг: 0 / 0
C++ BigIntegers parallel library
    #38930020
SerVal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ну и появилась ценная идея: может хранить большие числа в научной нотации?
Типа: a*2^n+b; Тогда можно ускорителю передавать не огромные строки, а числа a, n и b.

ГПУ всё равно делать нечего, пусть сам в своей памяти и распакует перед сложением.
А результат вернёт тоже в научном виде.

*правда как распаковывать я тоже не знаю, но где-то ж, наверное, написано?
...
Рейтинг: 0 / 0
C++ BigIntegers parallel library
    #38930041
SerVal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MasterZivЕсть мощный ускоритель -- reserve().

- reserve() уже используется (посмотрите код выше).
Посмотрю пока как распаковывать научную нотацию в массив int[].
...
Рейтинг: 0 / 0
C++ BigIntegers parallel library
    #38930378
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SerValНу и появилась ценная идея: может хранить большие числа в научной нотации?
Типа: a*2^n+b; Тогда можно ускорителю передавать не огромные строки, а числа a, n и b.

ГПУ всё равно делать нечего, пусть сам в своей памяти и распакует перед сложением.
А результат вернёт тоже в научном виде.

Чел. Это просто какой-то фейспалм! Во первых не все числа точно представимы в сабж.

Во вторых что значит "ГПУ всё равно делать нечего". Это что ? Откуда? Как так
вообще можно делать постановки?!

А потом в дайджестах новостей софта и железа стоит плачь и вопль великий... дескыть
железо греется без причины.... занято неизвестно чем... Может адварь какой или троян?
...
Рейтинг: 0 / 0
C++ BigIntegers parallel library
    #38930407
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonSerValНу и появилась ценная идея: может хранить большие числа в научной нотации?
Типа: a*2^n+b; Тогда можно ускорителю передавать не огромные строки, а числа a, n и b.

Во первых не все числа точно представимы в сабж.
Все, только a и b будут иметь порядок максимального sqrt(a*2^n+b)
Например для любого x64 числа это а и b размером до 2^32 и n = 32

Только не понимаю зачем строки, когда можно считать массив N байт одним числом из 8N бит. Например 10 байт это числа до 2^80
...
Рейтинг: 0 / 0
C++ BigIntegers parallel library
    #38930448
SerVal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
maytonЭто просто какой-то фейспалм! Во первых не все числа точно представимы в сабж.
Спасибо что сказали. Теперь буду знать. Заодно и не буду тратить время на поиск преобразования таких чисел в массив.
Поищу в интернете - нет ли какого другого компактного формата представления больших целых чисел.
*****
Для нВидии карт выпустили библиотеку для работы с большими числами. Называется CUMP. Какой-то умный японец сделал.
А для С++ AMP такой библиотеки нетути. :(

*cобственно говоря мне нужна не столько библиотека, сколько функции типа isDivider(number), isPrime(number)..
...
Рейтинг: 0 / 0
C++ BigIntegers parallel library
    #38930483
SerVal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima ТВсе, только a и b будут иметь порядок максимального sqrt(a*2^n+b)
Например для любого x64 числа это а и b размером до 2^32 и n = 32

a, b, n - от 0 до MAXUINT64. К тому же база может быть и не двойкой, а десяткой или больше.

Только не понимаю зачем строки, когда можно считать массив N байт одним числом из 8N бит. Например 10 байт это числа до 2^80
Ну, тогда нужна какая-то библиотека или исходники, чтобы можно было складывать и вычитать числа из 8N бит.
У меня такой нетути. К тому же для вычислений на ГПУ библиотеки для ЦПУ не подходят, то есть надо исходник.
...
Рейтинг: 0 / 0
C++ BigIntegers parallel library
    #38930540
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SerValУ меня такой нетути. К тому же для вычислений на ГПУ библиотеки для ЦПУ не подходят, то есть надо исходник.
GMP посмотри, она с исходниками вроде
...
Рейтинг: 0 / 0
C++ BigIntegers parallel library
    #38930698
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TSerValУ меня такой нетути. К тому же для вычислений на ГПУ библиотеки для ЦПУ не подходят, то есть надо исходник.
GMP посмотри, она с исходниками вроде
Кстати ты нашёл где там "gmp.h" ? Я - нет.
...
Рейтинг: 0 / 0
C++ BigIntegers parallel library
    #38930742
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonКстати ты нашёл где там "gmp.h" ? Я - нет.
ЕМНИП Он в процессе сборки либы появляется. В виндовсе сам ниасилил. Мне дали готовую .lib для MSVC2008 с gmp.h
в линуксе надо сначала отдельным пакетом установить (libgmp-dev) и при компиляции так
Код: plaintext
1.
g++ ... -lgmp
...
Рейтинг: 0 / 0
C++ BigIntegers parallel library
    #38930751
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ОК. У меня MinGW для Windows. Я попробую доустановить пакеты поддержки GMP для начала.
Если не выйдет по попрошу у тебя собранную либу.
...
Рейтинг: 0 / 0
C++ BigIntegers parallel library
    #38930774
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonОК. У меня MinGW для Windows. Я попробую доустановить пакеты поддержки GMP для начала.
В дебиан все просто, одна строчка
Код: plaintext
1.
sudo apt-get install libgmp-dev


и пользуйся.
maytonЕсли не выйдет по попрошу у тебя собранную либу.
Боюсь что не поможет. Она у меня x32 для виндовса. А у тебя x64
...
Рейтинг: 0 / 0
C++ BigIntegers parallel library
    #38930789
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вроде получилось. Зашёл в GUI inst. manager. Накликал чекбоксов возле *gmp*. Что-то обновилось.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
install: libgmpxx-5.1.2-1-mingw32-dll-4.tar.lzma
 installing libgmpxx-5.1.2-1-mingw32-dll-4.tar.lzma
install: gmp-5.1.2-1-mingw32-dev.tar.lzma
 installing gmp-5.1.2-1-mingw32-dev.tar.lzma
install: gmp-5.1.2-1-mingw32-doc.tar.lzma
 installing gmp-5.1.2-1-mingw32-doc.tar.lzma
install: gmp-5.1.2-1-mingw32-info.tar.lzma
 installing gmp-5.1.2-1-mingw32-info.tar.lzma
install: gmp-5.1.2-1-mingw32-lic.tar.lzma
 installing gmp-5.1.2-1-mingw32-lic.tar.lzma


Вечером попробую.

P.S. Берегись Миллер. И этот чортов раввин....
...
Рейтинг: 0 / 0
C++ BigIntegers parallel library
    #38932595
Владимир2012
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonКстати ты нашёл где там "gmp.h" ? Я - нет.distclean-hdr:
-rm -f config.h stamp-h1
gmp.h: $(top_builddir)/config.status $(srcdir)/gmp-h.in
cd $(top_builddir) && $(SHELL) ./config.status $@
...
Рейтинг: 0 / 0
C++ BigIntegers parallel library
    #38932610
Barlone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TmaytonКстати ты нашёл где там "gmp.h" ? Я - нет.
ЕМНИП Он в процессе сборки либы появляется. В виндовсе сам ниасилил. Мне дали готовую .lib для MSVC2008 с gmp.h
в линуксе надо сначала отдельным пакетом установить (libgmp-dev) и при компиляции так
Код: plaintext
1.
g++ ... -lgmp

Под windows есть mpir - форк от gmp, подпиленный для сборки в VS.
...
Рейтинг: 0 / 0
C++ BigIntegers parallel library
    #38932664
Владимир2012
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TМне дали готовую .lib для MSVC2008 с gmp.h
Бывает иногда встречаешь интересный проект, а *.sln под него нет.
В таких случаях первым делом создаю *.sln /и жизнь становится веселей/.

PS: Сколько с C++ работаю, а c make не могу подружиться.
/но не потому что не понимаю как он работает/.
Скорее всего причина в том, что я ленюсь узнать как вести отладку проектов для
которых нет *.sln.

Кстати может кто подскажет как?
...
Рейтинг: 0 / 0
104 сообщений из 104, показаны все 5 страниц
Форумы / C++ [игнор отключен] [закрыт для гостей] / C++ BigIntegers parallel library
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]