תכונות ה- SIMD אינן כה מפחידות, אך האם עלינו להשתמש בהן?

האם תכנות ברמה נמוכה הוא חטא או סגולה? זה תלוי.

בעת תכנות לשימוש בעיבוד וקטורי במעבד מודרני, באופן אידיאלי הייתי כותב קוד בשפה האהובה עלי והוא יפעל מהר ככל האפשר "אוטומטית-קסומה".

אלא אם כן רק התחלת לתכנת בשבוע שעבר, אני חושד שאתה יודע שכך העולם לא עובד. ביצועים מובילים מגיעים רק עם מאמץ. מכאן השאלה שלי: כמה נמוך עלינו לרדת?

הוגדרו פעולות וקטוריות

פעולה "וקטורית" היא פעולה מתמטית שעושה יותר מפעולה אחת. תוספת וקטורית עשויה להוסיף שמונה זוגות מספרים במקום להוסיף רגיל, שמוסיף רק זוג מספרים אחד. שקול לבקש מהמחשב להוסיף שני מספרים יחד. אנו יכולים לעשות זאת בהוראת הוספה רגילה. שקול לבקש מהמחשב להוסיף שמונה זוגות מספרים זה לזה (חישוב C1 = A1 + B1, C2 = A2 + B2, ... C8 = A8 + B8). אנו יכולים לעשות זאת באמצעות הוראת הוספת וקטור .

הוראות וקטוריות כוללות חיבור, חיסור, כפל ופעולות אחרות.

 SIMD: מקבילות לווקטורים

למדעני המחשב יש שם מהודר להוראות וקטוריות: SIMD, או "הוראה יחידה מרובה נתונים". אם אנו חושבים על הוראת הוספה רגילה כ- SISD (Single Instruction Single Data) כאשר יחיד פירושו זוג כניסות נתונים בודדות, אז הוספת וקטור היא SIMD שבו מספר יכול להיות שמונה זוגות של קלטי נתונים.

אני אוהב לקרוא ל- SIMD "מקביליות החומרה האחרת", מכיוון ש"הקבלה "במחשבים נחשבת לעתים קרובות כל כך מכיוון שיש לה מספר ליבות. ספירת הליבות גדלה בהתמדה. ספירת ליבות של ארבע נפוצה, 20 ומעלה נפוצים במעבדי שרתים, ומספר הליבות המוביל של אינטל כיום הוא 72 ליבות במעבד Intel® Xeon Phi ™ יחיד.

גם גדלי ההוראות לווקטור עלו. הוראות וקטוריות מוקדמות, כגון SSE, ביצעו עד ארבע פעולות בו זמנית. רוחב הווקטור העליון של אינטל כיום, ב- AVX-512, מבצע עד 16 פעולות בו זמנית.

 כמה נמוך עלינו לרדת?

עם כל כך הרבה ביצועים שעל כף המאזניים, כמה עבודה עלינו לעשות כדי לנצל את הביצועים האלה?

 התשובה היא רבה, והנה הסיבה: ארבע ליבות יכולות להאיץ לנו 4X לכל היותר. AVX (חצי מהגודל של AVX-512, אך הרבה יותר נפוץ) יכול להביא לנו עד 8X מאיץ לכל היותר. בשילוב, הם יכולים להגיע עד 32X. לעשות את שניהם הגיוני מאוד.

הנה הרשימה הפשוטה שלי כיצד לנסות לנצל הוראות וקטוריות (לפי הסדר שעלינו לנסות ליישם אותן):

 1.     ראשית, קראו לספרייה שעושה את העבודה (האולטימטיבי בווקטורציה מרומזת). דוגמה לספריה כזו היא ספריית Intel® Kernel Kernel (Intel® MKL). כל העבודה לשימוש בהוראות וקטוריות נעשתה על ידי מישהו אחר. המגבלות ברורות: עלינו למצוא ספריה שעושה את מה שאנחנו צריכים.

2.     שנית, השתמש בווקטורציה מרומזת. הישאר מופשט וכתב את זה בעצמך בעזרת תבניות או מהדרים כדי לעזור. למהדרים רבים יש מתגי וקטורציה ואפשרויות. מהדרים עשויים להיות הדרך הניידת והיציבה ביותר. היו הרבה תבניות לווקטורציה, אך אף אחת מהן לא ראתה מספיק שימוש לאורך זמן כדי להיות מנצחת ברורה (ערך לאחרונה הוא Intel® SIMD Data Layout Templates [Intel® SDLT]).

3.     שלישית, השתמש בווקטורציה מפורשת. זה הפך פופולרי מאוד בשנים האחרונות, ומנסה לפתור את הבעיה של הישארות מופשטת אך מכריח את המהדר להשתמש בהוראות וקטוריות כאשר אחרת לא היה משתמש בהן. התמיכה ב- SIMD ב- OpenMP היא הדוגמה המרכזית כאן, בה בקשות הווקטורציה עבור המהדר ניתנות במפורש מאוד. הרחבות לא סטנדרטיות קיימות במהדרים רבים, לרוב בצורה של אפשרויות או "פרגמות". אם אתה לוקח מסלול זה, OpenMP היא הדרך ללכת אם אתה נמצא ב- C, C ++ או Fortran.

4.     לבסוף, תתעצמו ותלכלכו. השתמש בפנימיות SIMD. זה כמו שפת הרכבה, אבל כתוב בתוך תוכנית C / C ++ שלך. הפנימיות של SIMD למעשה נראות כמו שיחת פונקציה, אך בדרך כלל מייצרות הוראה אחת (הוראות הפעלה וקטוריות, המכונה גם הוראת SIMD).

הפנימיות של SIMD אינן מרושעות; עם זאת, הם מוצא אחרון. שלוש הבחירות הראשונות תמיד ניתנות לשמירה על העתיד כשהן עובדות. עם זאת, כאשר שלושת הראשונים אינם מצליחים לענות על צרכינו, עלינו בהחלט לנסות להשתמש בפנימיות SIMD.

 אם אתה רוצה להתחיל להשתמש בפנימיות SIMD, תהיה לך רגל רצינית אם אתה רגיל לתכנות שפות הרכבה. בעיקר זה בגלל שיהיה לך קל יותר לקרוא את התיעוד המסביר את הפעולות, כולל "המדריך הפנימי" המקוון המצוין של אינטל. אם אתה לגמרי חדש בזה, נתקלתי בבלוג עדכני ("SSE: mind the gap!") שיש לו יד עדינה בהכנסת פנימיות. אני גם אוהב את "ריסוק מספרים עם AVX ו- AVX2".

 אם ספרייה או מהדר יכולים לעשות את מה שאתה צריך, הפנימיות של SIMD אינן הבחירה הטובה ביותר. עם זאת, יש להם את מקומם והם לא קשים לשימוש ברגע שמתרגלים אליהם. נסה אותם. יתרונות הביצועים יכולים להיות מדהימים. ראיתי את הפנימיות של SIMD המשמשות מתכנתים חכמים לקוד שאף מהדר לא עשוי לייצר.

גם אם ננסה את הפנימיות של SIMD, ובסופו של דבר נניח לספריה או מהדר לבצע את העבודה, מה שנלמד יכול להיות בעל ערך רב בהבנת השימוש הטוב ביותר בספרייה או מהדר לצורך וקטורציה. וזו אולי הסיבה הטובה ביותר לנסות את הפנימיות של SIMD בפעם הבאה שאנחנו צריכים משהו כדי להשתמש בהוראות וקטוריות.

לחץ כאן להורדת גרסת ניסיון בחינם למשך 30 יום של אינטל Parallel Studio XE