Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[vulkan] Reduce descriptor sets, use official headers, improve alloca…
…tor, remove module destructor (#8452) * Reduce resource usage for large pipelines by compiling one entry point per SPIR-V module. Use an amalgamation for the binary module returned by CodeGen Vulkan Dev. Decode amalgamation and cache each kernel module inside of cache entry. * Create a new emitter from scratch inside the add_kernel() method. Hook up dump() and dump_module() methods to debug options. * Clang format pass * Fix ambiguous conversion from path to std::string * Use explicit string method rather than constructor for path conversion. * Fix file path stem to string conversion. * Re-enable performance wrap test for Vulkan. * Trigger CI for testing * Mark transfer buffers with SRC & DST usage bits to allow re-use without validation errors. * Change interal_error to user_assert for un-implemented features. * Add note to Vulkan.md describing validation layer usage and deb packages. * Clang format * Switch to halide_mutex for locking Vulkan context (to match other GPU runtimes) * Trigger CI for testing * Reduce memory pressure by reducing default minimum block size to 4KB (from 32MB!). Ensure allocator.collect() is called when context is destroyed. * Clang format pass * Modify Vulkan allocation routine to fallback to any valid memory types after attempting preferred types. Confusingly, multiple compatible memory types may exist in multiple heaps, so to prioritize the preferred types (and corresponding heaps) first. Cleanup error handling to propagate errors. * Re-enable Vulkan for entire GPU allocation test. * Fix debug messages to iterate across dimensions * Avoid calling Vulkan API methods in module destructor, since some drivers appear to register an atexit() handler which may get invoked before the module destructor is called, which can invalidate the pointer call chain and cause segfaults. * Update object lifetime and leak tests to manually invoke the Vulkan device_release() to force cleanup of cached resources. * Refactor compilation cache destruction to use C-ABI methods rather than a functor object on the stack (which seems to cause different behaviour between LLVM versions). * Don't return an error if the instance pointer is invalid, since it indicates that either a block or a region has been free'd but hasn't been collected. * Clang tidy pass * Fix CodeGen for small signed integers (need to be sign extended and packed to 32 bits). Add kernel names to code module header (both encode and decode). Use kernel name in filename for HL_DUMP_SPIRV_FILE to aid debugging. * Remove stale mini_vulkan.h and use official Vulkan headers (setup the same as SPIR-V). Add script to easily update Vulkan Headers to another release branch. Add local copy of Vulkan headers (ANSI-C interfaces only). Refactor all vulkan runtime interfaces to match differences in headers. Don't use a global VkCommandPool associated with the context since it doesn't have a stable API type definition. Construct command pools on demand. * Ignore dependencies/vulkan for clang format * Use -Isystem path for Vulkan Headers * Clang tidy cleanup pass * Fix formatting * Fix makefile build (add missing runtime include path for vulkan headers). * Use spaces not tabs * Use cmake's find_package to locate the Vulkan Headers, defaulting to our local copy * Add "vulkan-headers" to vcpkg.json. Update builtin-baseline to d567b667adba0e72c5c3931ddbe745b66aa34b73 * Split Vulkan API function pointers into three groups ... loader, instance and device. Manage instance and device API function pointers with context ... not globally. Always lookup device function pointers in destructor to validate the intefaces before calling. Use ScopedVulkanCommandPoolAndBuffer for managing transient command pools and buffers to avoid leaking if errors occur within a scope. * Clang format pass * Remove manual destruction in object lifetime tests for Vulkan * Remove trailing comment in array * Remove leftover print * Add optional custom dtor to JITModuleContents to allow JIT-only destructor for modules. Hook up halide_vulkan_release_all() as a custom dtor for shared Vulkan runtime module. Add halide_vulkan_release_all() to HalideRuntimeVulkan.h as a public exported method. * Trigger build to test latest drivers * Safeguard Vulkan destructor against being called if runtime wasn't initialized * Formatting pass. * Disable custom JIT destructor to see if segfaults still occur outside of shutdown/cleanup. * Test module destructor with latest driver. Disable other Halide_TARGETS to speed up testing. * Formatting pass * Only disable CUDA and OpenCL * Revert CMakeLists ... disabling targets prematurely fails the buildbot job * Add VK_EXT_DEBUG_UTILS_EXTENSION_NAME to optional instance extensions. Register debug callbacks to try and diagnose potential driver issues. Update src/runtime/HalideRuntimeVulkan.h with guarded typedefs to match Vulkan header. Add VK_KHR_MAINTENANCE_5_EXTENSION_NAME to optional device extensions. * Make clang tidy happy * Format & Tidy * Revert changes to JITModule which added a custom dtor. Use standard module dtor like all other runtimes. * Revert changes to HalideRuntimeVulkan that added a custom dtor. Update comment in module destructor to match latest findings. Added issue link. Cleanup Vulkan handle initializations ... use VK_NULL_HANDLE. * Re-enable GPU object lifetime management tests and leak device tests for Vulkan. * Formatting * trigger buildbots --------- Co-authored-by: Derek Gerstmann <[email protected]> Co-authored-by: Steven Johnson <[email protected]>
- Loading branch information