You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Nvidia Nsight创建BLAS时崩溃,可能的引发原因有哪些?

Vulkan BLAS构建及Nsight调试崩溃问题

编辑补充:我已找到代码中的错误。我误将max_primive_count设为3,但我仅需要显示单个三角形,正确值应为1。此外maxVertex应设为3,我还忘记将顶点步长设置为sizeof(float) * 3。Nsight崩溃的情况让我误以为程序存在严重问题,反而排查得过于深入,不过过程中也有其他收获。

我目前在Vulkan应用中搭建BLAS实例时遇到问题,且Nsight配置异常无法正常开展调试工作。

程序构建正常,常规调试也可以运行,但不足以定位屏幕上无几何图形渲染的原因。因此我尝试用Nsight调试加速结构,却出现崩溃问题。

崩溃日志如下:

Reason:    EXCEPTION_ACCESS_VIOLATION_READ
Address:   0x238
Assertion: Unknown assertion type 0x00000000

Thread 0 (crashed)
 <no frames> 
Thread 1
 <no frames> 
Thread 2
 <no frames> 
Thread 3
 <no frames> 
Thread 4
 <no frames> 
Thread 5
 <no frames> 
Thread 6
 <no frames> 
Thread 7
 <no frames> 
Thread 8
 <no frames> 
Thread 9
 <no frames> 
Thread 10
 <no frames> 
Thread 11
 <no frames> 
Thread 12
 <no frames> 
Thread 13
 <no frames> 
Thread 14
 <no frames> 
Thread 15
 <no frames> 
Thread 16
 <no frames> 
Thread 17
 <no frames> 
Thread 18
 <no frames>

崩溃并不发生在启动阶段,而是正好在执行CmdBuildAccelerationStructuresKHR时触发,因此我基本可以确定问题出在BLAS创建环节,或是我使用的测试几何数据存在问题。

看起来是Nsight无法访问某个地址或是没有对应权限,但我暂时无法确定具体原因。

测试BLAS几何数据代码

const float vertices[9] = {
        0.25f, 0.25f, 0.0f,
        0.75f, 0.25f, 0.0f,
        0.50f, 0.75f, 0.0f
    };

    const float indices[3] = { 0.0f, 1.0f, 2.0f };

    BufferResource_t vertex_buffer_resource;
    BufferResource_t index_buffer_resource;

    VkResult err = buffer_create(&vertex_buffer_resource, sizeof(vertices), VK_BUFFER_USAGE_VERTEX_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT |  VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT | VK_BUFFER_USAGE_ACCELERATION_STRUCTURE_BUILD_INPUT_READ_ONLY_BIT_KHR,
    VK_MEMORY_ALLOCATE_DEVICE_ADDRESS_BIT);
    if (err != VK_SUCCESS)
        Sys_Error("Buffer creation failed");

    void* mem_vert = buffer_map(&vertex_buffer_resource);
    memcpy(mem_vert, vertices, vertex_buffer_resource.size);
    buffer_unmap(&vertex_buffer_resource);
    mem_vert = NULL;

    buffer_create(&index_buffer_resource, sizeof(indices), VK_BUFFER_USAGE_INDEX_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT | VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT | VK_BUFFER_USAGE_ACCELERATION_STRUCTURE_BUILD_INPUT_READ_ONLY_BIT_KHR,
        VK_MEMORY_ALLOCATE_DEVICE_ADDRESS_BIT);

    void* mem_ind = buffer_map(&index_buffer_resource);
    memcpy(mem_ind, &indices, index_buffer_resource.size);
    buffer_unmap(&index_buffer_resource);

    VkTransformMatrixKHR transform;
    memset(&transform, 0, sizeof(VkTransformMatrixKHR));
    transform.matrix[0][0] = 1.0;
    transform.matrix[1][1] = 1.0;
    transform.matrix[2][2] = 1.0;

    BufferResource_t transform_buffer_resource;
    buffer_create(&transform_buffer_resource, sizeof(VkTransformMatrixKHR), VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT | VK_BUFFER_USAGE_ACCELERATION_STRUCTURE_BUILD_INPUT_READ_ONLY_BIT_KHR,
        VK_MEMORY_ALLOCATE_DEVICE_ADDRESS_BIT);

    void* mem_transf = buffer_map(&transform_buffer_resource);
    memcpy(mem_transf, &transform, transform_buffer_resource.size);
    buffer_unmap(&transform_buffer_resource);

BLAS构建代码

VkDeviceOrHostAddressConstKHR vertex_device_or_host_address_const;
    memset(&vertex_device_or_host_address_const, 0, sizeof(VkDeviceOrHostAddressConstKHR));
    vertex_device_or_host_address_const.deviceAddress = vertex_buffer_resource.address;

    VkDeviceOrHostAddressConstKHR index_device_or_host_address_const;
    memset(&index_device_or_host_address_const, 0, sizeof(VkDeviceOrHostAddressConstKHR));
    index_device_or_host_address_const.deviceAddress = index_buffer_resource.address;

    VkDeviceOrHostAddressConstKHR transform_device_or_host_address_const;
    memset(&transform_device_or_host_address_const, 0, sizeof(VkDeviceOrHostAddressConstKHR));
    transform_device_or_host_address_const.deviceAddress = transform_buffer_resource.address;

    VkAccelerationStructureGeometryTrianglesDataKHR geometry_triangles_data;
    memset(&geometry_triangles_data, 0, sizeof(VkAccelerationStructureGeometryTrianglesDataKHR));
    geometry_triangles_data.sType = VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_GEOMETRY_TRIANGLES_DATA_KHR;
    geometry_triangles_data.vertexFormat = VK_FORMAT_R32G32B32_SFLOAT;
    geometry_triangles_data.vertexData = vertex_device_or_host_address_const;
    geometry_triangles_data.maxVertex = 9;
    geometry_triangles_data.indexType = VK_INDEX_TYPE_UINT32;
    geometry_triangles_data.indexData = index_device_or_host_address_const;
    geometry_triangles_data.transformData = transform_device_or_host_address_const;

    VkAccelerationStructureGeometryKHR geometry;
    memset(&geometry, 0, sizeof(VkAccelerationStructureGeometryKHR));
    geometry.sType = VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_GEOMETRY_KHR;
    geometry.geometry.triangles = geometry_triangles_data;
    geometry.geometryType = VK_GEOMETRY_TYPE_TRIANGLES_KHR;
    geometry.flags = VK_GEOMETRY_OPAQUE_BIT_KHR;

    VkAccelerationStructureBuildGeometryInfoKHR buildInfo;
    memset(&buildInfo, 0, sizeof(VkAccelerationStructureBuildGeometryInfoKHR));
    buildInfo.sType = VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_BUILD_GEOMETRY_INFO_KHR;
    buildInfo.pNext = VK_NULL_HANDLE;
    buildInfo.type = VK_ACCELERATION_STRUCTURE_TYPE_BOTTOM_LEVEL_KHR;
    buildInfo.flags = VK_BUILD_ACCELERATION_STRUCTURE_PREFER_FAST_TRACE_BIT_KHR;
    buildInfo.mode = VK_BUILD_ACCELERATION_STRUCTURE_MODE_BUILD_KHR;
    buildInfo.srcAccelerationStructure = VK_NULL_HANDLE;
    buildInfo.dstAccelerationStructure = VK_NULL_HANDLE;
    buildInfo.geometryCount = 1;
    buildInfo.pGeometries = &geometry;
    buildInfo.ppGeometries = VK_NULL_HANDLE;

    const uint32_t max_primitive_count = 3;

    VkAccelerationStructureBuildSizesInfoKHR sizeInfo;
    memset(&sizeInfo, 0, sizeof(VkAccelerationStructureBuildSizesInfoKHR));
    sizeInfo.sType = VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_BUILD_SIZES_INFO_KHR;

    fpGetAccelerationStructureBuildSizesKHR(vulkan_globals.device, VK_ACCELERATION_STRUCTURE_BUILD_TYPE_DEVICE_KHR, &buildInfo, &max_primitive_count, &sizeInfo);

    VkAccelerationStructureCreateInfoKHR createInfo;
    memset(&createInfo, 0, sizeof(VkAccelerationStructureCreateInfoKHR));
    createInfo.sType = VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_CREATE_INFO_KHR;
    createInfo.size = sizeInfo.accelerationStructureSize;
    createInfo.type = VK_ACCELERATION_STRUCTURE_TYPE_BOTTOM_LEVEL_KHR;

    BufferResource_t scratch_buffer;
    buffer_create(&scratch_buffer, sizeInfo.buildScratchSize,
        VK_BUFFER_USAGE_ACCELERATION_STRUCTURE_BUILD_INPUT_READ_ONLY_BIT_KHR | VK_BUFFER_USAGE_STORAGE_BUFFER_BIT | VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT,
        VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT);

    VkDeviceOrHostAddressKHR scratchDeviceOrHostAddress;
    memset(&scratchDeviceOrHostAddress, 0, sizeof(VkDeviceOrHostAddressKHR));
    scratchDeviceOrHostAddress.deviceAddress = scratch_buffer.address;

    buildInfo.scratchData = scratchDeviceOrHostAddress;

    buffer_create(&blas->mem, sizeInfo.accelerationStructureSize, VK_BUFFER_USAGE_ACCELERATION_STRUCTURE_STORAGE_BIT_KHR | VK_BUFFER_USAGE_ACCELERATION_STRUCTURE_BUILD_INPUT_READ_ONLY_BIT_KHR | VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT,
        VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT);
    createInfo.buffer = blas->mem.buffer;

    VkResult err = fpCreateAccelerationStructureKHR(vulkan_globals.device, &createInfo, NULL, &blas->accel);
    if (err != VK_SUCCESS)
        Sys_Error("vkCreateAccelerationStructure failed");

    buildInfo.dstAccelerationStructure = blas->accel;

    VkAccelerationStructureBuildRangeInfoKHR* build_range =
        &(VkAccelerationStructureBuildRangeInfoKHR) {
        .primitiveCount = 1,
            .primitiveOffset = 0,
            .firstVertex = 0,
            .transformOffset = 0
    };
    const VkAccelerationStructureBuildRangeInfoKHR** build_range_infos = &build_range;

    fpCmdBuildAccelerationStructuresKHR(vulkan_globals.command_buffer, 1, &buildInfo, build_range_infos);

欢迎各位提供反馈和建议,非常感谢!


内容的提问来源于stack exchange,提问作者Ruslan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.23 22:57:03