bling כתב:למה שגרסת הפס4 תציג יותר מזה? תמיד אמרתי שהפער יעמוד בממוצע על 900 מול 1080 ולפעמים עוד כמה טוויקים גראפיים (במקרה הזה AF וגם נראה שבצמחייה יש יתרון לפי התמונה ששמת פה שמציגה את 3 הגרסאות), ועד עכשיו זה נראה מדויק למדי למעט מקרים חריגים לכל צד, הרי רק לרנדר ב 1080p לעומת 900 זה דורש יותר מ 30% כח עיבוד, והפער הוא סביב ה %30-40 אז כמה אתה חושב שאפשר כבר לשפר מעבר לרזולוציה?
זה נשמע הגיוני אבל מה עם היתרון שבלפתח לחומרה ייעודית ול API נמוך וכו׳ שאמורים להביא את ה edge לקונסולות? אגדה אורבנית?
כשמפתחים רוצים ממש להיות אופטימליים הם עוברים לשפה ברמה הכי נמוכה שלמעשה מאפשרת להם ממש לדעת כמה Cyclים של שעון המעבד יארך החישוב שלהם. אבל יש כמה כללי אצבע:
1) הקטע קוד צריך להיות ממש לא מסובך לרוב, מאוד קשה לכתוב בצורה הזאת ובטח לבדוק את נכונות מה שכתבת. לכן מדובר על קטעי קוד מאוד קצרים, כמה שורות בודדות שעושות חישוב אחד על פי רוב בכל פונקציה.
2) אם מדובר על משהו שרץ על הGPU יש מגבלה עוד יותר גדולה, הכל סימטרי, כלומר, אתה רותם את כל כוח המחשוב לעשות את קטע הקוד שלך במקבול, כולם עושים את אותו קטע קוד ביחד, כל אחד על פיקסל אחר לדוגמא או על מספר נתון באזור אחר בזיכרון.
הצורה הראשונה מתאימה למי שעובד עם מה שמכונה חישוב ווקטורי על מעבד CPU כדוגמא טובה היכן יעשו שימוש בצורת הכתיבה המדוברת. מה המשמעות? במקום לעשות בוא נגיד לחבר שני מספרים, אתה יכל לחבר ארבעה מספרים במקביל אבל כולם יושבים באותה יחידת זיכרון אחת שמכונה רגיסטרי אחד אחרי השני ומכאן שאתה רותם יכולת מיוחדת של המעבד שלא היית יכל אלא אם היית כותב בצורה ישירה את שפת המכונה.
רק בקטעים הללו יכל להיות בידול בארכיטקטורה. כי כל אחד כותב בשפה יעודית שמתאימה לחומרה הנתונה. לדוגמא, מי שכותב בAVX שזאת שפה לשימוש בחישוב ווקטורי במעבדי Haswell של אינטל, לא יוכל להפעיל את אותו קטע קוד על מעבדי ARM לשם דוגמא.
דרך אגב, X86 מתאים לכולם, זו שפה שקיימת עוד מהמעבד 8086 של אינטל ולמעשה היא כמו השפה המשותפת העולמית במעבדים. היא קיימת גם במעבדי AMD לדוגמא ואני בטוח שגם בARM.
אבל מפתחים לא כותבים בצורה כזאת, מפתח יכתוב לרוב בשפה עילית, C++ כשמדובר בתוכנות "Real time". אם אני אקח את מקום העבודה שלי כדוגמא טובה, מתוך 300 מתכנתים, 295 כותבים בשפות עיליות ורק חמישה בשפות מכונה. זה בערך סדר הגודל בעולם האמיתי, זה תחום שלרוב חברות תוכנה לא נכנסות איליו ומקבלות אותו כקופסה שחורה נפלאה.
דרך אגב, לרוב האופטימיזציה שמפתח פוגש היא בגדר הקומפיילר, תוכנה לשונית אטומטית שמתרגמת את השפה העילית בו כתב המתכנת, לדוגמא C לשפת מכונה שמתאימה למעבד עליה הוא מתכוון להריץ את התוכנה. כך, שלרוב אתה תסתמך על העבודה של מי שכתב את הקומפיילר.
לכן לדוגמא כשIBM פיתחו את המעבד של סוני, מפתחים מאוד התבססו על גרסאות חדשות יותר לקומפיילר לאותו מעבד, כי שם בעצם נעוצה האופטימיזציה שלהם. לא בקטע קוד בשפת מכונה שהם כתבו. כי זה פשוט לא מבוצע לרוב.
אז מה קורה היום?
יש לך מעבד שמבוסס ברובו על שפת X86 ההיסטורית, כלומר, המפתחים משתמשים בקומפיילרים סטנדרטים לקטעי הקוד שרצים על הCPU. הם לא עושים אופטימיזציות כי הקומפיילר יעשה להם אותם לבד ולמעשה כותבים תוכנה בלי לדעת באמת כמה היא יעילה. מעבר למדידות שלהם ברמת FPSים או כל מדד אחר בפועל, הם לא חושבים ברמת סבבים של שעון המעבד.
כמו כן יש לך קטעי קוד שרצים על הGPU, פה הם כותבים חלק בשפה יעודית עילית אחרת שנקראת CUDA (אני מניח), שוב יש קומפיילר של Nvidia ולמפתח אין שום שליטה איך יוצא הקוד שלו באמת מבחינת אופטימיזציה. האם יש כתיבה ברמה נמוכה יותר לGPU? בטוח, אבל שוב מדובר בקטעי קוד פשוטים, קצרים שלא משקפים לרוב את החלק הגדול של המוצר. אלא דברים שמזוהים כנראה כצוואר בקבוק אמיתי מבחינת ביצועים שכנראה שווה למפתחת רצינית להשקיע בהם.
השליטה של המפתחים בטיב הביצועים של המוצר שלהם היא מאוד מוגבלת, המפתחות הם לרוב בידיים של Nvidia במקרה שלנו ואינטל, מייקרוסופט או GNU, או כל חברה אחרת שייצרה את הקומפיילר לCPU.
הערה, הAPI שאתה מתייחס אליהם זו למעשה חבילה של פונקציות שNvidia נותנת לדוגמא למפתחות שאומרת להם בהינתן X שנתתם קיבלתם Y החוצה. מה המשמעות? פה שוב אין שום שליטה למפתחת מה היא האופטימיזציה, פה Nvidia אפילו הולכת רחוק יותר ומסתירה מימוש בשפה עילית מהמפתחות כך שהן אפילו לא יודעות איך החישוב בוצע. למה? כי ככה Nvidia מבטיחה לך שהם יודעים לכתוב את הפעולה המדוברת פי כמה יותר טוב ממך מבחינת ביצועים ונכונות התוצאה (מה שגם נכון), אז זה נפלא.