feat(fp16): fetch for fp16 support

This commit is contained in:
PancakeTAS 2025-07-30 18:58:08 +02:00 committed by Pancake
parent b34dd6ddaa
commit b93a4eeaf2
2 changed files with 22 additions and 2 deletions

View file

@ -34,6 +34,8 @@ namespace LSFG::Core {
[[nodiscard]] uint32_t getComputeFamilyIdx() const { return this->computeFamilyIdx; }
/// Get the compute queue.
[[nodiscard]] VkQueue getComputeQueue() const { return this->computeQueue; }
/// Check if the device supports FP16.
[[nodiscard]] bool getFP16Support() const { return this->supportsFP16; }
// Trivially copyable, moveable and destructible
Device(const Core::Device&) noexcept = default;
@ -46,6 +48,7 @@ namespace LSFG::Core {
VkPhysicalDevice physicalDevice{};
uint32_t computeFamilyIdx{0};
bool supportsFP16{false};
VkQueue computeQueue{};
};

View file

@ -1,3 +1,4 @@
#include <iostream>
#include <volk.h>
#include <vulkan/vulkan_core.h>
@ -15,7 +16,7 @@ using namespace LSFG::Core;
const std::vector<const char*> requiredExtensions = {
"VK_KHR_external_memory_fd",
"VK_KHR_external_semaphore_fd",
"VK_EXT_robustness2",
"VK_EXT_robustness2"
};
Device::Device(const Instance& instance, uint64_t deviceUUID) {
@ -62,11 +63,26 @@ Device::Device(const Instance& instance, uint64_t deviceUUID) {
if (!computeFamilyIdx)
throw LSFG::vulkan_error(VK_ERROR_INITIALIZATION_FAILED, "No compute queue family found");
// check if physical device supports float16
VkPhysicalDeviceVulkan12Features supported12Features{
.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES
};
VkPhysicalDeviceFeatures2 supportedFeatures{
.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2,
.pNext = &supported12Features
};
vkGetPhysicalDeviceFeatures2(*physicalDevice, &supportedFeatures);
this->supportsFP16 = supported12Features.shaderFloat16;
if (this->supportsFP16)
std::cerr << "lsfg-vk: Using FP16 acceleration" << '\n';
else
std::cerr << "lsfg-vk: FP16 acceleration not supported, using FP32" << '\n';
// create logical device
const float queuePriority{1.0F}; // highest priority
VkPhysicalDeviceRobustness2FeaturesEXT robustness2{
.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ROBUSTNESS_2_FEATURES_EXT,
.nullDescriptor = VK_TRUE,
.nullDescriptor = VK_TRUE
};
VkPhysicalDeviceVulkan13Features features13{
.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_3_FEATURES,
@ -76,6 +92,7 @@ Device::Device(const Instance& instance, uint64_t deviceUUID) {
const VkPhysicalDeviceVulkan12Features features12{
.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_FEATURES,
.pNext = &features13,
.shaderFloat16 = this->supportsFP16,
.timelineSemaphore = VK_TRUE,
.vulkanMemoryModel = VK_TRUE
};