<bgdev />free

| |  


All tags 2023 9may ai algorithm alpha amd american api argon2 arm asm asmbb assembler attachment awareness balgaria bay888 bcrypt bender beta bgdev-next bgdev-next.👍 big.data bitchnigga bitcoin bmw boi borg brexit bug bulgaria business c cad chat cloud computer-names console crossorigin deprivation desktop dna dotnet email eupl falling feature forum foundation fp fresh fun game gcc github goats google gpl gpt gpt.3.5 gypsies happiness harvard hash improvement include investment it java javascript js kleta kleta.maqka.balg lambi language learning leftovers legend level levenshtein.dist libx license linkedlist linux m0 ma mcafee mele microsoft minimag minimalism negro net nginx nigga not.a.bug oop paradigm parler patterns perception persuasion pipe play.station politics populi pornhub pow pro programming protonmail python reba rust sci-fi scripting seks seo server shell sleep smartbeauty soft-skills sqlite srabska sse starship sugerface syntax tablet tailwindcss telegram theme thug troll80lvl tutanota typescript uacme ui uk unix untermensch upload uptime usa utilities ux vb via viber virtual.reality vox vps vulnerable war wasm weapons-grade web windows word x86 xbox xss youtube zig ziglang Übermensch БОКЕБЪЛГАРИН БЪ БЪлгария Белезниците Били Били.Белезниците БялДонор Веган Виста Възраждане ГЛУПАК Гана Глиста ЕС Казарма Копейкин Мода.и.овча.мисъ НЕКАДЪРНИК НРБ ПО-ЗЛЕ.И.ОТ.РАБИ Подкасти Разни Румен СИК СКУМ СетенЧук Скум ТИР Туче Украйна Урсула Яначков авангард аз айфонджия алгоритми амбиции анархизъм антиваксъри армения аудио аутисти бази.данни бакъп без без.пръчове безпросвета бенчмарк биготи биомаса бира боклук борисов ботев брадва булшит бъг бъгове бял ваксина вандал век венерика викинги вицове вишу война вървежен гана ганорник гей гейщина германия герои гешев глупак говеда групировка гюбек данъкоплатец двойни.стандарти дедотия демокрация дизайн дисциплина добитък докери долар донори држава дришльо дрон ебане еврогейски.съюз езици експеримент електроника електроника.s2 емиграция ендпойнт енум ерген ергономия жалкар задача затоплизъм защита здраве златен злато игри идеали идиократ идиократи идиокрация идиот избори избори.рабин изкуство икономика имбецили имейл инвестиране инокулация инструмента интервю ипад искам.да.си.реда казах камшикодържач капитализъм карабах караница картечница кино клавиатура ковид19 колайдер колям.кур комари комплексар комунизъм консолидация конспирации космонавтика кофа кофит-19 краставица криптовалути курви кучелюбци лайно лаладжия лаптоп либерастия литература лоши.практики луд лъжеучени лъжец любов майни майтапи малоумници мафия мениджмънт месо местене метавселена метафизика механика мистика мисъл мода мода.овча.мисъл модерация морал мутра мутри наука национализъм не.it негър некадърник некадърници неон нидерландия овча овчи олигофрени организация офтопик парички партия педал пенджури пенсия пишока плюскане победа погромист поезия политика порно посредствен почивка празници прасе превод предалщина програмиране проект проста простотии против.правилата проф пръч пръч.дришльо пръчка психика психични.болести психология пустиняк путин путката путьо рабин рабин.е.шибан.пе работа радост разврат разни разработка расизъм резерват рейтинг реклама рекламен религия рест ризи ропче ропчета русия руски.език рутина самоковска сасипаха секира село селяндур сериали сериозно.програм сетен сеянин симулация скопяване скръм слушалки сортиране софия софтуер софтуни социализъм спектрометър спринтове сране стандарти стил стуйо стюи сушилня сцена съвет съм сън сървър сърничка таб ташаци телевизия тема територията терминология термояд технологии титли традиция тролинг тръмп туба туче тъпак тъпанари тъпня уиндоус украйна умнокрасивци фалит фантастика фашизъм фейк.акаунти физика филми форум форумни.проекти футбол хазарт хамали харабия хардуер хахаха хомофобия хостинг храна хумор цайко цайси целофан цензура цензурра циганин чалга чалгар чекии чернокраки честота чипове чнг чужбина чук шпация щайга юан яката яко ям 🔨 😂 🪓


neon

  

0 1


  BIGBUGEX  Създадено на 21.11.2024, видяно: 273 пъти. #127987
johnfound

Никога не съм обичал играта "Да напишем такъв код на C, че да получим нужният ни машинен код".

Много по-лесно е да си го напиша директно на асемблер. rofl

Но искрено се забавлявам да гледам такова шоу. Нещо като старите комедии с Лоурел и Харди.

Ма ти не знаеш ли? Вече е срамно да се пише на асемблер. Гледат с лошо око, колегите.



  johnfound  Създадено на 21.11.2024, видяно: 271 пъти. #127989
BIGBUGEX

Ма ти не знаеш ли? Вече е срамно да се пише на асемблер. Гледат с лошо око, колегите.

Хм, моите колеги, като че ли не ме гледат с лошо око. Добре, че не са програмисти.



  Rabin  Създадено на 21.11.2024, видяно: 246 пъти. #128004
johnfound

Никога не съм обичал играта "Да напишем такъв код на C, че да получим нужният ни машинен код".

Много по-лесно е да си го напиша директно на асемблер. rofl

Но искрено се забавлявам да гледам такова шоу. Нещо като старите комедии с Лоурел и Харди.

И като видиш как С пише по-оптимално от тебе...



  Baj_boeb  Създадено на 21.11.2024, видяно: 237 пъти. #128005

хубаво е все пак да имаш job security, затова колкото повече асемблер, толкова по-добре



  Rabin  Последно редактирано на 21.11.2024 от Rabin, видяно: 234 пъти. #128006
Baj_boeb

хубаво е все пак да имаш job security, затова колкото повече асемблер, толкова по-добре

Кой ви учи на тез глупости ве, банкирането ми е мацано на .нет, кажи неко асемблерска банка, че по-сигурна rofl :-P🤪 🤓 🤑 🙃 ...

Оп, сори, после разбрах ко искаше да кажеш. Дремя на едни лекции по многозадачност. Съгласен съм.



  |  Създадено на 26.11.2024, видяно: 139 пъти. #128346
BIGBUGEX

Пробвах и clang. Определено се справя по-добре от gcc.

eqsub iters <1767> 0.022 ns/b 45.278 GB/s

spcalc iters <801> 0.049 ns/b 20.559 GB/s

Edit: Но не и за моя вариант с тестване за нула.

Абе BIGBUGEX, какво ще стане ако края на вектора е в невалидна памет? Ще гръмне ли програмата или AVX2 знае как да го оправи? Защото не го виждам в кода ти.

Ето моята SVE имплементация, базирана на оптимизирана версия на strchr. Тества за нула.


       setffr                          /* initialize FFR */
        ptrue   p1.b                    /* all ones; loop invariant */
        mov     x1, xzr
        dup     z1.b, 'p'               /* replicate byte across vector */
        dup     z2.b, 's'               /* replicate byte across vector */

        .p2align 4
0:      ldff1b  z0.b, p1/z, [x0, xzr]
        rdffrs  p0.b, p1/z
        b.nlast 1f

        /* First fault did not fail: the whole vector is valid.
           Avoid depending on the contents of FFR beyond the branch.  */
        incb    x0                              /* speculate increment */
        cmpeq   p3.b, p1/z, z0.b, 0             /* search for 0 */
        b.ne    1f

        /* no end string */
        brka    p4.b, p1/z, p3.b                /* find first 0 */
        cmpeq   p2.b, p4/z, z0.b, z1.b          /* search for 'p' */
        decp    x1, p2.b                        /* count the predicates and subtract them from x1 */
        cmpeq   p3.b, p4/z, z0.b, z2.b          /* search for 's' */
        incp    x1, p3.b                        /* count the predicates and add them to x1 */
        b       0b

1:      /* end string or first fault */
        brka    p4.b, p0/z, p3.b                /* find first 0 */
        cmpeq   p2.b, p4/z, z0.b, z1.b          /* search for 'p' */
        decp    x1, p2.b                        /* count the predicates and subtract them from x1 */
        cmpeq   p3.b, p4/z, z0.b, z2.b          /* search for 's' */
        incp    x1, p3.b                        /* count the predicates and add them to x1 */
        mov     x0, x1
        ret

Скоростта на Graviton4 e 1.86 пъти по-бавна от eqsub.

Ето и версията ми за SME. Това е реално Streaming SVE, но имплементацията е различна защото SSVE няма FFR и incp/decp са много бавни (мързи ме да обяснявам, но ако някой е любопитен може да го направя).


        smstart
        dup     z1.b, 'p'                       /* replicate byte across vector */
        dup     z2.b, 's'                       /* replicate byte across vector */
        dup     z3.b, 0                         /* all 0s for sel */
        dup     z4.b, 1                         /* all 1s for sel */
        dup     z5.b, -1                        /* all -1s for sel */
        dup     z8.s, 0                         /* return value(s) */
        ptrue   p1.b                            /* all ones; loop invariant */

        .p2align 4
0:      ld1b    z0.b, p1/z, [x0]                /* read bytes in vector */

        incb    x0                              /* speculate increment */
        dup     z9.h, 0                         /* 32-bit count for the iteration */
        cmpeq   p3.b, p1/z, z0.b, 0             /* search for 0 */
        b.ne    1f

        /* no end of string */
        cmpeq   p2.b, p1/z, z0.b, z1.b          /* search for 'p' */
        sel     z10.b, p2, z5.b, z3.b           /* for each match, select -1s from z5 */
        cmpeq   p3.b, p1/z, z0.b, z2.b          /* search for 's' */
        sel     z10.b, p3, z4.b, z10.b          /* for each match, select 1s from z4 */
        sadalp  z9.h, p1/m, z10.b               /* widen to 16 bit by adding pairwise elements*/
        sadalp  z8.s, p1/m, z9.h                /* add to the total count, widening to 32 bit */
        b       0b

        /* end of string */
1:      brka    p4.b, p1/z, p3.b                /* find first 0 */
        cmpeq   p2.b, p4/z, z0.b, z1.b          /* search for 'p' */
        sel     z10.b, p2, z5.b, z3.b           /* for each match, select -1s from z5 */
        cmpeq   p3.b, p4/z, z0.b, z2.b          /* search for 's' */
        sel     z10.b, p3, z4.b, z10.b          /* for each match, select 1s from z4 */
        sadalp  z9.h, p1/m, z10.b               /* widen to 16 bit by adding pairwise elements*/
        sadalp  z8.s, p1/m, z9.h                /* add to the total count, widening to 32 bit */

        saddv   d0, p1, z8.s                    /* reduce counts to scalar register */
        fmov    x0, d0

        smstop
        ret

Скоростта е десетки пъти по-бавна от eqsub на Apple M4. Явно SME не е много подходящ за такива дребни алгоритми.



  BIGBUGEX  Последно редактирано на 26.11.2024 от BIGBUGEX, видяно: 125 пъти. #128347
|

Абе BIGBUGEX, какво ще стане ако края на вектора е в невалидна памет? Ще гръмне ли програмата или AVX2 знае как да го оправи? Защото не го виждам в кода ти.

Няма да гръмне. Подравнявам старта на 32 байта и със съответните битове за валидност инвалидирам операциите които са пред масива. От там на сетне обработвам адреси кратни на 32 байта. Ако изскочи '\0' в текущия пакет от данни се излиза от цикъла като се инвалидират бройките след него.

|

Ето моята SVE имплементация, базирана на оптимизирана версия на strchr. Тества за нула.


       setffr                          /* initialize FFR */
        ptrue   p1.b                    /* all ones; loop invariant */
        mov     x1, xzr
        dup     z1.b, 'p'               /* replicate byte across vector */
        dup     z2.b, 's'               /* replicate byte across vector */

        .p2align 4
0:      ldff1b  z0.b, p1/z, [x0, xzr]
        rdffrs  p0.b, p1/z
        b.nlast 1f

        /* First fault did not fail: the whole vector is valid.
           Avoid depending on the contents of FFR beyond the branch.  */
        incb    x0                              /* speculate increment */
        cmpeq   p3.b, p1/z, z0.b, 0             /* search for 0 */
        b.ne    1f

        /* no end string */
        brka    p4.b, p1/z, p3.b                /* find first 0 */
        cmpeq   p2.b, p4/z, z0.b, z1.b          /* search for 'p' */
        decp    x1, p2.b                        /* count the predicates and subtract them from x1 */
        cmpeq   p3.b, p4/z, z0.b, z2.b          /* search for 's' */
        incp    x1, p3.b                        /* count the predicates and add them to x1 */
        b       0b

1:      /* end string or first fault */
        brka    p4.b, p0/z, p3.b                /* find first 0 */
        cmpeq   p2.b, p4/z, z0.b, z1.b          /* search for 'p' */
        decp    x1, p2.b                        /* count the predicates and subtract them from x1 */
        cmpeq   p3.b, p4/z, z0.b, z2.b          /* search for 's' */
        incp    x1, p3.b                        /* count the predicates and add them to x1 */
        mov     x0, x1
        ret

Скоростта на Graviton4 e 1.86 пъти по-бавна от eqsub.

Много добре е това. Ще го разгледам кода въпреки че не вдявам много.

|

Ето и версията ми за SME. Това е реално Streaming SVE, но имплементацията е различна защото SSVE няма FFR и incp/decp са много бавни (мързи ме да обяснявам, но ако някой е любопитен може да го направя).


        smstart
        dup     z1.b, 'p'                       /* replicate byte across vector */
        dup     z2.b, 's'                       /* replicate byte across vector */
        dup     z3.b, 0                         /* all 0s for sel */
        dup     z4.b, 1                         /* all 1s for sel */
        dup     z5.b, -1                        /* all -1s for sel */
        dup     z8.s, 0                         /* return value(s) */
        ptrue   p1.b                            /* all ones; loop invariant */

        .p2align 4
0:      ld1b    z0.b, p1/z, [x0]                /* read bytes in vector */

        incb    x0                              /* speculate increment */
        dup     z9.h, 0                         /* 32-bit count for the iteration */
        cmpeq   p3.b, p1/z, z0.b, 0             /* search for 0 */
        b.ne    1f

        /* no end of string */
        cmpeq   p2.b, p1/z, z0.b, z1.b          /* search for 'p' */
        sel     z10.b, p2, z5.b, z3.b           /* for each match, select -1s from z5 */
        cmpeq   p3.b, p1/z, z0.b, z2.b          /* search for 's' */
        sel     z10.b, p3, z4.b, z10.b          /* for each match, select 1s from z4 */
        sadalp  z9.h, p1/m, z10.b               /* widen to 16 bit by adding pairwise elements*/
        sadalp  z8.s, p1/m, z9.h                /* add to the total count, widening to 32 bit */
        b       0b

        /* end of string */
1:      brka    p4.b, p1/z, p3.b                /* find first 0 */
        cmpeq   p2.b, p4/z, z0.b, z1.b          /* search for 'p' */
        sel     z10.b, p2, z5.b, z3.b           /* for each match, select -1s from z5 */
        cmpeq   p3.b, p4/z, z0.b, z2.b          /* search for 's' */
        sel     z10.b, p3, z4.b, z10.b          /* for each match, select 1s from z4 */
        sadalp  z9.h, p1/m, z10.b               /* widen to 16 bit by adding pairwise elements*/
        sadalp  z8.s, p1/m, z9.h                /* add to the total count, widening to 32 bit */

        saddv   d0, p1, z8.s                    /* reduce counts to scalar register */
        fmov    x0, d0

        smstop
        ret

Скоростта е десетки пъти по-бавна от eqsub на Apple M4. Явно SME не е много подходящ за такива дребни алгоритми.

Може да няма лесен начин за тестване за 0 на SME. Също така е трудно без участието на генерални регистри да се инвалидират 'p' и 's' бройките идващи непосредствено след нулевия знак.



  |  Създадено на 26.11.2024, видяно: 84 пъти. #128389
BIGBUGEX

Няма да гръмне. Подравнявам старта на 32 байта и със съответните битове за валидност инвалидирам операциите които са пред масива. От там на сетне обработвам адреси кратни на 32 байта. Ако изскочи '\0' в текущия пакет от данни се излиза от цикъла като се инвалидират бройките след него.

А, това с подравняването в началото е хитро, не се бях сетил. Ще помисля дали/как мога да го направя за SVE/SME. SME е 512 битови вектори, така че ще чете направо цяла cache line наведнъж.

Друго нещо, което трябва да пробвам е четенето наведнъж на 4 вектора (LD4x). Ще чете 256 байта за една инструкция. Не че е задължително да е по-бързо, но ще видим.


0 1


neon

  



AsmBB v3.0 (check-in: 7544654b24928b93); SQLite v3.47.0 (check-in: 03a9703e27c44437);
©2016..2024 John Found; Licensed under EUPL; Powered by Assembly language Created with Fresh IDE