Synchronization Validation is implemented in the VK_LAYER_KHRONOS_validation layer. When enabled, the Synchronization Object is intended to identify resource access conflicts due to missing or incorrect synchronization operations between actions (Draw, Copy, Dispatch, Blit) reading or writing the same regions of memory.
Synchronization will ideally be run periodically after resolving any outstanding validation checks from all other validation objects, so that issues may be addressed in early stages of development.
The specific areas covered by this layer are currently tracked in the Synchronization Validation Project. Requests for additional checks can be requested by creating a Github issue.
Synchronization Validation is just a normal layer setting that can be turned on.
The main 3 ways to turn on Sync
NOTE - This will turn off other non-sync validation for you makeing Synchronization Validation run faster.
VK_EXT_layer_settings// Will turn on as an additional setting with core validation const VkBool32 verbose_value = true; const VkLayerSettingEXT layer_setting = {"VK_LAYER_KHRONOS_validation", "validate_sync", VK_LAYER_SETTING_TYPE_BOOL32_EXT, 1, &verbose_value}; VkLayerSettingsCreateInfoEXT layer_settings_create_info = {VK_STRUCTURE_TYPE_LAYER_SETTINGS_CREATE_INFO_EXT, nullptr, 1, &layer_setting}; VkInstanceCreateInfo instance_ci = GetYourCreateInfo(); instance_ci.pNext = &layer_settings_create_info;
# Windows set VK_VALIDATION_VALIDATE_SYNC=1 # Linux export VK_VALIDATION_VALIDATE_SYNC=1 # Android adb shell setprop debug.vulkan.khronos_validation.validate_sync=1
Additional configuration settings will all share the VK_LAYER_SYNCVAL_/khronos_validation.syncval_* prefix namespace.
The pipelined and multi-threaded nature of Vulkan makes it particularly important for applications to correctly insert needed synchronization primitives, and for validation to diagnose unprotected memory access hazards. Synchronization reports the presence of access hazards including information to identify the Vulkan operations which are in conflict. The reported hazards are:
Hazard detection for memory usage for commands within the same command buffer.
Synchronization operations .
The VK_KHR_synchronization2 extension
Image layout transition hazard and access tracking.
Load/Store/Resolve operations within Subpasses.
ExecuteCommands detection of hazard from or with secondary command buffers
QueueSubmit/QueueSubmit2 time hazard detection
Semaphore and Fence synchronization operations/effects
Device and Queue WaitIdle support
Dynamic Rendering support
To debug synchronization validation issues (all platforms):
vkCreateDebugUtilsMessengerEXT with the VK_DEBUG_REPORT_ERROR_BIT_EXT set.vkCmd... command with a hazard is recorded.On Windows, Synchronization Validation can be run using just vkconfig and the debugger without defining a callback:
vkCmd... command with a hazard is recorded.A synchronization validation error message describes a race condition by identifying two memory accesses that caused the hazard and the state of applied synchronization.
Error message example:
vkCmdExecuteCommands(): WRITE_AFTER_READ hazard detected. vkCmdCopyImage (from the secondary VkCommandBuffer 0x1fb2f224d40) writes to VkImage 0xf56c9b0000000004, which was previously read by another vkCmdCopyImage command (from the primary VkCommandBuffer 0x1fb245f4200).
No sufficient synchronization is present to ensure that a write (VK_ACCESS_2_TRANSFER_WRITE_BIT) at VK_PIPELINE_STAGE_2_COPY_BIT does not conflict with a prior read (VK_ACCESS_2_TRANSFER_READ_BIT) at the same stage.
Vulkan insight: an execution dependency is sufficient to prevent this hazard.
The error message usually includes the following:
Unlike core validation error messages, where each message is identified by a VUID, synchronization validation primarily detects a single type of error: a race condition between two memory accesses. There are limitless ways to produce a race condition (combinations of command pairs and different synchronization methods), which is why race condition scenarios are not identified by VUIDs.
To suppress or filter synchronization validation error messages, one can use the optional Extra properties section. Extra properties contain key-value pairs that help identify the error message and are presented in a more structured format compared to the main error message, making parsing easier.
One of the benefits of parsing Extra properties rather than the main error message is that the former is more stable and changes less frequently. This creates a nice separation: on one side, we can take every opportunity to improve the error message wording while keeping the Extra properties values unchanged in most cases, so suppression and filtering logic does not need to be updated.
Example of error message with extra properties enabled:
vkQueueSubmit(): WRITE_AFTER_WRITE hazard detected. vkCmdEndRenderPass (from VkCommandBuffer submitted on the current VkQueue ) writes to resource, which was previously written by vkCmdClearColorImage (from VkCommandBuffer submitted on VkQueue ).
The current synchronization allows VK_ACCESS_2_COLOR_ATTACHMENT_READ_BIT accesses at VK_PIPELINE_STAGE_2_COLOR_ATTACHMENT_OUTPUT_BIT, but to prevent this hazard, it must allow VK_ACCESS_2_COLOR_ATTACHMENT_WRITE_BIT accesses at VK_PIPELINE_STAGE_2_COLOR_ATTACHMENT_OUTPUT_BIT.
[Extra properties] message_type = SubmitTimeError hazard_type = WRITE_AFTER_WRITE prior_access = VK_PIPELINE_STAGE_2_CLEAR_BIT(VK_ACCESS_2_TRANSFER_WRITE_BIT) write_barriers = VK_PIPELINE_STAGE_2_COLOR_ATTACHMENT_OUTPUT_BIT(VK_ACCESS_2_COLOR_ATTACHMENT_READ_BIT) command = vkCmdEndRenderPass prior_command = vkCmdClearColorImage command_buffer_index = 1 submit_index = 2 batch_index = 0 batch_tag = 5
Extra properties can be enabled in Vulkan Configurator or by using khronos_validation.syncval_message_extra_properties validation layer setting.
VK_SUBPASS_EXTERNAL when memory barriers are needed.Access info read_barrier and write_barrier values of 0, reflect the absence of any barrier, and can indicate an insufficient or incorrect source mask (first scope).VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_ACCESS_MEMORY_READ_BIT|VK_ACCESS_MEMORY_WRITE_BIT for both src*Mask and dst*Mask fields to locate missing barriers. If the inserted barrier resolves a hazard, the conflicting access happens-before the inserted barrier. (Be sure to delete later.)Synchronization Examples https://github.com/KhronosGroup/Vulkan-Docs/wiki/Synchronization-Examples
Keeping your GPU fed without getting bitten https://www.youtube.com/watch?v=oF7vOTTaAh4
Yet another blog explaining Vulkan synchronization http://themaister.net/blog/2019/08/14/yet-another-blog-explaining-vulkan-synchronization/
A Guide to Vulkan Synchronization Validation https://www.khronos.org/news/permalink/blog-a-guide-to-vulkan-synchronization-validation