Pull to refresh
196
0.1
Андрей Дмитриев @AndreyDmitriev

Пользователь

Send message

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

Энергия каждого их этих квантов равна энергии покоя электрона или позитрона.

\mu_e C^2=h \nu

При этом энергия независимо от знака заряда частиц всегда положительна.

Я ни в коей мере не хочу Вас обидеть, но когда я грыз гранит науки на Физико-Техническом факультете питерского Политеха в начале девяностых, то за подобную формулировку студент сильно рисковал быть изгнанным с экзамена, а зачётка его летела бы следом в открытую дверь, сопровождаемая криком преподавателя "вы не физик, вы — дворник!" (я сам был в числе таких, когда не смог назвать четыре фундаментальных взаимодействия). Ну помилосердствуйте, какие такие "кинетическая и электрическая материи", а? Нет таких в природе. Аннигиляция электрона и позитрона действительно порождает два гамма кванта (обычные фотоны, на самом деле), причём с энергией по 511 keV. Дальше про то, как "не очень энергичные кванты оказываются на одной траектории" я уже не читал, поскольку разлетаются они в строго противоположные стороны. Хотя, как последний шанс, преподаватель мог спросить студента — почему именно 511, откуда она такая получается и почему в противоположные стороны?

Задача вовремя (в смысле заранее) включить поворотник, кстати, нетривиальная сама по себе. И если при проезде перекрёстков можно в теории воспользоваться маршрутом навигации (если она активна), то при обгоне чуть сложнее (если машина не на автопилоте едет). Вообще БМВ должна поупражняться на задачах попроще. Вот у меня Мини Купер гибридный, довольно навороченный, эта марка вроде часть БМВ, так она, к примеру, тупо вырубает радио и климат по таймеру, даже если я сижу в машине. Вот казалось бы, датчик присутствия копеечная штука, да он и есть в сиденье, в пассажирском точно есть, но нет. Самое издевательское, что она отключает всё даже в тот момент, если я в навигации ввожу адрес, или переключаю радиостанции, при этом, зараза, ещё издевательски пишет, мол я через несколько секунд выключу систему, и чтобы включить её обратно, вам надо будет нажать кнопку включения. Там две команды явно софт писали, одна из которых отвечала за таймер и работала в реджиме полного пофигизма. А вы тут про интеллектуальные поворотники...

Немного нагружает, да, но не на "30-70%", я вот вижу процента четыре от силы:

Как говорится — ну да, ну ужас, но не "УЖАС-УЖАС!"...

В LabVIEW в общем всё тоже самое можно устроить, но, пожалуй чуть проще.

Вот смотите, допустим у меня два for цикла, я сделаю ровно такой же вывод, как у вас, только всё же назову это дело потоками, поскольку тут два потока и используется, и вот:

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

А теперь смотрите, я кладу оба эти потока в однопоточный Timed Loop (и заметтьте, что бонусом я могу ещё и ядро проца указать, на котором этот поток должен исполняться), и вот:

Теперь они честно отрабатывают в одном потоке c ID 13116. При этом они друг друга не тормозят, если я сделаю второе "волокно" сильно задумчивым, то первое его ждать не будет, а отработает разом все свои пять итераций:

В GetThreadID () я бросил небольшую задержку, она заставляет вставать "волокно" на ощутимое время, тогда эффект "поочерёдности" при примерно равной скорости исполнения волокон нагляднее получается, вот код, там честный GetCurrentThreadId() из WinAPI:

#include <Windows.h>
#include "Fibers.h"

int GetThreadID ()
{
	Sleep(10);
	return GetCurrentThreadId();
}

Как-то так. NI называет параллельно исполняющиеся несвязанные участки кода "чанками", (chunks), они всегда исполняются в параллельных потоках, пока не исчерпается пул, а дальше будут отрабатывать как "волокна". Эх, было б круто, если б вы вообще всё на чистом асме, включая вывод в консоль. Может в отпуске сделаю, когда заняться будет нечем. И да, спасибо!

Я имел ввиду однократный щелчок по кнопке максимизации. А этой фишкой я эпизодески пользуюсь, но как-то не прижилось, а может оттого, что дома я на Линукс (Pop!_OS) пересаживаюсь, и в Cosmic Desktop оно чуть удобнее решено.

Я ребёнку подарил Sony FDR-AX53:

Дитё довольно как слон, там совершенно бомбический стабилизатор и очень цепкий автофокус. Сам снимаю на старенькую Nikon D600, видео эпизодически, но она тяжеловата для этого и держать зеркалку при сьёмке не так удобно как камкордер. Разве что сменные объективы в плюсе, а так особых преимуществ нет, да и звук так себе, а внешний микрофон навешивать не хочется.

Я держу VS Code слева, консоль посередине и документацию справа — всё видно без скролла.

Вопрос: если вы жамкнете по кнопке максимизации окна в VS Code, консоли, или в чём вы там смотрите доки, то эти окна развернутся соответственно на треть дескопа, или на весь монитор? Я это к тому, что "правильного" менеджера, который бы эмулировал три монитора я в природе не встречал. Я тоже пробовал пересесть на сорокадюймовый монитор, но вернулся к старой конфигурации — тридцать дюймов по центру и два по двадцать вертикально:

Меня гугль в конце прошлого года отчаянно невзлюбил (при этом единственное объяснение - то, что пара страниц с наибольшей посещаемостью ушли с главной, а так там просто блог-записная книжка на hugo, в основном "для себя"). Ну, бывает.

Глядя на статистику, я вспоминаю гениальные слова пьяного наборщика из Вирджиния-сити (из фильма "Марк Твен против"): "...слава — дым; популярность — случайность... Единственное, что прочно на этом свете — это безвестность".

К тому же не просто дубль, есть программы, да тот же far manager, где нажатия правого и левого контрола различаются. У меня дома клава Sun, полумеханика винтажная, но без правого контрола, это неудобно, даже хотя я клавиши переназначил, а вот fn не всегда перенеазначить можно.

Что касается гражданства — тут есть нюанс. Дело в том, что оно даёт не только «плюшки» и безусловные удобства в виде заметного организационного упрощения жизни в стране, но и накладывает, скажем так, определённые обязательства на новоиспечённого гражданина, как к примеру и то, что на протяжении какого-то времени с момента приезда в Израиль молодому репатрианту следует зарегистрироваться в пункте призыва. И вот слушаю я новости по радио — буквально позавчера: «…Сообщается, что Израиль намерен мобилизовать десятки тысяч резервистов. Они должны заменить регулярные войска на Западном берегу, чтобы их можно было отправить в сектор Газа…». Ну так, чисто для информации.

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

Считать или нет "жизнь в деревне" минусом - в общем сильно зависит от индивиуума, мы вот живём в немецкой деревне, а ездим отдыхать в шведские или норвежские но опять же деревни. Вот чтоб на берегу озера, отдельный дом, сауна, камин и всё такое. Это на любителя, но в большом городе жить не хочется (это притом, что я почти тридцать лет в Питере прожил), а если точнее, то идеально, когда большой город неподалёку (Гамбург в нашем случае), но не в нём.

Мы в прошлом году два раза в Швеции были, ездили на машине из Германии через Данию. Осенью паспорта проверяли на съезде с Эресуннского моста, там будки стоят, причём попросили документы всех сидящих в машине. А вот под Рождество никто не проверял, пограничники, видимо ушли отмечать.

По моему мнению (но я интроверт), у каждого программиста должен быть отдельный кабинет, с закрывающейся дверью, окном и стенами для липких листочков. "Оупен спейсы" — зло страшное, когда нашу компанию купили американцы, они первым делом снесли несколько стен и засадили всех в один зал. Меня вот ровно на три месяца хватило, самых бесполезных месяцев моей жизни. Потом я снова перебрался в кабинет. В домашнем офисе — тоже самое, должна быть хоть маленькая, но отдельная комнатушка. Это притом, что я работаю в промышленном программировании, и иногда приходится работать на заводе, в шумозащитных наушниках, но это другое.

В прошлом году как раз наблюдал моих детей — гимназистов, с рулеткой, изображающих из себя Галилея — один ронял конфету, второй снимал... Я спросил — оказалось, что им задали измерить g в домашних условиях. Я (как закончивший физтех со степенью магистра) заметил им, что это в общем похвально, но сильно точно с метровой высоты не получится, да и конфету лучше заменить на стальной шарик... В голове у меня сразу родилось два плана — либо взять цифрозеркалку на штативе с хорошим объективом, выставить там 60 FPS, затем раздербанить видео на картинки через ffmpeg, там и посмотреть, на каком кадре начинается и заканчивается падение, либо я могу притащить с работы пару ультразвуковых датчиков, прилепить их на стену, подкинуть их на входы ардуинки, или ещё лучше, сRio, там FPGA на 40 MHz, я просто посчитаю такты между фронтами... Я предложил им помочь — Не, пап, спасибо, мы сами... Нам тут в гимназии приложуху выдали... Дальше я с изумлением наблюдал, как прямо на смартофоне отрок загрузил видео, там оно покадрово, затем, вот прямо на экране тыркнул в падающую конфетку, потом ещё раз, и через пару минут выдал — вот, примерно 9,6, да ещё и с графиками зависимости координат и скорости от времени, этой точности нам достаточно, нам важен принцип. Я был впечатлён. Эх, мне бы такие возможности, когда я грыз гранит науки тридцать лет назад.

простите но на С++ есть нюансы,

Ну при чём тут плюсплюсы-то? Я Вас уверяю, интринсики будут одинаковы что там что на Си. Вот, смотрите, код из пятой главы - это ровно тоже что и у Вас, только с FMA до кучи. Тут как раз нет вообще никаких нюансов.

на Расте будет либо так же по скорости либо быстрее ... так же есть разница в платформах,...

Вы мешаете вообще всё в одну кучу.

как начать через перемножения матриц пользоваться ускоряющимися регистрами

Вы термин "ускоряющихся регистров" сами придумали? Вот я бы порекомендовал раздобыть книжку Даниэля Куссвюрма "Профессиональное программирование на ассемблере x64 с расширениями AVX, AVX2 и AVX-512" и прочесть, хотя бы ради терминологии. Второе издание переведено на руский, третье пока нет, вроде. Лучше возьмите обе, на английском тоже "Kusswurm Daniel — Modern X86 Assembly Language Programming" (там в русском таки есть косяки перевода). Хотя эти книжки и не идеальны, но в них есть ровно всё то, что Вы выше изложили, причём весь код из книги издательством выложен на Гитхабе, включая использование FMA и произвольные размеры матриц. Если на интрисиках, то "Modern Parallel Programming with C++ and Assembly Language" того же автора, а код к ней вот здесь.

Вам имело смысл соревноваться не с Си кодом, а с библиотеками, вот в Intel MKL вроде это есть, ну и там gemm() из LAPACK, по-моему и то и другое под никсами живёт (хотя я тут не спец). Вам имело смысл попробовать реализовать это дело для матриц произвольного размера, как одинарной так и двойной точности и если бы Вы обогнали по скорости существующие библиотеки, то получилась бы хорошая статья. Кроме того, у Вас своеобразный стиль изложения (Вы дайте кому-нибубдь прочитать перед публикацией), ну и по коду можно придраться, ну вот зачем столько файлов включать для интрисиков, там же один immintrin.h всего нужен, смысл верчения циклов "с ускорением" от меня тоже ускользает, и т.д.

Вы точно этот код запускали и он точно вам один и тот же ответ выдает с наивным методом?

Я не поленился проверить, да, он выдаёт тот же результат, что и референсный dgemm(). Правда я перебросил его на double:

Скрытый текст
MATMULDLL_API void mulm4VVVd(double* result, double* a, double* b)
{
    __m256d row0 = _mm256_loadu_pd(&b[0]);
    __m256d row1 = _mm256_loadu_pd(&b[4]);
    __m256d row2 = _mm256_loadu_pd(&b[8]);
    __m256d row3 = _mm256_loadu_pd(&b[12]);

    __m256d newRow0 = _mm256_mul_pd(row0, _mm256_set1_pd(a[0]));
    newRow0 = _mm256_add_pd(newRow0, _mm256_mul_pd(row1, _mm256_set1_pd(a[1])));
    newRow0 = _mm256_add_pd(newRow0, _mm256_mul_pd(row2, _mm256_set1_pd(a[2])));
    newRow0 = _mm256_add_pd(newRow0, _mm256_mul_pd(row3, _mm256_set1_pd(a[3])));

    __m256d newRow1 = _mm256_mul_pd(row0, _mm256_set1_pd(a[4]));
    newRow1 = _mm256_add_pd(newRow1, _mm256_mul_pd(row1, _mm256_set1_pd(a[5])));
    newRow1 = _mm256_add_pd(newRow1, _mm256_mul_pd(row2, _mm256_set1_pd(a[6])));
    newRow1 = _mm256_add_pd(newRow1, _mm256_mul_pd(row3, _mm256_set1_pd(a[7])));

    __m256d newRow2 = _mm256_mul_pd(row0, _mm256_set1_pd(a[8]));
    newRow2 = _mm256_add_pd(newRow2, _mm256_mul_pd(row1, _mm256_set1_pd(a[9])));
    newRow2 = _mm256_add_pd(newRow2, _mm256_mul_pd(row2, _mm256_set1_pd(a[10])));
    newRow2 = _mm256_add_pd(newRow2, _mm256_mul_pd(row3, _mm256_set1_pd(a[11])));

    __m256d newRow3 = _mm256_mul_pd(row0, _mm256_set1_pd(a[12]));
    newRow3 = _mm256_add_pd(newRow3, _mm256_mul_pd(row1, _mm256_set1_pd(a[13])));
    newRow3 = _mm256_add_pd(newRow3, _mm256_mul_pd(row2, _mm256_set1_pd(a[14])));
    newRow3 = _mm256_add_pd(newRow3, _mm256_mul_pd(row3, _mm256_set1_pd(a[15])));

    _mm256_storeu_pd(&result[0], newRow0);
    _mm256_storeu_pd(&result[4], newRow1);
    _mm256_storeu_pd(&result[8], newRow2);
    _mm256_storeu_pd(&result[12], newRow3);
}

И он, кстати, в данном частном случае 4х4 обгоняет по производительности реализацию LabVIEW. Ну, может и пригодится когда-нибудь. Хотя сейчас такой код практически сразу ИИ сходу набрасывает.

Сложно сказать, попасть служить в полицию тут не так просто, есть определённый конкурс, берут не всех, ну и профессия в общем довольно престижная, так как статус госслужащего даёт определённые преимущества в виде страховки и пенсии (точнее пенсиона). Опять же полицейские тут штрафы за парковку редко выписывают - этим городские службы занимаются, ему туда надо.

1
23 ...

Information

Rating
5,719-th
Location
Ahrensburg, Schleswig-Holstein, Германия
Date of birth
Registered
Activity