Кстати, есть Эпики второго поколения 64 ядра, примерно за 65т. Матери проскакивают от 20. На Али одно время за 20 комплект отдавали: мать, эпик 8-16 ядер, память ~32gb.
Но прошло полгода-год и цены взлетели в 2 раза. Я думаю, выгодное предложение нужно ловить. И вникнуть в каких случаях третий эпик заведётся в матери первого поколения.
Я мать H12SSL-i на Авито за 33т брал год назад, новую. Но цены сошли с ума.
Тут смотря о каком поколении говорить. H11SSL-i найти можно дешево, в неё можно второго поколения воткнуть Эпик. Тоже относительно дешёвый.
В теории даже третьи эпики должны вставать в H11SSL-i. Но я не пробовал, а сам производитель говорит только о втором поколении, чтобы лучше современные железки продавались.
Наверное, тут нужны эксперименты по втыканию третьих эпиков в платы от первых. AMD делало технически так, чтобы это было возможно, так как Эпик - это система на чипе.
Ну, а если хочется 64 ядра / 128 потоков за вменяемые деньги, то вряд ли есть альтернативы Эпикам.
Когда я компилировал с помощью gp2c, то увидел, что libpari имеет свои средства для параллелизации. А точнее итераторы для параллельного исполнения parfor_t. И функции parfor_init, parfor_stop. Но у меня не вышло их использовать без доработки.
Что нагенерил gp2c
// То, что должно работать параллельно
GEN BruteForcePart(GEN pub, GEN cnt, GEN nMaxLevel)
{
pari_sp ltop = avma;
setrand(gpextern("od -vAn -N8 -tu8 < /dev/urandom"));
/* Моя секретная функция */
avma = ltop;
return gen_0;
}
// Для parfor_init нужно замыкание. Оно создаётся в виде функции
GEN anon_0(GEN i, GEN pub, long prec)
{
pari_sp ltop = avma;
GEN p1 = gen_0;
p1 = BruteForcePart(pub, nMaxCalcInThread, nMaxX, prec);
p1 = gerepilecopy(ltop, p1);
return p1;
}
// В этой функции мы запускаем parfor в GP-скрипте
void transpose(GEN pub, GEN a) /* void */
{
pari_sp ltop = avma;
GEN nMaxCount = gen_0;
nMaxCount = gmulgs(default0("nbthreads", NULL), 100);
{
pari_sp btop = avma;
while (1)
{
{
parfor_t iter; /* parfor */
parfor_init(&iter, gen_1, nMaxCount, strtoclosure("anon_0", 1, pub));
{
pari_sp btop = avma;
GEN i = gen_0, r = gen_0, p1 = gen_0;
while ((p1 = parfor_next(&iter)))
{
r = gcopy(gel(p1, 2));
i = gcopy(gel(p1, 1));
if (gequal0(r))
continue;
printf0("%s %s %d %d %d %d %d %s\n", mkvecn(8, gel(a, 1), gel(a, 2), gel(r, 1), lift(gel(gel(r, 2), 1)), lift(gel(gel(r, 2), 2)), lift(gel(pub, 1)), lift(gel(pub, 2)), gel(a, 5)));
parfor_stop(&iter);
goto label1;
if (gc_needed(btop, 1))
gerepileall(btop, 3, &i, &r, &p1);
}
}
}
avma = btop;
}
label1:;
}
avma = ltop;
return;
}
Этот код у меня не заработал. Подозреваю, что дело в том, что замыкание должно быть создано с помощью динамической компиляции GP-кода. Я не разобрался, как можно скомпилированную Си-функцию подсунуть в parfor_init.
Я добавил раздел 0, где написано кому может понадобиться PARI. А также добавил ещё раздел 4.5, где обзорно пробежался по другим функциям параллельности в PARI.
Если сравнивать с C#, то порог вхождения несопоставим с PARI и значительно выше у C#.
C# - это язык общего назначения, а PARI - вещь заточенная для быстрого решения математических/вычислительных проблем.
Фактически, я часто просто вывожу в критической секции результаты параллельных функций в поток вывода или файл, а потом анализирую. Очень просто. Никаких заморочек с общими переменными. Вообще общие переменные использую только для чтения, как константы.
Но в критической секции можно результаты функций в какой-то глобальный массив записывать.
Я так понял вы решили начать по хардкору, написав на Си с использованием libpari. Тут, действительно, потребуется больше времени.
Проще всего скомпилировать в библиотеку самую тяжёлую часть и загружать из pari. И даже это нужно делать только тогда, когда вся логика уже безукоризненно отлажена, а вычисления реально занимают часы или дни.
Параллельные вычисления в языках общего назначения - это сложно и если нужно за полчаса написать программу, то вы не сделаете этого никогда не запускав C# до этого. В PARI достаточно, чтобы каждая процедура была автономной для параллельности.
А c PARI сделаете. А учитывая, что PARI поддерживает неограниченную точность и огромное количество математических функций, то задача ещё упрощается.
Да, типа как таблицу квадратов: n^2, n^4, n^8, n^16, n^32. В общем случае n^(2^i). Но в принципе можно, наверное, извратиться, чтобы и без таблицы вовсе. Или можно таблицу сделать в стеке и рекурсией вынимать из неё значения.
И сколько попугаев даёт 9950X?
Кстати, есть Эпики второго поколения 64 ядра, примерно за 65т. Матери проскакивают от 20. На Али одно время за 20 комплект отдавали: мать, эпик 8-16 ядер, память ~32gb.
Но прошло полгода-год и цены взлетели в 2 раза. Я думаю, выгодное предложение нужно ловить. И вникнуть в каких случаях третий эпик заведётся в матери первого поколения.
Я мать H12SSL-i на Авито за 33т брал год назад, новую. Но цены сошли с ума.
Тут смотря о каком поколении говорить. H11SSL-i найти можно дешево, в неё можно второго поколения воткнуть Эпик. Тоже относительно дешёвый.
В теории даже третьи эпики должны вставать в H11SSL-i. Но я не пробовал, а сам производитель говорит только о втором поколении, чтобы лучше современные железки продавались.
Наверное, тут нужны эксперименты по втыканию третьих эпиков в платы от первых. AMD делало технически так, чтобы это было возможно, так как Эпик - это система на чипе.
Ну, а если хочется 64 ядра / 128 потоков за вменяемые деньги, то вряд ли есть альтернативы Эпикам.
На Linux всё отлично. Все потоки работают. И под Windows работают. Только не под всеми программами.
И ещё нужна информация как установить кастомный циферблат. Записать в папку уже не работает с Zepp Life.
Вот работающая ссылка на исходный циферблат
https://4pda.to/forum/index.php?showtopic=1048744&st=3180#entry120536624
А вот ещё один любопытный:
https://4pda.to/forum/index.php?showtopic=1048744&st=3140#entry120503258
Для того, чтобы far запускался без разархивации на Calculate Linux (российский дистрибутив на базе Gentoo) я делаю так
Далее в /usr/local/bin создаю файл far c таким содержимым:
сам файл far2l.sh содержит следующее:
Можно ли этот процесс как-то упростить?
Я пробовал создавать символьную ссылку на far2l. Не работает.
Когда делать hardlink (твердую ссылку) то же не работает.
И в таком стиле делал файл /usr/local/bin/far:
Тоже не работает.
И ещё вопрос. В каких случая нужно использовать файл с glibc. На очень статой машине, которая не обновлялась лет 10 запустилась обычная версия far.
Спасибо большое за примеры параллельного кода!
Когда я компилировал с помощью gp2c, то увидел, что libpari имеет свои средства для параллелизации. А точнее итераторы для параллельного исполнения parfor_t. И функции parfor_init, parfor_stop. Но у меня не вышло их использовать без доработки.
Что нагенерил gp2c
Этот код у меня не заработал. Подозреваю, что дело в том, что замыкание должно быть создано с помощью динамической компиляции GP-кода. Я не разобрался, как можно скомпилированную Си-функцию подсунуть в parfor_init.
А как в far менять символические ссылки? В mc есть такая возможность. В фар пока не увидел
Я имел ввиду темы. Чтобы можно было за секунду изменить все цвета.
Спасибо за ответ и ссылку.
Я добавил раздел 0, где написано кому может понадобиться PARI. А также добавил ещё раздел 4.5, где обзорно пробежался по другим функциям параллельности в PARI.
Если сравнивать с C#, то порог вхождения несопоставим с PARI и значительно выше у C#.
C# - это язык общего назначения, а PARI - вещь заточенная для быстрого решения математических/вычислительных проблем.
Подскажите, пожалуйтса, есть ли возможность менять цветовую схему, как в mc?
Может стоит сказать о современных воплощениях?
https://github.com/unxed/dn2l
http://ndn.muxe.com
Я нашёл такую рекомендацию где-то в сети. Правда, для Linux.
Фактически, я часто просто вывожу в критической секции результаты параллельных функций в поток вывода или файл, а потом анализирую. Очень просто. Никаких заморочек с общими переменными. Вообще общие переменные использую только для чтения, как константы.
Но в критической секции можно результаты функций в какой-то глобальный массив записывать.
Кстати, о самой фразе, которую вы процитировали. Это разные предложения.
Язык GP просто облегчает задачу, когда нужно что-то по-быстрому посчитать.
Я, например, могу написать параллельный код на Go или Python, но на GP для меня будет проще, если мне не нужны какие-то тонкости.
Я так понял вы решили начать по хардкору, написав на Си с использованием libpari. Тут, действительно, потребуется больше времени.
Проще всего скомпилировать в библиотеку самую тяжёлую часть и загружать из pari. И даже это нужно делать только тогда, когда вся логика уже безукоризненно отлажена, а вычисления реально занимают часы или дни.
Параллельные вычисления в языках общего назначения - это сложно и если нужно за полчаса написать программу, то вы не сделаете этого никогда не запускав C# до этого. В PARI достаточно, чтобы каждая процедура была автономной для параллельности.
А c PARI сделаете. А учитывая, что PARI поддерживает неограниченную точность и огромное количество математических функций, то задача ещё упрощается.
Сколько ещё по-вашему будут хайповыми мини-аппы?
Похоже ваш код так и делает, как я предложил. Извините, торопился, понял неправильно.
Да, типа как таблицу квадратов: n^2, n^4, n^8, n^16, n^32. В общем случае n^(2^i). Но в принципе можно, наверное, извратиться, чтобы и без таблицы вовсе. Или можно таблицу сделать в стеке и рекурсией вынимать из неё значения.
Так меньше всего действий. Всё через умножение.