LINUX.ORG.RU

Избранные сообщения superuser

Systemd как менеджер пользовательской сессии

Форум — Desktop

Хочу организовать себе сабж. Для тех, кто не знает, команда /usr/lib/systemd/systemd --user запускает пользовательскую сессию systemd. Зачем это нужно? Более гибкая, более контролируемая и многоуровневая автозагрузка программ/демонов пользователя.

Есть люди, которые реально пользуются? Можете по пунктам объяснить все? А то арчвики я читал, другие статьи в гугле читал, но понимания все равно нет. Вручную вроде как все получается запускать, а автоматически - нет.

И да, cast plm

 ,

serkhay
()

much performance II

Галерея — Скриншоты

Всем привет! Спустя некоторое время выкладываю продолжение результатов «упорных» стараний над оптимизацией Gentoo на ПК с Intel Celeron Coppermine 900 MHz и 256 Mb RAM. Что сделал:

  • С помощью ноута собрал 17-ую версию;
  • Ядро теперь 4.14.8, а так же я поснимал еще больше звездочек в menuconfig (на старте без X и MariaDB - min 13 Mb RAM, c XFCE - min ~60 Mb RAM);
  • Нет теперь dm, запуск X происходит автоматически с помощью getty+autologin;
  • Браузер Palemoon SSE версия работает шустрее, страницы открывает почти как в 2018 году;
  • Все тот же gimp2 и теперь OpenOffice 4, который пришел на смену LO, так как LO заколебал своими багами;

Была попытка использовать вылизанную Plasma 5, но черепашьему HDD это не понравилось.

Некоторое время Gentoo даже обновлялась до первого прихода gcc. ПК использовался в качестве печатной машинки, для работы с таблицами, для того, чтобы поправить картинки в gimp, и в качестве сервера CUPS и базы данных MariaDB с последующем подключением через OO Base.

Вот еще два скриншота:

К сожалению, это последние скриншоты, ко мне наведался «ИТ отдел» с новым ПК, с установленным Windows 7, мой компьютер обещали форматнуть с аргументом !внезапно! «линукс нелицензионный, нельзя, точка», и скорее всего будет отправлен на свалку. Комп 04.01.2002 даты рождения, с ним я работал 2 года, был мной почищен от пыли и от XP ZverCD с заменой термопасты. По информации из BIOS с 45'С упало до 36. Оформляется stage4. Сегодня или завтра его последний день :(

И немного конфигов:

 ,

mfhunruh
()

Завещание мертвеца

Форум — General

Шалом.

Пишу тут скрипт, что будет реализовывать рассылку сообщений заданным людям в случае отсутствия моей активности в течении определенного времени.

И, внезапно, подумал, а нет ли готового решения?

Интересует готовое решение с возможностью отправки e-mail'ов, SMS, поддержка транспортов во всякие WhatsApp приветствуется. Периодические запросы на проверку жив/здоров необходимы, мониторинг соцсетей приветствуется.

Кто-нибудь знает такое вот?

Заранее благодарю за ответ.

 завещание

IPR
()

Либо я сейчас изобрел велосипед, либо создатели tmux колдуны, либо и то и то сразу

Форум — Talks

Всем привет! Как кто-то из вас, возможно, знает, я еще тот консолефаг, ну вот нравится мне интерфейс ncurses, нравится фреймбуффер, и не нравится оконный интерфейс и мышкотыканье. Но иногда бывает необходимо посмотреть ссылку на сайт с ядреными JS, бывает веб интерфейс у какой-нибудь программы,да много чего. Что же делать? Тянуться за ноутом? Ставить иксы? Проводить археологические раскопки,и собирать gtk2 под directfb? Нет! Как оказалось (по крайней мере,для меня это мозгоразрыающая новость, поменявшая мою жизнь на до и после), ЛЮБУЮ программу, использующую qt,можно запустить в голой консоли! Нужно запускать с -platorm linuxfb, и о чудо,оно работает! Проверил на браузере falkon, программах dolphin и qbittorrent, все работает. Но только в tmux,в обычной консоли у меня не получилось. Повторяю,возможно я сейчас открыл Америку,но для меня это шок

d09
()

kpartx + loop + lvm = не удаляются разделы loopXpY после отключения образа

Форум — Admin

Привет всем!!

У меня проблема с которой я никак не могу справится, точнее не могу понять что и где правильно выключить.

Монтирую образ блочного устройства через kpartx -a <ИМЯ>.img, далее забиваю нулями этот образ через dd предварительно. Создаю два раздела, и в итоге имею в /dev вот такие устройства: /dev/loop0 /dev/loop0p1 /dev/loop0p2. На втором разделе (loop0p2) создаю LVM-том и 2 LVM-раздела на нем, форматирую их и сразу же демонтирую. После, чтобы отключить LVM-том даю команду vgchange -an <VG> и сразу же отключаю образ kpartx -d <ИМЯ>.img. При этом команда losetup дает мне понять что мое loop0-устройство успешно отключена, не выводя его в своем списке.

А самое интересное, что после отключения образа файлы /dev/loop0[pX] остаются в каталоге, а вместе с ними и LVM-том на них. Команда dmsetup ls никаких устройств связанных этим lVM не видит. Команда blkid продолжает упорно писать, что в /dev/loop0p2 располежен все тот же LVM-том VG.

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

Помогите пожалуйста кто знает в чем дело, бьюсь уже который день. Спасибо заранее!!!

 ,

dmnord
()

Посоветуйте современную эмуляцию «классов» для С в эмбеды

Форум — Development

https://github.com/lvgl/lvgl/issues/1919

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

Если кто в курсе, на чем нынче модно ООП для С изображать, дайте знать. Надо для эмбедов:

  • много оперативки жрать нельзя.
  • много флеша жрать не желательно.

По фичам критично только наследование методов/данных и virtual. Можно забить болт на private, эксепшены, множественое наследование и т.п.

Ответ типа «лучше ooc toolkit до сих пор ничего не придумали» - тоже устроит.

 , ,

Vit
()

Тормозит запиcь в ком-порт

Форум — General

Всем привет

Имеется прибор на процессоре imx6UL Под него сборка дебиан от производителя.

В общем надо с этого прибора опрашивать другие по rs-485 на скорости 9600.

Порт открывается настраивается в неблокирующем режиме и т.д. и т.п. Чтение / запись работают через select с заданным таймаутом.

В итоге получается как-то так, что реальная скорость отправки данных существенно ниже установленной 9600.

Команда int bytes_write = write(fd, frame_write, frame_write_size) выполняется моментально. Но дальше получаем жуткий таймаут на получение данных. Проверили осциллографом, что данные на опрашиваемый прибор приходят и он отвечает сразу же без задержек.

Стал разбираться. Вставил после write команду tcdrain( fd ) И вот уже на ее выполнение (ожидание пока данные уйдут) отжирается в среднем 30 миллисекунд. В посылке 7 байт.

Ясно, что функцией write сначала скидывается в буфер, а потом запихивается в физическое устройство.

Но не 30 же миллисекунд на отсылку 56 бит?? По заявленной скорости на это должно уходить 5мс в идеале ).

Вопрос: можно ли как-то оптимизировать в линуксе всё это дело.

Под виндами написал такой же код, там всё просто летает. Отправка данных на 9600 на той же линии занимает в пределах 5-7 миллисекуд и примерно через столько же приходит ответ.

Что в линуксе не так?

 ,

demon051
()

Подключиться к unix-сокету через bash

Форум — Development

Есть небольшой сервер, который принимает соединение по сокету и выводит переданное сообщение. Вот:


#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
int main()
{
    int sock, listener;
    struct sockaddr_in addr;
    char buf[1024];
    int bytes_read;

    listener = socket(AF_INET, SOCK_STREAM, 0);
    if(listener < 0)
    {
        perror("socket");
        exit(1);
    }
    
    addr.sin_family = AF_INET;
    addr.sin_port = htons(3210);
    addr.sin_addr.s_addr = htonl(INADDR_ANY);
    if(bind(listener, (struct sockaddr *)&addr, sizeof(addr)) < 0)
    {
        perror("bind");
        exit(2);
    }

    listen(listener, 1);
    
    while(1)
    {
        sock = accept(listener, NULL, NULL);
        if(sock < 0)
        {
            perror("accept");
            exit(3);
        }

        while(1)
        {
            bytes_read = recv(sock, buf, 1024, 0);
            if(bytes_read <= 0) break;
            printf(buf);
            send(sock, buf, bytes_read, 0);
        }
    
        close(sock);
    }
    
    return 0;
}

Сокет, вроде как, даже открывается:

State      Recv-Q Send-Q Local Address:Port          Peer Address:Port  Process 

LISTEN     0      1            0.0.0.0:3210               0.0.0.0:*             

Я сделал подобный скрипт, но видимо это совершенно не то, что нужно:

 exec 4</dev/tcp/0.0.0.0/3210
 echo -ne "Message" >&4

Как быть?

 , , ,

Hart
()

Не могу поморгать светодиодом на arduino mega2560

Форум — Linux-hardware

Код крайне примитивен:

#include <stdbool.h>
#include <avr/io.h>

int main(void)
{
    DDRB |= 1 << 7;

    while (true)
    {
        volatile long int i;
        for (i = 0; i < 50000; i++)
          ;
        PORTB |= 1 << 7;
        for (i = 0; i < 50000; i++)
          ;
        PORTB &= ~(1 << 7);
    }

    return 0;
}

Если собираю и заливаю из arduino ide, то все ок.

Если собираю avr-gcc и заливаю через usbasp, то не работает. Сам usbasp рабочий.

Собираю так:

avr-gcc -mmcu=atmega2560 -o test.elf test2.c
avr-objcopy -O binary test.elf test.bin
avrdude -c usbasp -p atmega2560 -U flash:w:test.bin

Я как-то в непонимании, что я делаю не так

UPD: заливка прошивки проходит нормально, но светодиод не мигает.

UPD2: fuses E:FD, H:D8, L:FF

 ,

cvs-255
()

Void с evilwm — легкая и удобная система

Галерея — Скриншоты

Система

Void Linux установлена и настроена на нетбуке 10.1″ с 2 GB RAM и микропроцессором Intel Atom.
Я люблю Void за его следование философии Unix. Он очень просто устроен. Здесь нечему ломаться, потому что ничего лишнего нет. Разработчики сделали очень быстрый пакетный менеджер. Также быстрым является и родная система инициализации Runit. Всё просто, удобно и работает очень быстро.

Как оказалось, evilwm предоставляет все необходимое для управления окнами. Большие навороты не нужны. Вместе с консольным tmux/screen, в котором ты сам с легкостью настраиваешь расположение окон (панелей) как захочешь, – это лучший выбор для пользователей, которые привыкли к классическому управлению окон. Нет никаких панелей, значков и прочего хлама.

evilwm потребляет всего 3.8 Мб RAM из всей потребляемой оперативной памяти (56 Мб), а его клавишные бинды легко запомнить (Ctrl + Alt). Создание собственных хоткеев не предусмотрено, но меня вполне устраивают текущие. Если кого-то не будут устраивать, может воспользоваться xbindkeys. Также имеется псевдотайлинговое поведение (Ctrl + Alt + {Y,U,B,N}, Ctrl + Alt + =, Ctrl + Alt + X). При желании можно легко отредактировать исходный код. Очень интересный WM, несмотря на то, что им мало кто пользуется.

Скриншот

ОС: любимый Void Linux.
WM: evilwm.
Музыкальный плеер: mpd (musicpd.org) + ncmpcpp.
Эмулятор терминала (консоли): rxvt.
Шрифты: Pragmata.

За кадром

Текстовый редактор: vim (vim.org) (+ vim-latex + vim-pandoc + nou.vim).
Табличный процессор: sc-im.
Файловый менеджер: nnn (github.com).
Видеоплеер: mplayer + youtube-viewer.
Почтовый клиент: mutt.
IRC-клиент: irssi
RSS-клиент: newsboat.

 ,

Deleted
()

Питание для планшета в автомобиле

Форум — General

Есть идиотская затея запихать планшет в автомобиль намертво. В качестве аудиоплэйра и навигатора. Ну может еще функций ему придумаю потом.

Озадачился вопросом. Как его запитывать и выключать при вытаскивании ключа из замка зажигания. Ну реально, не каждый же раз ему кнопочку жать рукой чтобы уснул.

Стандартное питание с ЮСБ не вариант. Потому как девайс уже есть и у него уже сильно умерла батарея. Новую батарею искать тоже не вариант. Потому как девайс уже сильно аут оф производство и даже продажи.

Пришла в голову такая мысля. Взять стабилизатор высокоточный, запитать от бортовой сети в постоянку и припаять к тому месту где батарея была. В принципе девайс будет видеть этот стабилизатор как батарею. И по скольку напряжение будет всегда одно и то-же то будет считать что она заряжена. Верно мыслю?

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

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

В общем нужны идеи для очумелых ручек как все это замутить разумно.

При чем тут линукс? Ну в общем будет там и линукс. Скорее всего. Еще в процессе попыток под него линукс собрать.

 

AfterWork
()

[решено] Программное эхоподавление (и эхокомпенсация) в Debian - какие существуют решения?

Форум — Desktop

Добрый день!

При общении по громкой связи в Telegram (с обеих сторон десктопное приложение) - речь участников, воспроизведенная в динамиках удаленной стороны, возвращается через их микрофон.

Добавлением в /etc/pulse/default.pa следующих строк:

load-module module-echo-cancel source_name=noechosource sink_name=noechosink
set-default-source noechosource

…включил встроенный модуль подавления шума и эха PulseAudio.

Но он не справляется. Хотелось бы узнать, кто как решает данные акустические проблемы.

 , ,

debiani
()

Вопрос по новому QEMU 5.1

Форум — Talks

Там поддержку AVR (в том числе и ATmega 328) добавили. А как этим пользоваться и можно ли GDB прицепиться?

 ,

Meyer
()

Работа с файлом виртуального терминала

Форум — General

Смотрю текущий файл терминала: tty. Допустим, показало /dev/pts/1. Потом с другого терминала посылаю на этот команду: echo ls > /dev/pts/1. Команда не работает. Что не так?

 ,

fingolfin
()

Captive Portal для самых маленьких

Форум — Talks

Здравствуйте мои маленькие любители авиационного спирта =) !

Последние пару дней занимался настройкой Wi-Fi, да не простого, а стильного-модного-молодёжного, со своим Captive Portal. Для тех, кто в танке: это когда ты подключаешься к Wi-Fi сети, но прежде чем допускать тебя к интернетам и ЛОРу в частности, нужно пройти какую-никакую дополнительную авторизацию на веб-страничке, third-party так сказать.

Такой подход я считаю более секурным, потому как, доступ каждого клиента по Wi-Fi регулируется лично через iptables, а не тупо форвардится всё подряд. Какой простор для творчества! Во-вторых, авторизация происходит через веб-страничку, а не WPA и прочие нативные механизмы wireless-сетей, которые как и всё в нашем мире, не вечны и надёжность их хромает.

После вступления, приступим.

hostapd? checked!

iptables? checked!

nginx? checked!

Рассказывать о настройке NAT лишний раз не буду, думаю, у вас уже должна быть настроена раздача Wi-Fi, и всё, что вам ненужно, это только Captive Portal.

wlan0 — имя интерфейса Wi-Fi
eth0 — имя интерфейса с интернетами
192.168.0.0/24 — локалка

# создаём кольцо
iptables -t mangle -N captive

# все пакеты из ви-фи отправляем в это кольцо
iptables -t mangle -A PREROUTING -i wlan0 -j captive

# доверенные клиенты из кольца выходят сразу же (адреса инсертим в начало списка)
# фильтр хоть по MAC, хоть по IP
# этот список должен редактироваться через сайт (Captive Portal)
# iptables -t mangle -I captive -m mac --mac-source 00:00:00:00:00:00 -j RETURN
# iptables -t mangle -I captive -s 192.168.0.137 -j RETURN

# если ты всё ещё в кольце, тогда ставим метку
iptables -t mangle -A captive -j MARK --set-mark 1

# всех с меткой перенаправляем к себе, когда они открывают сайты 80
# про 443 забудьте
iptables -t nat -A PREROUTING -i wlan0 -m mark --mark 1 -p tcp --dport 80 -j DNAT --to-destination 192.168.0.1

# всех с меткой при прочем трафике просто дропаем
iptables -t filter -A FORWARD -i wlan0 -m mark --mark 1 -j DROP

# успешно натим оставшихся доверенных
iptables -t filter -A FORWARD -i wlan0 -j ACCEPT
iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -o eth0 -j MASQUERADE

Вот и всё. Здесь включена проверка через -i wlan0, таким образом это не вызовет никаких конфликтов с другими сетями, т.к. у меня в продакшене под кроватью очень много правил iptables и я знаю, о чём говорю.

Подводные камни, на которые я наткнулся и спешу поделиться с вами. В соседнем треде мне научно-популярно объяснили, что тщетно пытаться настроить редирект по HTTPS на свой Captive Portal, это просто не сработает, это уже MitM атака. Не очень-то и хотелось! ;p

Если у вас используются личные DNS, то наверняка у вас есть правило, разрешающее локальные запросы к серверу (tcp/53 udp/53). Не забудьте разрешить запросы и к локальному веб-серверу (tcp/80). Но а если вы сообщаете Wi-Fi клиентам какие-то публичные NS, то не забудьте разрешить доступ клиентам к ним: iptables -t filter -I FORWARD -i wlan0 -s 192.168.0.0/24 -d 8.8.8.8/32 -j ACCEPT. А суть такова. Когда клиент подключается к Wi-Fi, он проверяет доступность интернета в целом, для этого смартфоны качают со своих серверов файлы и проверяют корректность полученных данных. Если оно не сможет резолвить хост запрашиваемого сайта, то на этом и споткнётся и проверка на наличие Captive Portal в сети не пройдёт.

Собственно, теперь к механизму Captive Portal.

Как уже замечено, это личная прерогатива каждого клиента, проверять доступность интернета, и если в результате проверки что-то пошло не так, — значит либо интернета нет, либо Captive Portal.

Мы перенаправили все запросы на 80 порт к себе, на свой локальный сервер. Теперь nginx должен в ответ на все HTTP запросы отвечать кодом 302. Не 200, не 301, не 511, а именно 302, а затем перенаправлять вас на страничку с third-party авторизацией, и только таким макаром например мой Андрюша-9 смог обнаружить, что у меня таки Captive Portal, а не какой-то сломанный интернет. В результате сразу после подключения к Wi-Fi сети должно появиться Push-уведомление: Скриншот #1, при нажатии которого откроется страничка, куда редиректит nginx Скриншот #2.

Сам скрипт странички я оставляю вам на откуп: думаю, вам не составит никакого труда наслюнявить однострочник на php добавляющий $_SERVER['REMOTE_ADDR'] в iptables через shell_exec(); или типа того. Да? Да. Ваш Captive Portal полностью в ваших руках.

Вот и весь механизм работы Captive Portal. Спрашивайте ответы.

 , ,

Spoofing
()

Multiple pulseaudio

Форум — General

Есть какой нибудь нормальный способ урегулировать ситуацию, когда имеется больше одного пользователя, которые используют PA для вывода звука?
По умолчанию у второго и последующих пользователей звук просто отваливается

 

ia666
()

Останов скрипта из /etc/xdg/autostart/

Форум — General

Есть у меня .desktop файл в /etc/xdg/autostart/ который запускает маленький скрипт при логине в DE. Но при выходе из DE скрипт не завершается. Как сделать что бы при выходе из DE скрипт завершался?
P.S. В моём случае DE = GNOME3, Debian7

 ,

sergijoo
()

Производительность; илитный запил оптимальных реализаций и основы матчасти.

Форум — Development

Поглядел я тут на пацанов и увидел прогресс в их глазах. Поэтому я решил вести тут свой бложик, в котором я буду толкать матчасть, разбирать/разрушать всякие мифы и легенды, а так же их обсуждать с пацанами. Банить меня не надо - тут всё будет очень культурно.

Это будет формат для самых маленьких, где я буду показывать как что-то пилится по-пацаночке. Его задача - на примерах пересказать штеудмануал тем, кому лень его читать, но кто очень любит спорить про код, перфоманс и матчасть. Ну и просто интересные наблюдения.

Изначально я хотел написать про то: что такое бесплатные вычисления на примере is_range() + сумма елементов массива, но тут выявилась смешная особенность, поэтому пока без is_range().

Начнём с простого - сумма елементов(float) массива. Как написать её быстро? Обычный крестопоц сделает так:

auto summ = accumulate(begin(vec), end(vec), 0.)

Этот код выдаёт 5.6GB/s(мы всё бенчим в л1д 32килобайта массив). Казалось бы, если бы мы слушали всяких «гуру», которые нам говорят: accumulate() - оптимизирован, «ты что умнее создатели stl"а?», «конпелятор умнее тебе - сам всё делает оптимально», «руками что-то делать слишком сложно и не нужно» - то мы бы там и остались с этими 5.6ГБ, но мы пойдём дальше и поймём почему так, и является ли это тем, что намн ужно.

Но посмотрев на код - он не векторизован:

	addq	$4, %rdx
	vcvtss2sd	-4(%rdx), %xmm2, %xmm2
	vaddsd	%xmm2, %xmm1, %xmm1

Почему? Патамучто это основная флоатпроблема: Он не ассоциативен - флоат не имеет в себе точных представлений всех чисел входящих в диапазон его «представления» т.е. порядкопроблемы.

Поэтому конпелятор НЕ ВЕКТОРИЗУЕТ флоат по умолчанию, ну никак. Даже такую банальщину.

Для решения этих проблем - есть ключик -funsafe-math-optimizations, который входит в -ffast-math, который кладёт на точность при вычислениях. Добавив его мы получаем уже 44.9GB/s.

Но теперь мы получаем ещё одну проблему - надо думать: «как бэ сунуть эту ключик не повредив там, где этот ключик не нужен».

Поэтому ноцанам, которые хотят быстро и не хоятт рандомных жоп из-за тупости конпелятора - пишут всё руками. Допустим на той же сишке это пишется так:

double memadd_autovec(buf_t buf) { //5.609465GB/s, либо 44.969652GB/s с ffast-math
  float * it = buf_begin(buf), * end = buf_end(buf), summ = 0.;
  do {
    summ += *it++;
  } while(it != end);
  return summ;
}

double hsumf(__v8sf v) {
  return (v[0] + v[1] + v[2] + v[3] + v[4] + v[5] + v[6] + v[7]);
}

double memadd_vec(buf_t buf) { //45.652002GB/s и класть на ffast-math
  __v8sf * it = buf_begin(buf), * end = buf_end(buf), summ = {};
  do {
    summ += *it++;
  } while(it != end);
  return hsumf(summ);
}

Т.е. разницы никакой нет, кроме нужной нам реализации горизантального сложение вектора. Когда я говорил пацану: «векторную сишку для написания быстрого кода юзать намного проще, чем плюсы» - поцан нипонимэ, да и любые пацаны скажут - ну дак с -ffast-math оба выдают по 45гигов - нахрен эта сишка нужна?

А вот зачем:

double memadd(buf_t buf) { //132.878440GB/s
  __v8sf * it = buf_begin(buf), * end = buf_end(buf), summ = {};
  do {
    summ += *it++;summ += *it++;summ += *it++;summ += *it++;
  } while(it != end);
  return hsumf(summ);
}

Это называется пацанский анролл копипастой, а вот заставить конпелятор нормально что-то разанролить очень сложно.

Если бы мы слушали всяких «гуру», которые нам вещают: «анрол говно и не нужен» - мы бы так и седели с 45-ю гигами, а так мы сидим с 132.878440GB/s. Т.е. анролл нам дал немного не мало ~300%.

Но основная мысль, которую толкают всякие «гуру» - это не надо следить за тактами/считать такты и прочее. Но мы о5 сделаем наоборот и посмотрим что будет.

Т.к. наш юзкейс упирается на 99% в throughput и дёргается одна инструкция, то нам достаточно просто считать теоретическую производительность для моего камня. 4.5(частота камня)*8(т.е. у нас камень с avx, то там вектор 32байта, либо 8флоатов.)*1(throughput нашей инструкции - в данном случае vpaddps из интел мануала). Т.е. 36гигафлопс, либо ~144гига. Т.е. мы сняли овер 90% теоретической производительности - остальные 10% у нас ушли в наши циклы, всякие горизонтальные суммы вектора и прочее, ну и конечно же чтение данных из кеша.

Но самое смешное - на моём хасвеле умножение имеет throughput 0.5 - т.е. на хасвеле умножение быстрее сложения. Это новая забористая трава у интела.

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

Поэтому очень смешно слушать, когда какие-то пацаны говорят: «float point имеет такую же производительность как и инты» - нет, оно имеет такоу же производительность лишь по причине того, что на штеуде инты тормазят так же, как и float.

И чтобы окончательно в этом убедится - мы взглянем на fma(вариации умножения со сложением/вычитанем), которые имеют throughput 0.5 - да, да - на хасвеле умножение+сложение в 2раза быстрее просто сложения. Это уже не просто трава - это что-то принципиально новое.

У целочисленного сложения же throughput 0.5 и казалось бы, если мы поменяем в нашей функции float на int - у нас будет сложение работать в 2раза быстрее, но это не так. Оно выдаёт те же 130гигов, а почему?

Вообще у камня есть такая фича, допустим у нас:

add $1, %reg0//вот тут инструкция add залочит регистр reg0
add $1, %reg0//а эта инструкция уйдёт в лок до особождения предыдущей инструкцией регистра reg0

Чтобы такой жопы небыло - есть специальная фича:

add $1, %reg0//lock reg0
add $1, %reg0//И тут вместо того, чтобы уйти в лок - камень вместо reg0 даёт инструкции любой свободный регистр.

Эта фича называется прееименование регистров, либо как-то так - мне лень гуглить.

Дак вот штука в том, что фича работает через жопу. Мне лень читать мануал и искать почему так, но штука в том, что она ограничивает throughput. На умножении и целочисленном сложении она огранивает throughput c 0.5 до 1.

И вот я решил заюзать сложении через fma:

__v8sf fmaadd(__v8sf a, __v8sf b) {
  return _mm256_fmadd_ps(_mm256_set1_ps(1.), a, b);// a + b * 1. == a + b.
}

double memadd_fma(buf_t buf) {
  __v8sf * it = buf_begin(buf), * end = buf_end(buf), summ = {};
  do {
    summ = fmaadd(summ, *it++);
  } while(it != end);
  return hsumf(summ);
}

Но меня ждала жопа: 27.347290GB/s, причем не анролл и ничего не помогал. Я уж подумал, что мануал наврал, но позже до меня допёрло: у неё latency 5тактов и ((4.5×8)÷5)×4 ~= 29гигов - т.е. я получаю производительность с её latency, но какой жопой оно так?

Потом я вспомнил, что гцц гинерит анрольный код вида:

add $1, %reg0
add $1, %reg0
//а не
add $1, %reg0
add $1, %reg1

Т.е. на неё вообще не работает переименовывание регистров - и инструкции постоянно в локе. Я это проверил и оказался прав. Ну и я написал такой мемадд:


__v8sf fmaadd(__v8sf a, __v8sf b) {
  return _mm256_fmadd_ps(_mm256_set1_ps(1.), a, b);
}

inline void fma_10way_finality(__v8sf * cache, __v8sf * it, __v8sf * end) {
  switch(end - it) {
    case 8:
      *(cache + 7) = fmaadd(*(cache + 7), *(it + 7));
      *(cache + 6) = fmaadd(*(cache + 6), *(it + 6));
    case 6:
      *(cache + 5) = fmaadd(*(cache + 5), *(it + 5));
      *(cache + 4) = fmaadd(*(cache + 4), *(it + 4));
    case 4:
      *(cache + 3) = fmaadd(*(cache + 3), *(it + 3));
      *(cache + 2) = fmaadd(*(cache + 2), *(it + 2));
    case 2:
      *(cache + 1) = fmaadd(*(cache + 1), *(it + 1));
      *(cache + 0) = fmaadd(*(cache + 0), *(it + 0));
    case 0:
      break;
    default: error_at_line(-1, 0, __FILE__, __LINE__, "bad_aligned");
  }
}

double memaddfma_10way(buf_t buf) {
  __v8sf * it = buf_begin(buf), * end = buf_end(buf), summ = (__v8sf){};
  __v8sf * cache = (__v8sf[10]){{}};
  uint64_t i = 0;
  while((it += 10) <= end) {
    *(cache + i) = fmaadd(*(cache + i), *(it - i - 1));++i;
    *(cache + i) = fmaadd(*(cache + i), *(it - i - 1));++i;
    *(cache + i) = fmaadd(*(cache + i), *(it - i - 1));++i;
    *(cache + i) = fmaadd(*(cache + i), *(it - i - 1));++i;
    *(cache + i) = fmaadd(*(cache + i), *(it - i - 1));++i;
    *(cache + i) = fmaadd(*(cache + i), *(it - i - 1));++i;
    *(cache + i) = fmaadd(*(cache + i), *(it - i - 1));++i;
    *(cache + i) = fmaadd(*(cache + i), *(it - i - 1));++i;
    *(cache + i) = fmaadd(*(cache + i), *(it - i - 1));++i;
    *(cache + i) = fmaadd(*(cache + i), *(it - i - 1));++i;
    i = 0;
  }
  fma_10way_finality(cache, (it - 10), end);
  summ = (*(cache + 0) + *(cache + 1) + *(cache + 2) + *(cache + 3) +
	  *(cache + 4) + *(cache + 5) + *(cache + 6) + *(cache + 7) +
	  *(cache + 8) + *(cache + 9));
  return hsumf(summ);
}

Пришлось хреначить финалити, ибо тут «анролл» на 10, а почему на 10 - для максимального throughput"а - надо, чтобы каждый каждый регистр юзался через 5тактов - т.е. 10регистров.

И вся эта порятнка нужна для борьбы с тупостью конпелятора.

Это уже: 214.167252GB/s(раельно там в районе 250 - просто мой бенч говно). 107 гигафлопс на ведро. Из теоретических 144, но тут уже влияние кеша. Причем 50+ из которых выкидываются и просто бесплатные.

Теперь вопрос к пацанам - что нам дадут эти гагфлопсы, когда у нас будет массив не 32килобайта, а 32мегабайта? Зачем нужно выживать максимум, когда скорость памяти отсилы 20-30гигабайт и нам хватит даже С++ кода с ffast-math?

Ну и призываются упомянутые мною пацаны: mv - этот тот експерт, что вещал про «руками переименовывать регистры не надо» и «анрол ваще ненужен», emulek вещал про ненужность счёта тактов, и не понимал что такое «беслпатно», AIv - не понимал в чем проблема плюсов, ck114 - так же не понимал в чем проблема плюсов.

Бенчи: https://gist.github.com/superhackkiller1997/606be26fa158ef75501d - вроде я там ничего не напутал.

P.S. - не выпиливайте пж, пусть пацаны «нужно» или «не нужно». Мне интеерсно. Ну и там рекомендации пацанов.

 , , ,

Carb_blog
()

Добавить значение к CXXFLAGS не редактируя Makefile, реально?

Форум — Development

Добрый вечер. Скорее всего вопрос нубский, и если так то не ругайтесь пожалуйста если он уже где-то обсуждался или описывался и дайте ссылку.
А вопрос в следующем, существует ли универсальный способ добавить значение к какой нибудь переменной в Makefile (нп пр. CXXFLAGS), не редактируя сам файл и не копаясь в нем? Повторюсь, именно добавить значение, а не заменить. Благодарю.

normann
()

Палю годноту: халявный собственный git/GitLab/etc без белого IP

Форум — Development

Смеркалось Самоизоляция. Я тут открыл для себя тор.

Заводим виртуалку/старый_комп ставим туда git bare или целый GitLab. На этой виртуалке ставим тор и выкидываем как сервис 22-й порт и 80-й. Получаем .onion-адреса.

На клиентских компьютераъх для доступа к веб-интерфейсу гиталба используем тор браузер, а в консоли делаем torify git clone git@blablabla.onion:user/your_repo_name.git, затем пользуемся гитом как обычно, а вместо git push/pull делаем torify git push/pull

Результат: полностью халявный и полностью подконтрольный только тебе полноценный гит-репозиторий, безо всяких ограничений, доступный со всего мира. Поднимается за 10 мин, не боится переездов сервера.

Раньше я юзал OpenVPN, но там была морока с ключами, при переезде менялся айпи и настраивалось чуть больше, чем за 10 мин, если бы я знал раньше – было бы круто. Вдруг кому поможет сей пост.

 ,

pihter
()