Վերադառնալ
Go 1.27-ում հայտնվել է հարթակից անկախ SIMD ինտերֆեյս
SiTech AI Team2 წთ. საკითხავი

Go 1.27-ում հայտնվել է հարթակից անկախ SIMD ինտերֆեյս

Go-ի թիմը ներկայացրել է փորձնական simd փաթեթը, որը թաքցնում է պրոցեսորների ճարտարապետությունների տարբերությունները։ Մեկ անգամ գրված վեկտորային կոդը աշխատում է ամենուր, իսկ SIMD չունեցող հարթակներում գործողությունները էմուլացվում են։

Go 1.27-ում ներկայացվել է փորձնական SIMD ինտերֆեյս, որը տարբեր պրոցեսորային ճարտարապետություններում նույն կերպ է վարվում։ Այս մասին Go-ի թիմից Դեյվիդ Չեյսը և Ջունյան Շաոն գրել են 2026 թվականի սեպտեմբերի 24-ին հրապարակված բլոգի գրառման մեջ։ Մինչ այժմ մշակողները գրում էին ասեմբլերի կոդ կամ օգտագործում էին ճարտարապետությունից կախված API-ներ։

SIMD-ն թույլ է տալիս մեկ հրահանգին աշխատել արժեքների ամբողջ վեկտորի վրա, օրինակ՝ միանգամից գումարել float64 թվերի ութ զույգ։ Այն արագացնում է գաղտնագրությունը և տվյալների մշակումը, իսկ Go-ի Green Tea աղբահավաքն այն արդեն օգտագործում է կենդանի օբյեկտների որոնման համար։

Շարժական շերտ archsimd-ի վրա

Go 1.26-ում SIMD API ավելացավ amd64-ի համար, իսկ Go 1.27-ում՝ arm64-ի (NEON) և wasm-ի համար։ Այդ API-ները ապրում են ճարտարապետությունից կախված archsimd փաթեթում. հարթակները տարբերվում են և՛ գործողություններով, և՛ վեկտորների ներկայացմամբ, ընդ որում չափը երբեմն ֆիքսված է (128-512 բիթ), երբեմն հայտնի է դառնում միայն մեկնարկին։

Նոր simd փաթեթը, որը մասամբ հիմնված է C++-ի Highway-ի վրա, ֆիքսված չափի վեկտորները հանում է տիպերի համակարգից և թողնում միայն այն գործողությունները, որոնք առկա են բոլոր հարթակներում, իսկ բացթողումները լրացնում է էմուլյացիայով։ Վեկտորային տիպերը մեծատառով սկսվող, հոգնակի պարզունակ տիպեր են, օրինակ simd.Uint8s, իսկ համեմատությունները վերադարձնում են տարրի լայնությանը կապված դիմակներ։ ToArch() մեթոդը վեկտորը վերածում է հարթակին հատուկ տիպի, իսկ ամեն ինչ միացնում է GOEXPERIMENT=simd պարամետրը։

Ինչո՞ւ են հարթակները տարբերվում

wasm-ը, PowerPC-ն և s390x-ը ունեն վեկտորի մեկ ֆիքսված չափ (128 բիթ), amd64-ը՝ երեք, իսկ loong64-ը՝ երկու։ RISC-V-ում երկարությունը հայտնի չէ հավաքման պահին, իսկ arm64-ը ֆիքսված NEON-ը զուգակցում է փոփոխական լայնության SVE-ի հետ։

Էմուլյացիա և դիսպետչերացիա

Շատ բացթողումներ փակվում են երկու-երեք հրահանգով. սկալյար տեղաշարժերը՝ վեկտորային տեղաշարժերով, բացակայող աննշան համեմատությունները՝ նշանավոր համեմատությամբ և հաստատունի հետ երկու XOR-ով։ Գաղտնագրման և CRC-ի համար կարևոր carryless multiply-ը էմուլացվում է հաստատուն ժամանակում, իսկ SIMD չունեցող սարքավորումներում էմուլացվում են բոլոր գործողությունները, այդ պատճառով կոդը միևնույն է աշխատում է։

GODEBUG կարգավորումները թույլ են տալիս փորձարկել տարբեր սարքավորումների պրոֆիլներով. simd=0-ը պարտադրում է էմուլյացիա, simd=128, 256 և 512-ը ընտրում են վեկտորի լայնությունը և խուճապ են առաջացնում հատկանիշների բացակայության դեպքում, իսկ + նշանով ձևերը հանդուրժում են բացակայող հնարավորությունները, օրինակ Raspberry Pi-ում (NEON՝ առանց PMULL)։ Կոմպիլյատորի առջևի հատվածում AST-ի վերագրանցումը մասնագիտացնում է simd տիպեր հիշատակող ֆունկցիաները, իսկ մյուսները փաթաթում է մեկնարկին հայտնաբերված SIMD մակարդակից կախված շերտերի մեջ՝ առանց յուրաքանչյուր գործողության դիսպետչերացիայի ծախսի։

Ինչ է սպասվում

Go 1.28-ում նախատեսվում է ավելացնել OnesCount, դիմակային, նվազեցման և վեկտորների վերադասավորման գործողություններ, SVE-ի աջակցություն archsimd-ում և, հուսով ենք, simd-ում, ինչպես նաև մի քանի feature variant, որոնք կխուսափեն ամբողջական էմուլյացիայից այն սարքերում, որտեղ պակասում է մեկ-երկու հրահանգ։ Կավելանա նաև ReduceSum-ը, որը կփոխարինի ներկայիս API-ի ձեռքի գումարման ցիկլը։

SSiTech

SiTech — AI-ով հզորացված վեբ մշակում

Ստեղծում ենք արագ ու ժամանակակից կայքեր և AI-ը ներդնում իրական բիզնես գործընթացներում։ Ունե՞ք նախագիծ կամ հարց։ Ուրախ կլինենք օգնել։