2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




На страницу Пред.  1 ... 31, 32, 33, 34, 35
 
 Re: Как писать быстрые программы
Сообщение14.12.2025, 02:09 
Аватара пользователя
wrest в сообщении #1712442 писал(а):
Я понял так: у вас запущено четыре окна с сессиями WSL с Ubuntu, во всех окнах работает pari/gp,

Да.

wrest в сообщении #1712442 писал(а):
в трёх окнах в pari/gp работает какой-то for(),

Нет просто множитель при потоке указан. Это в самом верху .gp-файла:

Код:
/*
GP;default(parisizemax, 2^27);
GP;init_Rab_113_118_1();
*/

{t0=getwalltime();print;

potok = 0;

А в двух других окнах potok = 7; и potok = 8; соответственно.

wrest в сообщении #1712442 писал(а):
а в четвёртом работает parfor(i=1,6,...

Здесь вот так:

Код:
/*
GP;default(threadsize,128M);
GP;default(debugmem,0);
GP;init_Rab_113_118_2();
*/

funall ( potok:small ) = {

t0=getwalltime();print;

И уже в самом низу:

Код:
return(k48);
}

{parfor(potok = 1, 6, funall(potok));

print;print(strtime(getwalltime()-t0));print;
}quit

Или необязательно, чтоб функция хоть что-то возвращала?

 
 
 
 Re: Как писать быстрые программы
Сообщение14.12.2025, 06:50 
Аватара пользователя
Ну вот так-то. Юниты в отдельных окнах посчитались быстрее. Не сильно, но быстрее. 455 минут против 465. Буду ещё отдельно запускать 12 потоков в одном окне.

 
 
 
 Re: Как писать быстрые программы
Сообщение14.12.2025, 09:43 
Yadryara
Советую убедиться, что время считается верно, т.е. проследить как меняется переменная t0.
В функции em3 с 29-й страницы переменная t0 объявлена как локальная
my(t0=getwalltime());
Соответственно глобальная переменная с именем t0 если и есть, то не изменяется внутри функции em3.

 
 
 
 Re: Как писать быстрые программы
Сообщение14.12.2025, 10:09 
Аватара пользователя
wrest в сообщении #1712462 писал(а):
Советую убедиться, что время считается верно, т.е. проследить как меняется переменная t0.

Я смотрел по времени записи в лог. Старт многопоточной программы был в 21:37 и к новому юниту она перешла в 5:22. Старт очередного юнита в потоке 8 был в 21:46 и к новому юниту он перешёл в 5:21. То есть опережение на 10 минут.

wrest в сообщении #1712462 писал(а):
Соответственно глобальная переменная с именем t0 если и есть, то не изменяется внутри функции em3.

Да, в курсе. Но я здесь не использовал функцию em3, а объявил грубо говоря, всю программу funall.

 
 
 
 Re: Как писать быстрые программы
Сообщение14.12.2025, 10:47 
Yadryara в сообщении #1712465 писал(а):
Но я здесь не использовал функцию em3, а объявил грубо говоря, всю программу funall.

Я поэтому и посоветовал убедиться, т.к. в параллельном цикле вы вызываете funall
parfor(potok = 1, 6, funall(potok));
А в funall переменная t0 не объявлена через my() как локальная.
funall ( potok:small ) = {

t0=getwalltime();print;

Поскольку вы смотрите на абсолютное время, то всё Ок.

 
 
 [ Сообщений: 515 ]  На страницу Пред.  1 ... 31, 32, 33, 34, 35


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group