powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / C++ BigIntegers parallel library
25 сообщений из 104, страница 2 из 5
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
25 сообщений из 104, страница 2 из 5
Форумы / C++ [игнор отключен] [закрыт для гостей] / C++ BigIntegers parallel library
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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