#vulkan
Вопрос:
Я использую api vulkan для вычислений GPGPU по соображениям совместимости. Я хочу использовать вычислительный шейдер vulkan для обработки изображений. У меня есть 8-битное цветное изображение rbg, на которое я хочу перенести VkBuffer
. Поскольку glsl не поддерживает 8-битные данные, поэтому я хочу ввести caste в 32-битный int и скопировать в VkBuffer
. Теперь проблема в том, что буферное хранилище становится для него огромным. Я получаю ошибку проверки примерно так
vkUpdateDescriptorSets() pDescriptorWrites[0] failed write update validation for VkDescriptorSet 0x7c45730000000006[] with error: Write update to VkDescriptorSet 0x7c45730000000006[] allocated with VkDescriptorSetLayout 0xf018750000000004[] binding #1 failed with error message: Attempted write update to buffer descriptor failed due to: For buffer VkBuffer 0x683e70000000002[] VkDescriptorBufferInfo range is 432000000 which is greater than this device's maxStorageBufferRange (134217728). The Vulkan spec states: If descriptorType is VK_DESCRIPTOR_TYPE_STORAGE_BUFFER or VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC, the range member of each element of pBufferInfo, or the effective range if range is VK_WHOLE_SIZE, must be less than or equal to VkPhysicalDeviceLimits::maxStorageBufferRange
В opencl я не сталкиваюсь с проблемами такого типа для данных даже больше, чем это.
Вот мой VkBufferCreateInfo
VkBufferCreateInfo bufferCreateInfo = {};
bufferCreateInfo.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
bufferCreateInfo.size = bufferSize;
bufferCreateInfo.usage = VK_BUFFER_USAGE_STORAGE_BUFFER_BIT;
bufferCreateInfo.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
Что я могу сделать для обработки больших данных (300-400 МБ)?
Комментарии:
1. » Поскольку glsl не поддерживает 8-битные данные «, да, это так, при условии, что ваша реализация допускает такой формат изображения.
2. Если ваша реализация поддерживает только 128 МБ SSBOS, это, вероятно, связано с тем, что в ней не так много места для хранения. Таким образом, SSBO объемом 400 МБ не будет работать, потому что у вас нет 400 МБ для игры. Кроме того, это MoltenVK или мобильный чипсет или что-то в этом роде, потому что у большинства аппаратных средств для игры более 128 Мбайт.
3. @NicolBolas Как я могу обрабатывать 8-битные данные в glsl
4. Что именно вы имеете в виду под этим? Обработайте его через какой интерфейс?
5. Другими словами, вы используете битовые сдвиги и побитовое (или что-то вроде (bitfieldExtract)[ khronos.org/registry/OpenGL-Refpages/gl4/html/… ) , чтобы получить байты из 32-битных int. Вы также можете использовать (unpackSnorm)[ khronos.org/registry/OpenGL-Refpages/gl4/html/… — он автоматически преобразует ваши 32-битные int в векторы с плавающей запятой, как если бы байты были нормализованными int. Однако, если вам нужны фактические значения 8 бит, вам понадобятся расширения.