לעומסי עבודה שבהם חישוב GPU הוא אידיאלי, העברת סקריפטים של RenderScript לחישוב ב-Vulkan מעניקה לאפליקציה שליטה ישירה יותר בחומרת ה-GPU, וכך עשויה לשפר את הביצועים בהשוואה לממשקי API אחרים.
בהמשך מופיעה סקירה כללית שתעזור לכם להשתמש בשגיאות מחשוב של Vulkan כדי להחליף סקריפטים של RenderScript.
אתחול של Vulkan
במקום ליצור אובייקט הקשר של RenderScript ב-Kotlin או ב-Java, מבצעים את השלבים הבאים כדי ליצור הקשר של Vulkan באמצעות NDK.
יוצרים מכונה של Vulkan.
בוחרים מכשיר פיזי של Vulkan שתומך בתור לעיבוד.
יצירת מכשיר לוגי של Vulkan וקבלת תור המחשוב.
לחלופין, אפשר להגדיר את שכבות האימות של Vulkan ב-Android כדי לזרז את פיתוח האפליקציות ב-Vulkan.
באפליקציית הדוגמה מוצג איך לאתחל את ההקשר של Vulkan ב-VulkanContext.h
.
מידע נוסף זמין בקטעים Initialization ו-Devices and Queues במפרט של Vulkan.
הקצאות Vulkan
אפשר להעביר הקצאה של RenderScript לקובץ אימג' לאחסון ב-Vulkan או למאגר אחסון ב-Vulkan. כדי לשפר את הביצועים של תמונות לקריאה בלבד, מומלץ להשתמש בתמונה לדוגמה עם פעולות אחזור, כמבצע דגימה של תמונה משולבת או עם קישורים נפרדים של מבצע דגימה ותמונה לדוגמה.
המשאבים של Vulkan מוקצים ב-Vulkan. כדי להימנע מעומסי זמן של העתקת זיכרון במהלך אינטראקציה עם רכיבים אחרים של Android, מומלץ להשתמש בתוסף VK_ANDROID_external_memory_android_hardware_buffer
כדי לייבא AHardwareBuffer
של Android ל-Vulkan. התוסף הזה זמין בכל מכשירי Android שתומכים ב-Vulkan 1.1. מידע נוסף זמין במאמר FEATURE_VULKAN_HARDWARE_VERSION
.
באפליקציית הדוגמה מוסבר איך ליצור משאבי Vulkan ב-VulkanResources.h
.
מידע נוסף זמין בקטעים יצירת משאבים ותיאורי משאבים במפרט Vulkan.
המרה ל-shaders של Vulkan לחישוב
צריך להמיר את הסקריפטים של RenderScript ל-Vulkan compute shaders. יכול להיות שתצטרכו גם לשנות את הקוד בהתאם לשימוש במשתנים גלובליים של RenderScript.
כתיבת תוכנת הצללה (shader) לעיבוד ב-Vulkan
בדרך כלל, כותבים שגיאת מחשוב של Vulkan ב-OpenGL Shading Language (GLSL) ולאחר מכן מקמפלים אותה לפורמט Standard Portable Intermediate Representation-V (SPIR-V).
מידע מפורט והוראות לשילוב של שישיות בקוד באפליקציה מפורטות במאמר מרכזי שישיות של Vulkan ב-Android.
התאמה של משתנים גלובליים של סקריפטים
על סמך המאפיינים של המשתנים הגלובליים של הסקריפט, מומלץ להשתמש במשתני קבועים ייעודיים, במשתני push או באובייקטים של מאגרים אחידים למשתנים גלובליים שלא משתנים בתוך ה-shader:
- קבועים של התמחות: מומלצים למשתנים גלובליים של סקריפטים שתמיד יהיו עקביים בקריאות לליבת המעבד. כדי לשנות את הערך של קבועי המומחיות, צריך ליצור מחדש את צינור עיבוד הנתונים לחישוב.
- Push constants: מומלץ למשתנים גלובליים של סקריפטים שמשתנים לעיתים קרובות וקטנים מ-
maxPushConstantsSize
(מינימום מובטח: 128 בייטים). - מאגר אחיד: מומלץ למשתנים גלובליים של סקריפטים שמשתנים לעיתים קרובות וגדולים מהמגבלה של משתנה קבוע לדחיפה.
למשתנים גלובליים שמשתנים בתוך ה-shader, אפשר להשתמש בתמונה של Vulkan storage או במאגר של Vulkan storage.
חישובים
כדי שה-GPU יבצע את ה-compute shader, צריך ליצור צינור עיבוד נתונים לחישוב ב-Vulkan.
יצירת צינור עיבוד נתונים לחישוב ב-Vulkan
בקובץ ComputePipeline.h
באפליקציה לדוגמה מוסבר איך יוצרים את צינור עיבוד הנתונים לחישוב ב-Vulkan.
כדי להשתמש בשניידר SPIR-V שעבר הידור ב-Vulkan, צריך ליצור צינור עיבוד נתונים לחישוב ב-Vulkan באופן הבא:
- יוצרים מודול של שגיאות באמצעות שגיאת ה-SPIR-V שעבר הידור.
- יוצרים פריסה של קבוצת מתארים עם ציון קישורי המשאבים (פרטים נוספים זמינים בקטע הקצאות).
- יצירת קבוצת מתארים מתבנית קבוצת המתארים.
- יוצרים פריסה של צינור עיבוד נתונים מהפריסה של קבוצת התיאורים.
- יוצרים צינור עיבוד נתונים לחישוב עם מודול ה-shader ותצוגת הצינור.
למידע נוסף, עיינו בקטע Compute Pipelines במפרט של Vulkan.
התחלת חישוב
כדי להתחיל את החישוב באמצעות צינור עיבוד נתונים לחישוב:
- מעדכנים את קבוצת התיאורים במשאבי Vulkan.
- יוצרים מאגר פקודות של Vulkan ומתעדים את הפקודות הבאות:
- מקשרים את צינור עיבוד הנתונים ואת קבוצת התיאורים.
- שליחת קבוצות עבודה של מחשוב.
- שולחים את מאגר הפקודות לתור המחשוב.
- להמתין בתור, או לחלופין להחזיר גדר סנכרון.
כדי לשרשר יחד כמה ליבות (לדוגמה, כדי להעביר קודים באמצעות ScriptGroup
), מתעדים אותן במאגר פקודות יחיד ומסנכרנים עם מחסומי זיכרון.
האפליקציה לדוגמה מדגימה שתי משימות מחשוב:
- סיבוב HUE: משימה פשוטה של מחשוב עם שדה פונקציות מחשוב יחיד. דוגמת הקוד מופיעה בקטע
ImageProcessor::rotateHue
. - טשטוש: משימה מורכבת יותר של מחשוב שמבצעת ברצף שני שגיאות מחשוב. דוגמת הקוד מופיעה בקטע
ImageProcessor::blur
.
מידע נוסף על מאגרי פקודות או על מחסומי זיכרון זמין בקטעים מאגרי פקודות ומחסומי זיכרון במפרט Vulkan.