Блоки vkQueueSubmit при использовании семафоров временной шкалы - PullRequest
0 голосов
/ 02 мая 2020

Мне нужно запустить функцию на CPU между двумя пакетами GPU. Для этого я использую семафоры временной шкалы. Насколько я знаю, vkQueueSubmit не блокирует. Тем не менее, он блокирует, когда я отправляю эти пакеты GPU:

uint64_t host_wait = timeline;
uint64_t host_signal = ++timeline;

uint64_t wait0 = timeline;
uint64_t signal0 = ++timeline;
uint64_t wait1 = timeline;
uint64_t signal1 = ++timeline;

VkPipelineStageFlags wait_mask = VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT;

VkTimelineSemaphoreSubmitInfo sp_submit0 = {
    .sType                     = VK_STRUCTURE_TYPE_TIMELINE_SEMAPHORE_SUBMIT_INFO,
    .waitSemaphoreValueCount   = 1,
    .pWaitSemaphoreValues      = &wait0,
    .signalSemaphoreValueCount = 1,
    .pSignalSemaphoreValues    = &signal0,
};
VkSubmitInfo submit0 = {
    .sType                = VK_STRUCTURE_TYPE_SUBMIT_INFO,
    .pNext                = &sp_submit0,
    .waitSemaphoreCount   = 1,
    .pWaitSemaphores      = &timeline_semaphore,
    .pWaitDstStageMask    = &wait_mask,
    .signalSemaphoreCount = 1,
    .pSignalSemaphores    = &timeline_semaphore,
};

VkTimelineSemaphoreSubmitInfo sp_submit1 = {
    .sType                     = VK_STRUCTURE_TYPE_TIMELINE_SEMAPHORE_SUBMIT_INFO,
    .waitSemaphoreValueCount   = 1,
    .pWaitSemaphoreValues      = &wait1,
    .signalSemaphoreValueCount = 1,
    .pSignalSemaphoreValues    = &signal1,
};
VkSubmitInfo submit1 = {
    .sType                = VK_STRUCTURE_TYPE_SUBMIT_INFO,
    .pNext                = &sp_submit1,
    .waitSemaphoreCount   = 1,
    .pWaitSemaphores      = &timeline_semaphore,
    .pWaitDstStageMask    = &wait_mask,
    .commandBufferCount   = 1,
    .pCommandBuffers      = &command_buffer,
    .signalSemaphoreCount = 1,
    .pSignalSemaphores    = &timeline_semaphore,
};

VkSubmitInfo infos[2] = { submit0, submit1 };
vkQueueSubmit(queue, 2, infos, fence);
// here vkQueueSubmit blocks the thread

WaitSemaphore(timeline_semaphore, host_wait);
some_function();
SignalSemaphore(timeline_semaphore, host_signal);

Он блокируется на несколько секунд без возврата, я думаю, что это что-то вроде тупика. В отладчике я видел вызов функции SleepEx из vkQueueSubmit: vk_icdGetInstanceProcAddrSG -> ... -> SleepEx.

Но vkQueueSubmit не блокирует в этом примере (комбинированный пакет):

uint64_t host_wait = timeline;
uint64_t host_signal = ++timeline;

uint64_t wait1 = timeline;
uint64_t signal1 = ++timeline;

VkPipelineStageFlags wait_mask = VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT;

VkTimelineSemaphoreSubmitInfo sp_submit1 = {
    .sType                     = VK_STRUCTURE_TYPE_TIMELINE_SEMAPHORE_SUBMIT_INFO,
    .waitSemaphoreValueCount   = 1,
    .pWaitSemaphoreValues      = &wait1,
    .signalSemaphoreValueCount = 1,
    .pSignalSemaphoreValues    = &signal1,
};
VkSubmitInfo submit1 = {
    .sType                = VK_STRUCTURE_TYPE_SUBMIT_INFO,
    .pNext                = &sp_submit1,
    .waitSemaphoreCount   = 1,
    .pWaitSemaphores      = &timeline_semaphore,
    .pWaitDstStageMask    = &wait_mask,
    .commandBufferCount   = 1,
    .pCommandBuffers      = &command_buffer,
    .signalSemaphoreCount = 1,
    .pSignalSemaphores    = &timeline_semaphore,
};

VkSubmitInfo infos[1] = { submit1 };
vkQueueSubmit(queue, 1, infos, fence);

WaitSemaphore(timeline_semaphore, host_wait);
some_function();
SignalSemaphore(timeline_semaphore, host_signal);

Почему блоки vkQueueSubmit в первом примере кода? Каковы возможные причины этой проблемы? Я использую Vulkan 1.2 (SDK 1.2.135) на Windows 10 и Radeon RX 570 (драйвер 20.4.2).

EDIT: Когда я добавляю буфер команд в submit0, vkQueueSubmit не блокируется. Это ошибка в драйвере?

1 Ответ

0 голосов
/ 03 мая 2020

Причиной может быть нечто странное, например, отправка пакета без работы.

Спецификация c не имеет требований к производительности. Тот факт, что что-то является законным, не делает это хорошей идеей. Вообще говоря, если есть два способа сделать что-то, сделайте это очевидным способом. И отправка пустой партии не совсем очевидна

https://community.khronos.org/t/vkqueuesubmit-blocks-when-using-timeline-semaphores/105704/2

...