LINUX.ORG.RU

Объясните сишную магию

 ,


11

14

Пытался понять как реализовать SVG фильтр feComposite, ибо SVG дока унылая, поэтому залез в сорцы вебкита. Там тоже документации ноль, ещё и код очень странный.

Вот что это за ужас (src):

static unsigned char clampByte(int c)
{
    unsigned char buff[] = { static_cast<unsigned char>(c), 255, 0 };
    unsigned uc = static_cast<unsigned>(c);
    return buff[!!(uc & ~0xff) + !!(uc & ~(~0u >> 1))];
}

Я так понимаю, они проверяют что int в 0..255 диапазоне, но уж слишком странным образом.

UPD: коммит, который добавил этот код.

★★★★★

Последнее исправление: RazrFalcon (всего исправлений: 1)

Ответ на: комментарий от RazrFalcon

Проще на лоре спросить

Результат был предсказуем заранее: некоторая суперпозиция rtfm и ненужно

annulen ★★★★★
()
Последнее исправление: annulen (всего исправлений: 1)
Ответ на: комментарий от RazrFalcon

Как вариант, можно было бы попробовать поговорить с автором патча (shallawa) в ирке, но большой вероятностью ответом было бы что-то среднее между rtfm и «давно это было»

annulen ★★★★★
()
Ответ на: комментарий от lovesan

Что-то типа ветвления все же вкралось в ассемблерный выхлоп.

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

gag ★★★★★
()
Ответ на: комментарий от SZT

или какие-то специальные флаги выдумывать, типа -ftiming-attack-protect

Как же так, что его ещё нет.

gag ★★★★★
()
Ответ на: комментарий от SZT

Можно проще сделать:

Действительно. И без ветвлений. И «стандартным» образом. Хмм.

Deleted
()
Ответ на: комментарий от lovesan
#include <stdio.h>

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>

#include <time.h>

#define DATA_ITEMS 64*1024*1024
int data[DATA_ITEMS];

char clamped[DATA_ITEMS];

static unsigned char clampByte(int c)
{
    unsigned char buff[] = { static_cast<unsigned char>(c), 255, 0 };
    unsigned uc = static_cast<unsigned>(c);
    return buff[!!(uc & ~0xff) + !!(uc & ~(~0u >> 1))];
}

static unsigned char clampByteSimple(int c)
{
    if(c < 0) return 0;
    else if(c > 255) return 255;
    else return (unsigned char)c;
}

int main(int argc, char **argv)
{
        int fd;
        unsigned long c = 0, clampsum = 0;
        clock_t s, e;

        fd = open("/dev/urandom", O_RDONLY);

        if (fd == -1)
        {
                puts("unable to open hwrng");
                return -1;
        }

        do 
        {
                c += read(fd, (char*)data + c, sizeof (data) - c);

        }while(c < sizeof data);

        puts("initialized source buffer");

        s = clock();

        for (c = 0; c < DATA_ITEMS; c++)
                clampsum += clamped[c] = clampByteSimple(data[c]);

        e = clock();

        printf("clampByteSimple(): %lu clocks clampsum %lu\n", e - s, clampsum);

        clampsum = 0;
        s = clock();

        for (c = 0; c < DATA_ITEMS; c++)
                clampsum += clamped[c] = clampByte(data[c]);
        e = clock();

        printf("clampByte(): %lu clocks clampsum %lu\n", e - s, clampsum);

        return 0;
}

g++ -march=native -O3 -o clamptest clamp.cpp
initialized source buffer
clampByteSimple(): 264943 clocks clampsum 18446744073676004598
clampByte(): 85256 clocks clampsum 18446744073676004598

Harald ★★★★★
()
Ответ на: комментарий от Harald

а если ещё и выходной буфер clamped[] занулить перед замерами, то выглядит вот так:

initialized source buffer
clampByte(): 86151 clocks clampsum 18446744073675998546
clampByteSimple(): 246074 clocks clampsum 18446744073675998546
Harald ★★★★★
()
Ответ на: комментарий от Harald

Надо было разные перегибы померить ещё. Сейчас ты измеряешь случай, когда большая часть значений находится по обе стороны от диапазона. Это худший случай для варианта с условиями.

i-rinat ★★★★★
()
Ответ на: комментарий от anonymous

Тоже самое, что и вариант из кода топикстартера.

xpahos ★★★★★
()
Ответ на: комментарий от peregrine

Обычная сишная магия на указателях.

LOL код посмотри, какие нах указатели?! преобразование типов это указатели??!!

anonymous2 ★★★★★
()

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

2testers: вы нечестные данные суете, надо сначала узнать их практический характер, прежде чем своими х3 перед носом махать. Пшик ваши тесты, не сильнее чьих-то заявлений.

А уж замерять это все на фоне загрузки и инициализации реакта или ангуляра - да уж, отличное место для хардкорного оптимизона.

anonymous
()
Ответ на: комментарий от Harald

в общем разница около 3 раз в пользу сабжевого кода

А при пользовании коментарий: SZT (22.04.19 23:36:16), разница всего 1,25 раза в пользу сабжевого кода. Но код то при этом имеет «человеческий» облик.

Deleted
()
Последнее исправление: Deleted (всего исправлений: 1)
Ответ на: комментарий от lovesan

Ответ на: комментарий от lovesan 22.04.19 23:01:34

Так и знал, уже набежали хреновы оптимизаторы.

Разлогиниться забыл? Бывает.

Но за разбор спасибо всеравно :)

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

sniper21 ★★★★★
()

Напиши на said@apple.com вот этому человеку, задай ему вопрос, почему был выбран такой подход.

Он эксперт в SVG и графических декодерах. Первоисточник должен лучше объяснить для чего подобное было сделано.

EXL ★★★★★
()
Ответ на: комментарий от crutch_master

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

uint8_t clampb(int32_t c) {
  uint32_t uc = c;  
  uint32_t res = 255 * !(c < 0);
  if(uc < 255) return uc;
  return res;
}

Идите бенчите и проверяйте.

NishiragiShintaro
()
Ответ на: комментарий от SZT

Плюсую, хоть и не эксперт, но это кажется золотая середина.

Twissel ★★★★★
()
Ответ на: комментарий от EXL

вот этому человеку

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

anonymous
()

А что вот это 0u за конструкция? Вроде не одну книжку по Си читал, но конкретно такой штуки вспомнить не могу.

s3rjke
()
Ответ на: комментарий от BceM_IIpuBeT

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

anonymous
()
Ответ на: комментарий от lovesan

Тест на вмеянемость:

else return (unsigned char)c;
-M intel
objdump

Тройное «не прошёл». Маздайских копрофилов ещё можно понять, но:

else return (unsigned char)c;

Понять нельзя. Это явная одарённость.

NishiragiShintaro
()
Ответ на: комментарий от SZT

знаниями two's complement и битовыми масками

Вопрос на засыпку: в C/C++ стандартизировано битовое представление целых (знаковых) чисел?

anonymous
()
Ответ на: комментарий от NishiragiShintaro

Благодарю. Чё-т до смешного просто оказалось.

s3rjke
()
Ответ на: комментарий от lovesan

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

vtVitus ★★★★★
()
Ответ на: комментарий от Deleted

человеческий» облик

Для ТСа оба варианта НЕпонятны, для нормального человека оба ПОнятны.

anonymous
()
Ответ на: комментарий от lovesan

слыха, юнец, ты канпелируй ффмпег а сюда не лезь
ушлёпок малолетний

clampByte(int):                          # @clampByte(int)
        push    eax
        mov     eax, dword ptr [esp + 8]
        mov     byte ptr [esp + 1], al
        mov     word ptr [esp + 2], 255
        xor     ecx, ecx
        cmp     eax, 255
        seta    cl
        shr     eax, 31
        add     eax, ecx
        mov     al, byte ptr [esp + eax + 1]
        pop     ecx
        ret

clampByteSimple(int):                   # @clampByteSimple(int)
        mov     eax, dword ptr [esp + 4]
        test    eax, eax
        js      .LBB1_4
        cmp     eax, 255
        jl      .LBB1_3
        mov     al, -1
.LBB1_3:
        ret
.LBB1_4:
        xor     eax, eax
        ret

anonymous
()

вот что бывает когда без высшего образования лезут в ИТ
раст - удел людей с улицы
что они там смогут напрогать без базовых знаний в математике и показывают такие темы

anonymous
()
Ответ на: комментарий от lovesan

ты не прав

«основная цель сборки» у вебкита виндовс и андроид, на андроиде полудохлые АРМ-ы где «ифы» это смерть производительности

также там очень жесткая привязка к версии компилятора(+-версия компилятора соберет кривой текущий бинарник)

hgt54r
()
Ответ на: комментарий от Rubystar

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

WitcherGeralt ★★
()

автору хочу сказать, что никогда не бери ничего из Вебкита, никогда

Пытался понять как реализовать SVG фильтр feComposite

https://developer.mozilla.org/en-US/docs/Web/SVG/Element/feComposite

копипастинг дефолтных спеков OpenGL

можешь в спеки DX посмотреть там тоже есть формула расчета пикселей растеризации и композитинга https://microsoft.github.io/DirectX-Specs/ (если осилишь тыщи страниц текста)

hgt54r
()
Ответ на: комментарий от lovesan

Ensure the FEComposite arithmetic filter is clamping the resulted color components in a constant time

Суть всё не в ускорении. Хотя смысла я всё равно не уловил.

WitcherGeralt ★★
()
Ответ на: комментарий от anonymous

При всей твоей правоте ты забываешь, что программисты разные бывают.

WitcherGeralt ★★
()
Ответ на: комментарий от WitcherGeralt

Тред не читай сразу отвечай, ТС же уже раскопал, что дело не в байтодрочерстве, а в защите от тайминг атак. Время работы веток не одинаково. Простой код позволяет узнавать диапазон данных.

https://github.com/WebKit/webkit/commit/5bec6fe272396b07db853f0672fe4b0348e465f7

lberserq
()
Последнее исправление: lberserq (всего исправлений: 1)
Ответ на: комментарий от anonymous

вот. и больше по этому треду добавить нечего.

Iron_Bug ★★★★★
()
Ответ на: комментарий от lberserq

защите от тайминг атак.

Которых не существует. Просто какой-то балабол решил набить себе цену, узнав вчера за партой !! на хайповой тему.

NishiragiShintaro
()
Ответ на: комментарий от WitcherGeralt

операторах сравнения

Ещё не проходили на уроках - скорой дойдут. В любом случае это ТС"у никак не поможет.

NishiragiShintaro
()
Ответ на: комментарий от lberserq

Комментарий не читай, сразу отвечай.

можно было то же самое сделать на операторах сравнения

Без веток. У меня претензии только к байтодрочерству.

WitcherGeralt ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.