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

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




На страницу Пред.  1 ... 83, 84, 85, 86, 87
 Re: Как писать быстрые программы
Аватара пользователя
Перешёл было к 8-кам. Но потом всё же решил вернуться к 7-кам, проверить другое количество потоков. Чтобы преодолеть порчу номеров, о которой рассказывал выше стал считал больше юнитов и паттернов. Скорость из-за этого упала. Но сравнительную табличку отчасти удалось состряпать.
Удивительная и хорошая новость: похоже что оптимум не в районе 8-9 потоков, а повыше, может даже больше 12-ти.

Смотрел вариант только для ECM, который по скорости был почти оптимальный, то есть скорость нахождения переваливала через 500 тысяч. Как сказал выше, она снизилась, но из-за удобства сравниваю пока для низкоскоростного варианта:

Код:
8-я фильтрация: ECM 1,1,80   9-я: ECM 1,1,80

                                           Av. Speed
Potoks       Pat   D(192,7)    Sеc    S/P    Kor/24h
     6      1440      5647    1093    758     446792
     8      1440      5647     944    655     517161
    10      1440      5647     860    597     567379
    12      1440                              600000 ?

Чем больше потоков, тем сложнее добиться чтобы все те самые 120 юнитов посчитались ровно по одному разу. Та самая порча номеров периодически происходит.

И вот я всё-таки решил попытаться преодолеть это программно. Квен сказал что это из-за гонки. Пока не удаётся полностью решить.

Батник для Винды

(Батник)

Код:

@echo off
title Ubuntu Scripts (Root)
set CHUNK=10
set WIN_COUNT=12
set /a LAST=%WIN_COUNT%-1

for /L %%A in (0,1,%LAST%) do (
    start "" wsl.exe -d Ubuntu-24.04 -u root bash -c "cd /home/yadryara/D192-7/1-0-6-0/ECM && ./run_chunk.sh %CHUNK% %%A; exec bash"
    powershell -Command "Start-Sleep -Milliseconds 430"
)

Он запускает run_chunk.sh :

(Шелловский батник)

Код:
#!/bin/bash

# 1. Принудительно сохраняем C-код в файл
gp2c -g -o Test_26.gp.c Test_26.gp

# 2. Компилируем в разделяемую библиотеку (1 раз)
gcc -shared -O2 -fPIC -o Test_26.gp.so Test_26.gp.c $(pkg-config --cflags --libs pari 2>/dev/null || echo "-lpari")

# 3. Создаём .run-файл вручную (гарантирует загрузку .so и корректный выход)
cat > Test_26.gp.run << 'EOF'
install("init_Test_26","vp","init_Test_26","./Test_26.gp.so");
default(parisizemax, 8192M);
init_Test_26();
quit
EOF

# 4. Многократный запуск
CHUNK_SIZE=$1      # автоматически подставится из батника
SCRIPT_INDEX=$2    # автоматически подставится 0, 1, 2, 3... из цикла

START=$((SCRIPT_INDEX * CHUNK_SIZE  ))
END=$((START + CHUNK_SIZE - 1))

for i in {0..0}; do
  for j in $(seq $START $END); do

    FILE_NUM=$(( j / 2 + 1 ))
    INPUT_FILE="${FILE_NUM}.unit"

    ( echo "$i"; echo "$j" ) > "$INPUT_FILE" &

    CURRENT_INPUT_FILE="$INPUT_FILE" gp -q Test_26.gp.run &

  done
done

wait

Здесь запускается рабочая программа Test_26 на PARI/gp. Вот какие в ней релевантные строки:

Код:
install("init_Test_26", "vp", "init_Test_26", "./Test_26.gp.so");

\\ 2. Читаем имя файла из переменной окружения, которую задаст Bash
input_file_name = getenv("CURRENT_INPUT_FILE");

\\ Проверка на всякий случай
if (input_file_name == "", error("КРИТИЧЕСКАЯ ОШИБКА: Переменная CURRENT_INPUT_FILE пуста!"));

\\ 3. Читаем данные из файла (или FIFO-канала)
nomera = readvec(input_file_name);

\\print("Успешно прочитано из [", input_file_name, "]: i = ", nomera[1], ", j = ", nomera[2]);

Наконец-то добился что она вроде работает. Но не совсем так как надо.

Если

set CHUNK=1
set WIN_COUNT=12

То работает нормально, в каждом окне считается свой номер.

А если

set CHUNK=10
set WIN_COUNT=12

То в каждом окне одновременно будет пытаться считать по 10 потоков. А они должны исполняться последовательно, потому что у них один и тот же номер файла.

То есть нужно чтобы в 12-ти одновременно работающих окнах последовательно считались 10 разных номеров:

от 0 до 9 в одном окне,
от 10 до 19 в другом окне,
...
от 110 до 119 в последнем 12-м окне.

 Re: Как писать быстрые программы
Аватара пользователя
Исправить оказалось неожиданно просто. Нужно было убрать & (параграф?) в конце двух строк.

"Уж сколько раз твердили миру":

Квен писал(а):
Отличная новость, что удалось запустить связку Windows + WSL + PARI/GP + C-код! Вы очень близко к идеалу.

"Но только всё не впрок,
И в сердце льстец
Всегда отыщет уголок" :-)

Благодаря этому нововведению смог посчитать набор вдвое меньше последнего, то есть 720 паттернов:

Код:
Rass prime:   0     119
Proga26   500       193
8-я фильтрация: ECM 1,1,80   9-я: ECM 1,1,80

Potoki   Count     Found    Тime    ms/      Speed
(okna)     pat   D(192,7)    sеc    Pat    kor/24h
     6     720      2883     521    723     478547
     8     720      2883     473    656     527528
    10     720      2883     439    610     567450
    12     720      2883     412    572     604962
    15     720      2883     412    572     604846
    20     720      2883     403    558     619487

Когда окон больше чем номинальное количество потоков (у меня 12), Демис вроде говорил что это называется гипертрейдинг. Но большее пока не решаюсь. Уже при 20 вывод заметно тормозил. Но, как видно, счёт почему-то быстрее был.

 Re: Как писать быстрые программы
Yadryara в сообщении #1725482 писал(а):
Когда окон больше чем номинальное количество потоков (у меня 12), Демис вроде говорил что это называется гипертрейдинг.
Нет, гипертрейдинг это когда доступных (а не запущенных!) потоков больше количества ядер (т.е. больше 6 у Вас). Если в биосе отключите гипертрейдинг, то количество доступных потоков сократится до 6, по количеству ядер.

В принципе можно грубо оценить выигрыш от гипертрейдинга по таблице: 12 против 6, 605 против 480, выигрыш 605/480-1=26%.
Грубо потому что при 6 потоках вовсе не факт что они распределились по всем 6 ядрам и не мешали друг другу, так что реальный выигрыш может быть немного меньше. Но вообще выигрыш 20%-30% как раз и есть "средний по больнице" (для множества приложений), так что вполне на уровне. Но напомню что на асм+AVX2 выигрыш был 100% (вдвое быстрее), уж не знаю почему.
Ещё грубо потому что не проверили (или во всяком случае не указали) частоту ядер в разных вариантах, вполне может быть что при 12 запущенных потоках частота несколько ниже чем при 6, ведь нагрузка и соответственно тепловыделение больше.

Yadryara в сообщении #1725482 писал(а):
Уже при 20 вывод заметно тормозил. Но, как видно, счёт почему-то быстрее был.
Непонятно почему рост скорости только при 20 потоках, а не при 15.
Но сам факт роста скорости от превышения 12 активных/запущенных потоков означает что в коде есть "узкие места", где выполнение чего-то ждёт, причём скорее всего ждёт в ядре винды, не в коде PARI, потому и переключает на другие ожидающие потоки. Возможно следует уменьшить количество выводимой информации в консоль (заменив на вывод в файл, он существенно быстрее) или даже и в файлы тоже (других точек возможного ожидания вроде бы в коде нет). В вычислительных моментах ожидания быть не может, так что дело не в primesieve/factor/ecm/pollard и прочих вычислительных функциях.

Yadryara в сообщении #1725482 писал(а):
Нужно было убрать & (параграф?)
ИИ говорит это признак запуска строки в фоновом режиме, т.е. не дожидаясь окончания выполнение проходит дальше. Код не смотрел.

 Re: Как писать быстрые программы
Yadryara в сообщении #1725482 писал(а):
Демис вроде говорил что это называется гипертрейдинг.
Демис говорил, что у него процессоры Intel, а не AMD.
И что он использует (с включенным гипертреадингом) формулу: ("общее число ядер") - (1 ядро).
Тогда оставшегося ядра хватает на нормальную работу самой ОС Виндовс, при тяжелых расчетах, естественно.

(Оффтоп)

Демис не говорил, что в АМД есть гипертреадиг, там у них своя технология smt, кажется, называется.
В чем-то похожая на гипертреадинг...

 Re: Как писать быстрые программы
DemISdx в сообщении #1725507 писал(а):
Демис не говорил, что в АМД есть гипертреадиг, там у них своя технология smt, кажется, называется.
В чем-то похожая на гипертреадинг...
Насколько я разбираюсь, идентична с точностью до названия. Ну может какие-то мелкие технические детали различаются, но без глубоких тестов до них не добраться, так что для программиста (про пользователей вообще молчу) это одно и то же. Хотя эффект может быть разным, да - на моей проге у меня было +50% скорости, у вас с Антоном +100%, хотя у тебя тоже интел как и у меня, но сильно новее.

-- добавлено через 7 минут --

И кстати SMT - общее название компьютерной технологии (английское сокращение), это интел извратилась с собственным названием.

 Re: Как писать быстрые программы
Аватара пользователя
Благодарю.

Ранее писал, что для бо́льших объёмов счёта за один запуск, скорость падала. Видимо из-за увеличения потребления памяти. Поэтому решил пойти в обратную сторону: за один запуск проверять не по 12 и не по 6, а всего лишь по 3 паттерна. Причём разбил пополам тот самый интервал где нашлись эти 2883 кортежа. Довольно неравномерно разбились находки: 1415 + 1468. Может это и хорошо:

Код:
8-я фильтрация: ECM 1,1,80   9-я: ECM 1,1,80

Potoki   Count     Found    Тime    ms/      Speed
(okna)     pat   D(192,7)    sеc    Pat    kor/24h

    12     360      1415     204    564     601768
    15     360      1415     205    567     598751

    12     360      1468     207    574     614060
    15     360      1468     206    570     618251

20 потоков больше запустить не удалось, хотя два раза попытался. Окна открылись, но то 2, то 1 прога не запустилась. В причинах пока разбираться не стал.

Видимо, не стоит мучить комп. И делать выбор всё же в пользу 12-ти, а не 15 потоков. Накладные расходы времени (на компиляцию и запуск) сюда не включены. Вот такой рабочий файл формируется, например, для 12 потоков. Считается по 10 юнитов в потоке, в каждом юните по 3 паттерна:

(120 юнитов)

Код:
0.    18      19115         81360
10.    9      18187         42756
20.    11      17496         54321
50.    8      16982         40702
40.    9      18651         41692
30.    13      20972         53557
60.    12      19274         53793
90.    6      17089         30335
70.    15      20592         62937
80.    14      20235         59778
100.    12      19567         52987
110.    13      18920         59366
1.    10      17775         48608
11.    11      19654         48357
51.    8      17626         39215
21.    17      21951         66913
31.    10      19322         44716
41.    14      21305         56775
61.    9      18753         41465
71.    11      18415         51610
91.    15      21258         60965
111.    11      18384         51697
81.    14      21592         56021
101.    15      21745         59600
2.    12      20598         50335
12.    14      20704         58426
52.    9      19557         39761
32.    10      18389         46985
62.    8      18332         37705
22.    15      23154         55973
42.    13      22018         51013
72.    13      20623         54463
102.    5      16341         26437
112.    9      19950         38979
92.    14      21301         56786
82.    15      21524         60212
13.    9      19911         39054
3.    16      22831         60549
33.    9      18171         42793
23.    12      19780         52417
43.    8      18436         37492
63.    13      21818         51480
53.    21      25163         72106
103.    8      18299         37773
73.    9      19326         40236
113.    11      19921         47708
93.    16      23240         59484
83.    14      23378         51741
14.    9      18678         41632
34.    9      18667         41656
24.    5      16696         25874
4.    17      23052         63717
44.    3      16541         15670
74.    10      18994         45488
54.    13      21093         53250
64.    14      22741         53190
114.    12      19966         51928
104.    17      24777         59281
84.    7      18282         33082
94.    12      21686         47810
15.    11      20052         47397
35.    10      19733         43785
45.    7      18312         33028
5.    10      19452         44417
25.    15      21604         59989
65.    7      18544         32614
75.    13      20674         54329
115.    10      21089         40969
55.    14      22690         53310
95.    9      20318         38271
85.    13      21084         53273
105.    16      24477         56478
16.    14      21252         56917
6.    9      18282         42534
36.    11      20394         46602
26.    12      20753         49959
46.    14      23007         52575
66.    8      18390         37586
56.    5      18426         23446
116.    8      18543         37276
76.    14      21274         56858
106.    8      17986         38430
86.    8      19256         35895
96.    14      22040         54882
17.    9      20121         38646
7.    17      23012         63828
37.    17      23445         62649
27.    13      21118         53187
67.    9      20234         38430
77.    10      20055         43082
47.    23      28039         70873
117.    16      23443         58969
57.    16      24511         56399
107.    10      19518         44267
97.    9      19965         38948
87.    14      23022         52541
18.    13      21182         53026
38.    7      19170         31549
28.    10      19758         43729
78.    6      17408         29779
8.    20      25171         68650
68.    15      22414         57821
48.    13      21233         52899
58.    12      19950         51970
118.    13      21699         51763
108.    12      22870         45334
88.    14      21447         56399
98.    14      22583         53562
19.    10      20087         43013
39.    11      21315         44588
79.    10      20307         42547
69.    12      19305         53706
29.    16      23392         59097
9.    12      20726         50024
49.    11      18192         52243
59.    12      18686         55485
119.    13      18228         61619
99.    11      14883         63858
109.    17      18593         78997
89.    12      16425         63123

Здесь номер юнита, количество найденных в нём кортежей, время счёта в миллисекундах, скорость (кор/сут).

Затем я сверяю что все 120 юнитов посчитались, причём убеждаюсь, что они все разные и считаю по этому файлу другую стату, учитывая что потоки работали одновременно:

Код:
#vnun =             120
#vecsort(vnun,,8) = 120
#Set(vnun)        = 120

    12     360      1415     204    564     601768

То, что кортежи находятся именно одни и те же, пока не проверяю.

Dmitriy40 в сообщении #1725499 писал(а):
Ещё грубо потому что не проверили (или во всяком случае не указали) частоту ядер в разных вариантах,

Забыл где это смотреть.

DemISdx в сообщении #1725507 писал(а):
И что он использует (с включенным гипертреадингом) формулу: ("общее число ядер") - (1 ядро).
Тогда оставшегося ядра хватает на нормальную работу самой ОС Виндовс, при тяжелых расчетах, естественно.

Это в последний год Вы так делали.

А раньше (года три назад), помнится, что Вы попробовали какой-то перегруз (если не нравится слово гипертрейдинг) типа моего, то есть запускали потоки в количестве больше номинала и это давало выигрыш в скорости.

 Re: Как писать быстрые программы
Yadryara в сообщении #1725516 писал(а):
Забыл где это смотреть.
Самое простое - в диспетчере задач на закладке производительность в подробном варианте показа.

 Re: Как писать быстрые программы
Yadryara в сообщении #1725516 писал(а):
А раньше (года три назад), помнится, что Вы попробовали какой-то перегруз (если не нравится слово гипертрейдинг) типа моего, то есть запускали потоки в количестве больше номинала и это давало выигрыш в скорости.
Что-то я сомневаюсь на счет выигрыша.
Наоборот, если правильно помню, это специально тестировал, чтобы показать, что идет просадка по времени.
Насыщение процессора исполняемым кодом всегда узкое место в нагруженных приложениях.

(Оффтоп)

И мало что изменилось за 20-ть лет, вот неплохой сборник по технологиям ЦПУ от 2006 года https://osp.ru/os/2006/06/2700454
Обратите внимание там: "логика SMT занимает 24% процессорного ядра Power5"
и "Xeon для многопоточности используется только 5% кристалла"
Насколько помню SMT в AMD пришла именно от IBM, со своими нюансами.

Правда и новинки появляются:
https://www.ittelo.ru/news/ibm-power11-obzor-arkhitektury-novogo-protsessora/

Т.е. SMT это может быть и 4-ре потока на ядро и 8-мь...
У Интела только два...

 Re: Как писать быстрые программы
DemISdx в сообщении #1725524 писал(а):
Что-то я сомневаюсь на счет выигрыша.
Выигрыш может быть св случае если процесс ждёт кого-то сильно внешнего, причём внутри вызова функции ОС - т.е. это не память и не кэш, это на уровне внешних устройств, когда ожиданием управляет планировщик ОС. Только в таком случае планировщик может запустить больше потоков чем доступно аппаратно, а остальные при этом молча ждут пока сработают внешние устройства (диск, видео, сеть, клава/мышь).
В принципе такое может происходить при переполнении физической памяти (не выделенной, а именно записанной/используемой), когда процесс ждёт подкачки страницы с диска, может в этом дело.

DemISdx в сообщении #1725524 писал(а):
У Интела только два...
Не совсем, в ускорителях Xeon Phi на базе x86 используется 4 потока на ядро. Но это довольно специализированное устройство.

 [ Сообщений: 1299 ]  На страницу Пред.  1 ... 83, 84, 85, 86, 87


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