العودة
Go 1.27 يضيف واجهة SIMD تجريبية مستقلة عن المنصات
SiTech AI Team3 წთ. საკითხავი

Go 1.27 يضيف واجهة SIMD تجريبية مستقلة عن المنصات

قدّم فريق Go حزمة simd التجريبية التي تخفي الاختلافات بين معماريات المعالجات، فأصبحت الشيفرة المتجهية المكتوبة مرة واحدة تعمل في كل مكان. وعلى المنصات التي تفتقر إلى دعم SIMD تُحاكى العمليات بالكامل.

أضافت Go 1.27 واجهة SIMD تجريبية تتصرف بالطريقة نفسها على معماريات المعالجات المختلفة. وكتب ديفيد تشيس وجونيانغ شاو من فريق Go ذلك في تدوينة نشرت في 24 سبتمبر 2026. وحتى الآن كان على المطورين كتابة شيفرة التجميع أو استخدام واجهات تعتمد على المعمارية أُضيفت في Go 1.26 وGo 1.27.

تتيح SIMD لأمر واحد أن يعمل على متجه كامل من القيم، مثل جمع ثمانية أزواج من أعداد float64 دفعة واحدة. وهي تسرّع التشفير ومعالجة البيانات وأعباء AI، ويستخدمها جامع المهملات Green Tea في Go بالفعل لمسح الذاكرة بحثاً عن الكائنات الحية.

طبقة محمولة فوق archsimd

قدّمت Go 1.26 واجهة SIMD لمعمارية amd64، وأضافت Go 1.27 واجهتي arm64 (NEON) وwasm. وتعيش هذه الواجهات في حزمة archsimd المعتمدة على المعمارية، لأن المنصات تختلف لا في العمليات التي توفرها فحسب، بل في طريقة تمثيل المتجهات: بعضها يوفر متجهات ثابتة الحجم بين 128 و512 بت، وفي غيرها لا يُعرف الحجم إلا عند بدء البرنامج.

حزمة simd الجديدة، المستوحاة جزئياً من Highway الخاصة بـ C++، تُخرج المتجهات ثابتة الحجم من نظام الأنواع ولا تدعم إلا العمليات الموجودة على كل المنصات، وتسدّ الفجوات بمحاكاة مبنية من أوامر SIMD أخرى. أنواع المتجهات بدائية بحرف كبير وبصيغة الجمع، مثل simd.Uint8s أو simd.Float32s، وتُحمَّل من الشرائح وتُخزَّن فيها. وتعيد المقارنات أقنعة مرتبطة بعرض العنصر، فمقارنة Int8s تنتج Mask8s. ويحوّل الأسلوب ToArch() المتجه إلى نوع خاص بالمنصة، وتعيده دوال simd.<SimdType>FromArch، ويُفعَّل كل ذلك عبر GOEXPERIMENT=simd.

لماذا تختلف المنصات

تمتلك wasm وPowerPC وs390x حجماً واحداً ثابتاً للمتجه (128 بت)، وتقدم amd64 ثلاثة أحجام (128 و256 و512)، وloong64 حجمين (128 و256). أما طول متجهات RISC-V فغير معروف وقت البناء، وتقرن arm64 تقنية NEON الثابتة بـ128 بت مع SVE متغيّر العرض، ويعمل القنع بثلاث طرق: أقنعة بتات متجهية، أو سجلات أقنعة مخصصة، أو بت قناع واحد لكل بايت في المتجه.

المحاكاة والتوزيع

تُسدّ فجوات كثيرة بأمرين أو ثلاثة: تُحاكى الإزاحات العددية بإزاحات متجهية، وتتحول المقارنات غير الموقّعة الناقصة إلى مقارنة موقّعة مع عمليتي XOR بثابت. وتُحاكى عملية carryless multiply المهمة للتشفير ومجاميع CRC بزمن ثابت، وعلى العتاد الخالي من دعم SIMD تُحاكى كل العمليات، لذا تعمل الشيفرة رغم ذلك.

تتيح إعدادات GODEBUG اختبار ملفات عتاد محددة: simd=0 يفرض المحاكاة، وsimd=128 و256 و512 تختار عرض المتجه وتسبب ذعراً عند غياب الميزات، أما الصيغ +128 و+256 و+512 فتتحمل الميزات الناقصة، كما في Raspberry Pi (NEON بلا PMULL) أو محاكاة amd64 على Apple Silicon (AVX2 بلا VPCLMULQDQ). وتخصّص إعادة كتابة AST في واجهة المترجم الدوال التي تذكر أنواع simd، وتلفّ غيرها بأغلفة تتحقق من مستوى SIMD المكتشف عند التشغيل، فلا توجد كلفة توزيع مع كل عملية.

ما القادم

يُخطَّط في Go 1.28 لإضافة عمليات OnesCount والأقنعة والاختزال وإعادة ترتيب المتجهات، ودعم SVE لحزمة archsimd ونأمل لحزمة simd أيضاً، إضافة إلى مجموعة صغيرة من متغيرات الميزات تمنع الهبوط إلى محاكاة كاملة على الأجهزة التي تنقصها تعليمة أو اثنتان فقط. وسيصل أيضاً ReduceSum ليحل محل حلقة التخزين والجمع اليدوية التي تتطلبها الواجهة الحالية.

SSiTech

SiTech — تطوير ويب مدعوم بالذكاء الاصطناعي

نبني مواقع سريعة وعصرية وندمج الذكاء الاصطناعي في سير عمل الشركات. لديك مشروع أو سؤال؟ يسعدنا مساعدتك.