מה זה CUDA? תכנות מקביל עבור GPUs

CUDA היא פלטפורמת מחשוב מקבילה ומודל תכנות שפותח על ידי Nvidia למחשוב כללי על גבי GPUs (יחידות עיבוד גרפי) משלה. CUDA מאפשרת למפתחים להאיץ יישומים עתירי חישוב על ידי רתימת כוחם של GPUs לחלק המקביל של החישוב.

אמנם היו ממשקי API מוצעים אחרים עבור GPUs, כגון OpenCL, ויש GPUs תחרותיים של חברות אחרות, כגון AMD, אך השילוב של CUDA ו- Nvidia GPU שולט בכמה תחומי יישום, כולל למידה עמוקה, ומהווה בסיס לחלק מ- המחשבים המהירים בעולם.

ניתן לטעון שכרטיסי מסך ישנים כמו המחשב האישי - כלומר אם אתה מחשיב את מתאם התצוגה המונוכרום של IBM לשנת 1981 ככרטיס גרפי. עד שנת 1988 תוכל לקבל כרטיס VGA 2D דו-כיווני של 16 סיביות מ- ATI (החברה שנרכשה בסופו של דבר על ידי AMD). עד 1996 תוכל לקנות מאיץ גרפי תלת-ממדי מ- 3dfx Interactive כדי שתוכל להריץ את רעידת היורה בגוף ראשון במהירות מלאה.

גם בשנת 1996, Nvidia החלה לנסות להתחרות בשוק מאיצים תלת-ממד עם מוצרים חלשים, אך למדה תוך כדי, ובשנת 1999 הציגה את GeForce 256 המצליח, כרטיס המסך הראשון שנקרא GPU. באותה תקופה, הסיבה העיקרית להחזקת GPU הייתה למשחקים. רק מאוחר יותר אנשים השתמשו ב- GPUs למתמטיקה, מדע והנדסה.

מקור CUDA

בשנת 2003, צוות חוקרים בראשות איאן באק חשף את ברוק, מודל התכנות הראשון שאומץ להרחיב את C עם מבנים מקבילים לנתונים. מאוחר יותר באק הצטרף ל- Nvidia והוביל את השקת CUDA בשנת 2006, הפיתרון המסחרי הראשון למחשוב למטרות כלליות ב- GPUs.

OpenCL לעומת CUDA

מתחרה CUDA OpenCL הושק על ידי אפל וקבוצת חרונוס בשנת 2009, בניסיון לספק תקן למחשוב הטרוגני שלא היה מוגבל למעבדי אינטל / AMD עם מעבדי Nvidia. אומנם OpenCL נשמע אטרקטיבי בגלל הכלליות שלו, אך הוא לא ביצע ביצועים טובים כמו CUDA ב- Nvidia GPUs, ומסגרות למידה עמוקות רבות אינן תומכות בו או תומכות בו רק כמחשבה לאחר שפורסמה תמיכת CUDA.

שיפור ביצועי CUDA

CUDA שיפרה והרחיבה את היקפה עם השנים, פחות או יותר בנעילה עם מחשבי Nvidia משופרים. החל מ- CUDA גרסה 9.2, תוך שימוש במספר GPUs של שרת P100, תוכלו לממש עד 50x שיפורי ביצועים בהשוואה למעבדים. ה- V100 (לא מוצג באיור זה) מהיר פי 3 עבור עומסים מסוימים. הדור הקודם של GPUs של שרתים, K80, הציע שיפורי ביצועים פי 5 עד 12 בהשוואה למעבדים.

Nvidia

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

Nvidia

תחומי יישום CUDA

Nvidia

מחשבי GPU של CUDA ו- Nvidia אומצו בתחומים רבים הזקוקים לביצועי מחשוב בעלי נקודה צפה גבוהה, כפי שתמצו בתמונה בתמונה לעיל. רשימה מקיפה יותר כוללת:

  1. מימון חישובי
  2. אקלים, מזג אוויר ודוגמנות לים
  3. מדע נתונים ואנליטיקה
  4. למידה עמוקה ולמידת מכונה
  5. הגנה ומודיעין
  6. ייצור / AEC (אדריכלות, הנדסה ובנייה): CAD ו- CAE (כולל דינמיקת נוזלים חישובית, מכניקת מבנים חישובית, תכנון והדמיה, ואוטומציה לתכנון אלקטרוני)
  7. מדיה ובידור (כולל אנימציה, דוגמנות ועיבוד; תיקון צבעים וניהול גרגרים; קומפוזיציה; גימור ואפקטים; עריכה; קידוד והפצה דיגיטלית; גרפיקה בשידור; כלי סט, סקירה וסטריאו; וגרפיקה של מזג אוויר)
  8. הדמיה רפואית
  9. נפט וגז
  10. מחקר: השכלה גבוהה ומחשבי על (כולל כימיה חישובית וביולוגיה, אנליזה מספרית, פיזיקה והדמיה מדעית)
  11. בטיחות וביטחון
  12. כלים וניהול

CUDA בלימוד עמוק

למידה עמוקה יש צורך ממושך במהירות המחשוב. לדוגמא, כדי להכשיר את המודלים עבור Google Translate בשנת 2016, צוותי Google Brain ו- Google Translate ביצעו מאות ריצות TensorFlow של שבוע באמצעות GPUs; הם רכשו 2,000 GPUs בכיתה שרת מ- Nvidia לצורך העניין. ללא מחשבי GPU, הריצות אימונים אלה היו לוקחות חודשים ולא שבוע להתכנס. לצורך פריסת הייצור של אותם דגמי התרגום של TensorFlow, Google השתמשה בשבב עיבוד מותאם אישית חדש, ה- TPU (יחידת עיבוד טנזור).

בנוסף ל- TensorFlow, מסגרות DL רבות אחרות מסתמכות על CUDA עבור תמיכת ה- GPU שלהן, כולל Caffe2, CNTK, Databricks, H2O.ai, Keras, MXNet, PyTorch, Theano ו- Torch. ברוב המקרים הם משתמשים בספריית cuDNN לצורך חישובי רשת עצביים עמוקים. הספרייה חשובה כל כך להכשרת מסגרות הלמידה העמוקה, עד כי כל המסגרות המשתמשות בגרסה נתונה של cuDNN מחייבות למעשה את אותם מספרי ביצועים למקרי שימוש מקבילים. כאשר CUDA ו- cuDNN משתפרים מגרסה לגרסה, כל מסגרות הלמידה העמוקה המתעדכנות לגרסה החדשה רואות את רווחי הביצועים. איפה שהביצועים נוטים להיות שונים ממסגרת למסגרת, זה כמה הם מתרחבים למספר גרפי GPU ומספר צמתים.

תכנות CUDA

Nvidia

ערכת כלים CUDA

ערכת הכלים CUDA כוללת ספריות, כלי איתור באגים ואופטימיזציה, מהדר, תיעוד וספריית זמן ריצה לפריסת היישומים שלך. יש בו רכיבים התומכים בלמידה עמוקה, אלגברה לינארית, עיבוד אותות ואלגוריתמים מקבילים. באופן כללי, ספריות CUDA תומכות בכל משפחות ה- GPU של Nvidia, אך הן מיטיבות הביצועים בדור האחרון, כגון V100, שיכולה להיות מהירה פי 3 מה- P100 לעומסי אימון למידה עמוקה. שימוש בספריה אחת או יותר היא הדרך הקלה ביותר לנצל את מחשבי ה- GPU, כל עוד האלגוריתמים הדרושים לך יושמו בספריה המתאימה.

Nvidia

ספריות למידה עמוקה של CUDA

בתחום הלמידה העמוקה, ישנן שלוש ספריות עיקריות המואצות ב- GPU: cuDNN, שהזכרתי קודם כמרכיב ה- GPU למסגרות הלמידה העמוקה ביותר בקוד פתוח; TensorRT, המהווה אופטימיזציה של הסקת למידה עמוקה למידה עמוקה של Nvidia וזמן ריצה; ו- DeepStream, ספריית הסקת וידאו. TensorRT עוזר לך לבצע אופטימיזציה של דגמי רשת עצביים, לכייל לדיוק נמוך יותר עם דיוק גבוה ולפרוס את המודלים המאומנים לעננים, מרכזי נתונים, מערכות משובצות או פלטפורמות של מוצרי רכב.

Nvidia

CUDA אלגברה וספריות מתמטיקה

אלגברה לינארית עומדת בבסיס חישובי טנסור ולכן למידה עמוקה. BLAS (תוכניות משנה בסיסיות של אלגברה לינארית), אוסף של אלגוריתמי מטריצה ​​שהוטמעו בפורטן בשנת 1989, שימש מאז על ידי מדענים ומהנדסים. cuBLAS היא גרסה מואצת של GPU של BLAS, והדרך עם הביצועים הגבוהים ביותר לעשות חשבון מטריצה ​​עם GPUs. cuBLAS מניח שהמטריצות צפופות; cuSPARSE מטפל במטריצות דלילות.

Nvidia

ספריות עיבוד אותות CUDA

טרנספורמציית פורייה המהירה (FFT) היא אחד האלגוריתמים הבסיסיים המשמשים לעיבוד אותות; הוא הופך אות (כמו צורת גל שמע) לספקטרום תדרים. cuFFT הוא FFT מואץ ב- GPU.

רכיבי Codec, המשתמשים בתקנים כגון H.264, מקודדים / דוחסים ומפענחים / מפרקים וידאו לצורך העברה ותצוגה. Nvidia Video Codec SDK מאיץ את התהליך הזה עם GPUs.

Nvidia

ספריות אלגוריתמים מקבילות של CUDA

לשלוש הספריות לאלגוריתמים מקבילים מטרות שונות. NCCL (Nvidia Collective Communications Library) מיועדת לקנה מידה של אפליקציות במספר GPUs וצמתים; nvGRAPH מיועד לניתוח גרפים מקבילים; ו- Thrust היא ספריית תבניות C ++ עבור CUDA המבוססת על ספריית התבניות הסטנדרטית C ++. דחף מספק אוסף עשיר של נתונים פרימיטיביים מקבילים כמו סריקה, מיון וצמצום.

Nvidia

CUDA לעומת ביצועי מעבד

במקרים מסוימים תוכלו להשתמש בפונקציות CUDA הנפתחות במקום בפונקציות המעבד המקבילות. לדוגמה, ניתן להחליף את שגרות הכפל של מטריצות ה- GEMM מ- BLAS בגרסאות GPU פשוט על ידי קישור לספריית NVBLAS:

Nvidia

יסודות תכנות CUDA

אם אינך מוצא שגרות ספריית CUDA כדי להאיץ את התוכניות שלך, תצטרך לנסות את כוחך בתכנות CUDA ברמה נמוכה. זה הרבה יותר קל עכשיו ממה שהיה כשניסיתי את זה לראשונה בסוף שנות האלפיים. בין יתר הסיבות, יש תחביר קל יותר ויש כלים לפיתוח טוב יותר. הוויכוח היחיד שלי הוא שב- MacOS מהדר ה- CUDA האחרון ומהדר ה- C ++ האחרון (מ- Xcode) הם לעתים רחוקות מסונכרנות. יש להוריד כלי שורת פקודה ישנים יותר מאפל ולעבור אליהם באמצעות xcode-selectכדי לקבל את קוד CUDA להידור ולקישור.

לדוגמה, שקול את שגרת C / C ++ הפשוטה הזו כדי להוסיף שני מערכים:

ריק להוסיף (int n, float * x, float * y)

{  

       עבור (int i = 0; i <n; i ++)      

             y [i] = x [i] + y [i];

}

אתה יכול להפוך אותו לליבה שתפעל ב- GPU על ידי הוספת __global__מילת המפתח להצהרה, ולהתקשר לליבה באמצעות תחביר סוגר משולש:

הוסף << >> (N, x, y);

אתה גם צריך לשנות שלך malloc/ newו free/ deleteשיחות cudaMallocManagedו cudaFreeכך אתה הקצאת שטח על ה- GPU. לבסוף, עליך להמתין לסיום חישוב GPU לפני שתשתמש בתוצאות במעבד, שאותן תוכל להשיג cudaDeviceSynchronize.

סוגר המשולש שלמעלה משתמש בבלוק הברגה אחד ובחוט אחד. Nvidia GPUs הנוכחי יכול להתמודד עם חסימות וחוטים רבים. לדוגמא, ל- GPU של טסלה P100 המבוסס על ארכיטקטורת ה- Pascal GPU יש 56 מעבדי הזרמה (SM), שכל אחד מהם מסוגל לתמוך בעד 2048 שרשורים פעילים.

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

__גלוֹבָּלִי__

ריק להוסיף (int n, float * x, float * y)

{

   אינדקס int = blockIdx.x * blockDim.x + threadIdx.x;

   צעד צעד = blockDim.x * gridDim.x;

   עבור (int i = אינדקס; i <n; i + = צעד)

     y [i] = x [i] + y [i];

}

אם תסתכל על הדוגמאות בערכת הכלים CUDA, תראה שיש יותר מה לקחת בחשבון מאשר את היסודות שכיסיתי לעיל. לדוגמה, כמה שיחות של פונקציות CUDA צריכות להיות עטופות checkCudaErrors()בשיחות. כמו כן, במקרים רבים הקוד המהיר ביותר ישתמש בספריות כגון cuBLASיחד עם הקצאות של זיכרון מארח ומכשיר והעתקת מטריצות הלוך ושוב.

לסיכום, תוכלו להאיץ את האפליקציות שלכם באמצעות GPUs ברמות רבות. אתה יכול לכתוב קוד CUDA; אתה יכול להתקשר לספריות CUDA; ותוכלו להשתמש ביישומים שכבר תומכים ב- CUDA.