
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 עם קבוע. כפל ללא נשיאה, שחשוב לקריפטוגרפיה ולסכומי ביקורת 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 יגיע, ויחליף את לולאת האחסון והסכימה הידנית שנדרשת בממשק הנוכחי.
SiTech — פיתוח אתרים בכוח ה-AI
אנחנו בונים אתרים מהירים ומודרניים ומשלבים AI בתהליכי עבודה אמיתיים. יש לכם פרויקט או שאלה? נשמח לעזור.