Задать вопрос
  • Как бороться с error: invalid controlling predicate?

    15432
    @15432
    Если не надоел, то вот ещё вброс:

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

    В своём проекте я использовал фильтрованную разницу гистограмм яркости. Принцип около такого:

    - делим кадр на 64*64 блока (это позволит сравнивать даже кадры разного разрешения)
    - переводим RGB в яркость (гуглите YUV color space, нужен только Y)
    - считаем среднее значение яркости для каждого из блоков (среднее арифметическое годится)
    - уря, получили нечто типа гистограммы для конкретного кадра

    и теперь находим SAD (сумму абсолютных разниц) для гистограм двух кадров. тупо суммируем модули разниц всех ячеек
  • Как бороться с error: invalid controlling predicate?

    15432
    @15432
    NooooN, а тут надо в настройки линковщика прописать подключение библиотеки openmp

    так. вот я уж сомневаюсь, что reduction прокатит во внутреннем цикле. либо параллелить внутренний, либо заводить отдельную сумму типа такого
    #pragma omp parallel for reduction(+:similarity)
    for (int y = 5; y < 1920; y++) 
    {
        int local_sim = 0;
        for (int x = 5; x < 1080; x++) 
        {     
            local_sim += check(x, y);
        }
        similarity += local_sim;
    }

    прагма reduction (+) суммирует все значения с параллельных потоков в указанную переменную после их завершения
  • Как бороться с error: invalid controlling predicate?

    15432
    @15432
    еще одно замечание, пример для OpenMP не очень удачный, потоки будут делить между собой одну и ту же переменную similarity, по-хорошему нужно добавить прагму reduction:

    #pragma omp parallel for reduction(+:similarity)
    for (int y = 5; y < 1920; y++) 
    {
        for (int x = 5; x < 1080; x++) 
        {                
            similarity += check(x, y);
        }
    }


    и те две мелкие функции сделать инлайнами, очень уж они простые чтоб на них два call тратить
  • Как определить подмену юзер агента?

    15432
    @15432
    wiyod, глянул исходники, там вот такая конструкция фигурирует,
    window.navigator['userAgent']
    window.navigator['appVersion']

    не то ли это?
  • Как определить подмену юзер агента?

    15432
    @15432
    Тот "настоящий" получается на стороне клиента Java скриптом
  • Как полностью до нулей посадить аккумулятор li-ion физическим образом?

    15432
    @15432
    Если прям до 0 вольт высадить, то вредно. Вплоть до реакции с газообразованием, вздутием аккумулятора и порчей устройства.

    Другое дело что здесь достаточно до 0% заряда высадить (2.5-3.0v)
  • Можно ли сэкономить память при копипасте?

    15432
    @15432
    Виталий, в архитектуре PowerPC это всего два действия, bl и blr :) ... в x86 кстати тоже, call и ret
    ну да, можно запаковать код и на лету небольшим скриптом его распаковывать в ОЗУ, очень часто в микроконтроллерах встречается
  • Какой мощности ноутбук подойдет для таких целей?

    15432
    @15432
    freeman0204, обязательно ноутбук? За эти деньги можно отличный комп собрать на основе старых серверов с aliexpress, почитайте про Xeon
  • Какой мощности ноутбук подойдет для таких целей?

    15432
    @15432
    Johnny Gat, Согласен.. Мой бук с Core i3-2330 выглядит гораздо шустрее упомянутого выше ноута с i5-7200U
  • Можно ли сэкономить память при копипасте?

    15432
    @15432
    Использование функций - это простое решение, но не идеальное. Если требуется сократить всего несколько инструкций, дешевле будет дублировать, чем делать вызов подпрограммы.

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

    и вуаля, вы получили функцию...
    из вашего описания я приблизительно понял, что вы хотите хардварные макросы. для x86 можно посмотреть в сторону MMX / SSE / AVX расширений, там есть много интересных команд, которые легко заменяют несколько строчек кода. Или можете спроектировать свой собственный процессор с своей системой команд на FPGA :)
  • Можно ли сэкономить память при копипасте?

    15432
    @15432
    Виталий,
    каким образом тело функции понимает, по какому адресу находится вершина стека?

    указатель на стек обычно находится в специальном регистре. в PowerPC это регистр sp

    но если попытаться делать прыжок на один участок кода из разных функций

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

    общий код не будет понимать, с каким контекстом ему работать в данный момент

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

    Но что, если мы имеем дело с многопоточностью

    совсем отдельная тема. там отдельная фигня, которая глобально переключает потоки и состояния. переключится поток - переключатся и все значения регистров. вообще никаких проблем

    Почему считается, что вызов подпрограммы дороже, чем например использование цикла?

    для вызова процедуры нужно сохранить адрес возврата, старое значение стека, если процедура меняет non-volatile регистры, то ещё и их сохранить. пихается это всё в стек, а запись в память не самая быстрая операция. поэтому небольшие часто вызываемые функции оптимальнее вставлять в код напрямую, без вызовов call.
  • Можно ли сэкономить память при копипасте?

    15432
    @15432
    Виталий, вызов подпрограммы это всего лишь "прыжок" на нужный участок кода с запоминанием места, куда нужно вернуться после исполнения этого участка кода. (если эта функция изменяет non-volatile регистры, то их значение тоже сохраняется в стек, это и зовется контекстом)

    в самом простом случае для примера возьмём архитектуру PowerPC (как наиболее привычную мне)

    вот у нас был (не очень оптимальный) код, часть которого (memset) нам хочется вынести как дублирующийся:

    ...
        mr    r3,   r31 //адрес начала
        mr    r4,   r30 //значение
        mr    r5,   r29 //размер
    loop:
        cmp  r5,  0
        beq   exit_loop
        stb    r4,   0(r3) 
        addi  r3,   r3,  1
        addi  r5,   r5,  -1
        b  loop
    exit_loop:
        ...


    мы просто берём этот кусок кода и выносим отдельно, а затем прыгаем на него

    //наш кусок в виде отдельной функции
    memset:
        cmp  r5,  0
        beq   exit_loop
        stb    r4,   0(r3)
        addi  r3,   r3,  1
        addi  r5,   r5,  -1
        b  memset
    exit_loop:
        blr //прыгнуть на запомненное место возврата
        ...
    //в основном коде осталась лишь передача параметров и прыжок
        mr    r3,   r31
        mr    r4,   r30
        mr    r5,   r29
        bl     memset //прыгнуть и сохранить место возврата 
        ... //сюда вернется процессор после исполнения функции
  • Можно ли сэкономить память при копипасте?

    15432
    @15432
    вынести повторяющийся код в отдельную процедуру, да и всё
  • Как скрыть использование виртуального сервера?

    15432
    @15432
    lexchz, подменить можно что угодно, раз это ваш комп. От перехвата пакетов до перекомпиляции браузера из исходников.
    https://addons.mozilla.org/en-US/firefox/addon/mod...
  • Как скрыть использование виртуального сервера?

    15432
    @15432
    lexchz, тогда зачем приватные соксы? можно было на том же VPS запустить проксю...
    и да, браузер таки шлёт версию ОС серверу
    webkay.robinlinus.com
    https://www.whatsmybrowser.org/
  • Как скрыть использование виртуального сервера?

    15432
    @15432
    lexchz, socks прокси тоже могли быть расположены на каких-либо хостингах