• А где проводятся вычисления при работой с изображениями?

    anthtml
    @anthtml
    Системный администратор программист радиолюбитель
    Разница в заточенности GPU именно под определенный тип операций, из-за чего при с виду одинаковой мощности некоторые данные на GPU обрабатываются гораздо быстрее чем на CPU. Это как сейчас в Биткоинах - на GPU майнить можно, но Asic-чипы делают это гораздо шустрее т.к. заточены именно под криптооперации.
    Компиляторы по умолчанию делают проект который должен работать на всем, CUDA есть далеко не везде. Поэтому если хотите использовать CUDA, то читайте как ее программировать
    Ответ написан
    2 комментария
  • А где проводятся вычисления при работой с изображениями?

    gbg
    @gbg Куратор тега Программирование
    Любые ответы на любые вопросы
    Нельзя просто так взять и перенести вычисления на GPU - для этого (на 2021 год) программа должна разрабатываться отдельно, с учетом возможностей и структуры этого самого GPU.

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

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

    Отсюда следует, что выиграть, считая на GPU, можно только тогда, когда данные независимы, хорошо умещаются в память видеокарты и успевают перекачиваться.
    Ответ написан
    2 комментария
  • Что такое Потоки на уровне ОС? В 1-ядерном процессоре же всего 1 поток?

    gbg
    @gbg
    Любые ответы на любые вопросы
    Потоки переключаются с квантом около 28 миллисекунд или около того.

    Да, если навертеть много потоков, кэш будет вымываться. А вы думали, в сказку попали? Хорошие HPC программы не запускают тредов больше чем ядер.

    Почему с помощью распарализации потоков можно получить выигрыш в скорости вычислений?

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

    Тогда почему вообще вся ОС не асинхронная в одном потоке как Node JS?

    Поздравляю вас с изобретением Windows 3.1. Вы наверное не застали, но эта ОС наглухо зависала вместе с приложением, если оно зависало.
    Ответ написан
    9 комментариев
  • Самый быстрый исполняемый код?

    @halyavin
    Человек выдает более быстрый код. Компиляторы на самом деле ничего не знают о конвеерах и правильно делают — они сильно отличаются на разных процессорах, так что оптимизация под один ухудшит скорость на другом. Как раз вставка nop'ов это наглядно показывает. Функция может ускорится на 5-10%, так почему же компилятор не вставил этот nop?! Все что они делают — это выравнивают циклы. Эта работа легко автоматизируется макросами.

    Когда говорят об NP-полноте оптимизации программы и возможности компилятора перебрать множество вариантов люди совершенно забывают о том, что человек и компьютер играют по разным правилам — человек не ограничен исходной программой и может делать оптимизации, которые компилятору запрещены (например, человек может знать, что те или иные указатели не являются алиасами при нормальной работе программы; перевернуть цикл, поскольку в спецификации указано, что порядок выдачи результатов не важен) или использовать конструкции, которых нет в языке программирования (одновременное деление и получение остатка, умножение 32-битных чисел с 64-битным результатом). И чем сложнее алгоритм, тем больше количество вариантов у человека по сравнению с компилятором.

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

    @none7
    Инструкции x86 разбросаны довольно хаотично по числовому диапазону, не говоря уже про их длину, но самому процессору намного проще декодировать инструкции, чем программам. Он просто имеет внутри дерево, если старший бит первого байта инструкции равен 0 одна ветвь, иначе другая. Так по ветвям он спускается и например доходит до инструкции 01010b (push reg) и вот он уже знает, что длина этой инструкции 5 бит + 3 бита аргументов. И может даже сразу запустить найденную инструкцию, если это какой-нибудь i286. И всё за 1 такт.
    Ответ написан
  • Как процессор знает сколько байт занимает команда машинного кода?

    @pfg21
    ex-турист
    первое машинное слово команды попадает в декодер команд, и уже декодер команд распознает, что делать с остальными словами.
    в современом многостадийном декодере это происходит задолго до ее выполнения. поэтому задержек нет.
    Ответ написан
    2 комментария
  • Как сделать службу программу, которая бы запускалась по нажатию клавиши?

    HemulGM
    @HemulGM Куратор тега Windows
    Delphi Developer, сис. админ
    Штатное средство, которое решает твою задачу (RegisterHotKey)
    https://docs.microsoft.com/en-us/windows/win32/api...

    Пример использования
    https://www.targetprocess.com/blog/hotkeys-binding...
    https://ourcodeworld.com/articles/read/573/how-to-...
    Ответ написан
    Комментировать
  • Как в Windows менять язык так что бы в момент переключения языка курсор ввода элементы не уходил с inputa?

    @d-stream
    Готовые решения - не подаю, но...
    Alt-Shift - дебильнейшая комбинация клавиш. Притом я совсем не понимаю Microsoft, которая одной рукой сделала именно эту комбинацию дефолтной, а другой рукой активно продвигает фокусировку горячих клавиш по одиночному Alt

    Как итог: быстрое переключение такой комбинацией и набор текста = потеря первого символа (а то и "перескок" в меню).

    Ctrl-Shift во-первых не имеет такой проблемы, во-вторых намного комфортнее: на подавляющем большинстве клавиатур эти клавиши имеют общие границы = можно тыкнуть эту комбинацию одним пальцем. Плюс к этому эти клавиши опять же в подавляющем большинстве случаев находятся на самом краю клавиатурного поля, Alt "гуляет" и на ноутбуках например находится после Fn и Win, на обычных клавиатурах - как минимум за Win и на раритетных - сразу за Ctrl
    Ответ написан
    1 комментарий
  • Как в Windows менять язык так что бы в момент переключения языка курсор ввода элементы не уходил с inputa?

    @res2001
    Developer, ex-admin
    Похоже вы как-то специфически нажимаете Alt+Shift, так что сначала жмете Alt. А по Altу винда переносит фокус ввода на первый пункт меню программы.
    Приучитесь сначала жать Shift, а затем Alt. Клавиша Shift безопасна в этом смысле :)
    Ответ написан
    Комментировать
  • Как в Windows менять язык так что бы в момент переключения языка курсор ввода элементы не уходил с inputa?

    sashkets
    @sashkets
    Прекратил отвечать после 24.02.2022
    в 10 язык переключается комбинацией

    флагвинды + пробел
    Ответ написан
    Комментировать
  • Как именно работает Сумматор в процессоре? Сигналы же не могут одновременно прийти, то есть будет 2 работы?

    @nehrung
    Не забывайте кликать кнопку "Отметить решением"!
    Я уже отвечал недавно на вопрос, как работает сумматор, и вопрос этот был ваш. Видимо, вы не поняли мой ответ, хотя мне казалось, он сформулирован достаточно просто. Ну что ж, придётся разжёвывать.
    Прежде всего, сам по себе сумматор - комбинационная цифровая схема, и как таковой, он в тактовых импульсах не нуждается. Подали на его входы два операнда, и спустя время задержки на выходе появляется сумма. Но разжуём уже до мельчайших косточек - возьмём идеальный сумматор, составленный из идеальных логических элементов, не имеющих задержек распространения сигнала. Исходное состояние - на входах нули. На выходе, естественно, тоже нуль. Подаём первый операнд. Задержек нет, поэтому на выходе тут же появляется этот же операнд (он суммировался с нулём на другом входе). Затем подаём второй операнд - на выходе тут же (т.е. опять-таки без задержек) появляется сумма. Надеюсь, тут всё понятно (собственно, это мой ответ на эти ваши 0.0000000001 секунды - да хоть 0.00000000000000000000000000000001 сек, в идеальном сумматоре это без разницы).
    Теперь рассмотрим сумматор из реальных логических элементов, имеющих задержку распространения. В нём всё точно так же, вот только на время суммарной задержки его составных частей на выходе будет неизвестно что. Вот так, буквально - подали первый операнд, на выходе неизвестно что (какая-то каша, которой нельзя доверять), и спустя время задержки каша успокаивается, и мы обнаруживаем на выходе этот самый первый операнд, который суммирован с нулём. Подали второй операнд - то же самое: сумму видим на выходе, когда период задержек закончился.
    Именно по этой причине реальный сумматор в реальном процессоре снабжается входными и выходным регистрами - они позволяют отсеять те его состояния, которым нельзя доверять. Записали в первый регистр первый операнд по тактовому импульсу 1, затем второй по импульсу 2 (впрочем, можно и одновременно), и только потом по тактовому импульсу 3 записываем сумму в выходной регистр и пускаем дальше туда, где она понадобилась. Время между тактами должно быть заведомо больше, чем общие задержки в сумматоре - только при этом условии мы можем быть уверены в точности его работы. Попытки уменьшить тактовое время (мол, вот я счас сделаю мой проц более быстрым) неизбежно приведут к сбоям, т.е. к ошибкам в вычислениях.
    Теперь понятно? Если всё ещё нет, задавайте вопросы, только не в виде программного кода - на этом уровне рассмотрения он не нужен.
    И ещё: вы сделали два одинаковых вопроса - так тут не делается. Настоятельно советую удалить второй, который сейчас заблокирован.
    Ответ написан
    2 комментария
  • Как именно работает Сумматор в процессоре? Сигналы же не могут одновременно прийти, то есть будет 2 работы?

    begemot_sun
    @begemot_sun
    Программист в душе.
    К любому мало-мальки сложному устройству внутри процессора подводится тактовая частота.
    И все элементы внутри такого устройства работают исходя из этой частоты.
    Пусть имеется сумматор с 2 входами. Третий вход такого сумматора всегда будет тактовым. Т.о.
    сумматор будет выполнять свою работу только при изменении тактового сигнала скажем с 0 на 1.
    т.о. неважно когда приходят (на самом деле не приходят, а выставляются) уровни на входах. Важно какие они в момент прихода тактового импульса.

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

    @rPman
    Приходит именно одновременно, даже если есть какие то различие из-за скорости света, времени там прилично, например между тактами.

    Операция сложения делится на кучу мелких, типа поместить значение ячейки памяти в регистр, сложить, переместить результат, все они складываются в очередь и исполняются как получится, порядок определяет специальный модуль, если он решит что можно одновременно то так и сделает.
    Ответ написан
    Комментировать
  • Почему в VirtualBox во внутренней ОС показывает "2Гб Оперативки используется", а во внешней этих 2Гб нигде нету?

    fzfx
    @fzfx
    18,5 дм
    Видимо либо у вас отображаются только пользовательские процессы, либо потребляется оперативка в режиме ядра (ОЗУ выделяется драйверу и отсутствует в списке процессов).
    В любом случае первым делом потребление оперативки системой нужно отслеживать по графику потребления ОЗУ, а не по списку процессов.
    Ответ написан
    Комментировать
  • КАК ИСПОЛЬЗОВАТЬ РЕСУРСЫ ДРУГОГО КОМПА?

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

    По факту, вы пишите приложение, для простоты предположим что окружение разработчика и на сервере похожее/совместимое, а затем просто его запускаете как то на удаленных серверах.
    К примеру вы запускаете локально ваше приложение просто в командной строке, а теперь добавьте к нему в начале ssh login@server, и вот уже ваш скрипт работает на удаленном сервере но вывод его транслируется так же к вам локально. С точки зрения юзабилити вы как бы запускаете все у себя же локально но задействованные мощности совокупны использованным серверам. Само собой нужно разрабатывать свой софт таким образом чтобы он в принципе мог запускаться на нескольких машинах (хотя есть инструменты, позволяющие симулировать работу одной машины на кластере, автоматически расшаривая в т.ч. общую память, получая как бы многоядерную машину с огромным объемом памяти, правда это не так эффективно как заниматься этим самому).

    Вполне возможно вам понадобится какой то контроль над этим процессом и главное данными, с которыми ваши приложения работают. Когда у вас 1-2..ну пять серверов, можно что то руками делать, следить за результатом самостоятельно и в зависимости от результата принимать решение, но логичнее это доверить так же машине (написать приложение, которое позволит управлять процессом запуска/остановки служб, следить за результатом их работы, ошибками, мониторить нагрузку и эффективность и как то это все предоставлять вам человеку в виде ui, и помнить что все это будет в процессе разработки и модификации своих приложений).

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

    Почему весь мир полюбил сервисы вида amazon? потому что они как истинное облако позволяет не заморачиваться с тем как именно реализуется ваша задача, а так же есть инструменты по автоматизации всего и вся. даже когда речь идет о виртуальных машинах, вы можете автоматически разворачивать новые инстансы, удалять ненужные, останавливать, бакапить, снапшотить... Например, если ваша задача может быть ускорена распараллеливанием, то в конечном счете какая бы она сложной не была вы можете получить результат максимально быстро, задействовав максимум необходимых мощностей (понятно за максимальные деньги,но иногда время того стоит).

    p.s. не пытайтесь найти на все готовое решение, фреймворк, библиотеку, тулкит... особенно когда задача слишком абстрактна, можете потратить на разборки больше времени чем накидать простой набор утилит самому, ведь лучше вас в вашей задаче никто не разбирается
    Ответ написан
    Комментировать
  • Как работает тактовый генератор сигналов Процессора?

    @nehrung
    Не забывайте кликать кнопку "Отметить решением"!
    1. У вас в заголовке - один вопрос (про тактовый генератор), а в тексте - совсем другой (про работу регистров и сумматора). Вообще-то можно по отдельности ответить на оба.
    Тактовый генератор - это просто источник периодических импульсов стандартизованного вида, и он может быть каким угодно, лишь бы давал то, что требуется остальным элементам процессора. Иногда к нему предъявляются дополнительные требования - скажем, стабильная частота, или две сдвинутые по времени серии импульсов (двухфазность).
    Сумматор - это комбинационная логика, которой ни с какого боку не нужны тактовые импульсы. Подали операнды на входы, и спустя время задержки получили на выходе сумму. А регистры - не так, их состояние зависит не только от текущих сигналов, но и от того, что было раньше (т.н. последовательностная логика). Причём зачастую триггеры, из которых состоят регистры, могут строиться таким образом, чтобы использовать не только фронты тактовых импульсов, но и их спады. В вашем случае достаточно подать на D-входы регистров исходные операнды, а затем одновременно на оба счётных входа - тактовый импульс. Спустя задержку на выходе сумматора образуется сумма. Какие сложности вас испугали в этом простом процессе, мне непонятно.
    2. Шина управления содержит не только линию передачи тактов, но и другие линии, передающие другие сигналы - например, сигналы записи/чтения портов ввода-вывода и памяти, сигналы прерывания (их несколько разных видов), служебные сигналы процессора (скажем, перевод в пошаговый режим), ну и т.д.
    Но что будет если подать сигнал быстрее, чем успел обработаться предбудущий сигнал?
    3. Сбой будет, поскольку подав тактовый импульс раньше, чем устаканилось состояние цифровой схемы от предыдущего импульса, т.е. фактически уменьшая период тактовой последовательности, вы делаете попытку оперировать неизвестно чем. Если от процессора требуется надёжная работа без ошибок, то уменьшать период тактировки (или, другими словами, превышать тактовую частоту относительно её номинального значения) нельзя.
    Хотя есть такие люди (оверклокеры), которым это правило пофик.
    Ответ написан
    1 комментарий
  • Как выводить графику в wpf, ПОЧЕМУ У МЕНЯ зависает окно на 1-2 секунды, после любого изменения размеров окна?

    vabka
    @vabka Куратор тега C#
    Токсичный шарпист
    1. Картинку рисуй в фоновом потоке, а выводи в основном
    2. Не используй System.Drawing - он тормозной. Посмотри в сторону skia
    Для 3d есть opengl и другие специальные api для рисования при помощи видеокарты.
    Ответ написан
    Комментировать
  • Как упорядочить очередь из разных групп?

    sergiks
    @sergiks Куратор тега Алгоритмы
    ♬♬
    Арифметика расставит элементы каждой группы отдельно на отрезке.
    a   a   a
    b   b   b
    c c c c c c

    Найти длину самой длинной группы. Делить её на длину очередной группы — получится шаг для группы.
    Назначить каждому элементу свойством его положение на «отрезке».
    Сложить все в один массив и отсортировать по этому положению.

    Результат недетерменирован. Скажем, в этом примере на позиции 0 сразу три элемента: a, b и c. Какой из них будет на котором из трёх первых мест – ничем не определено.

    реализация на JS
    const groups = {
      A: ['a', 'a', 'a',],
      B: ['b', 'b', 'b', 'b',],
      C: ['c', 'c', 'c', 'c', 'c', 'c',],
    };
    
    const longest = Math.max.apply(null, Object.values(groups).map(a => a.length));
    const sortMe = [];
    for (let p in groups) {
      const values = groups[p];
      const step = longest / values.length; // 1 and bigger
      values.forEach((v, i) => sortMe.push({w: i * step, v: v}));
    }
    
    sortMe.sort((a, b) => a.w - b.w);
    
    const result = sortMe.map(el => el.v);
    
    console.log(result);
    // ["a", "b", "c", "c", "b", "a", "c", "b", "c", "a", "c", "b", "c"]
    Ответ написан
    3 комментария