首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >vkCreateComputePipelines耗时太长

vkCreateComputePipelines耗时太长
EN

Stack Overflow用户
提问于 2021-09-30 12:26:40
回答 1查看 42关注 0票数 0

我在编译Vulkan计算着色器时遇到了一个奇怪的问题。我有这个着色器(它甚至不是那么复杂)

代码语言:javascript
复制
#version 450
#extension GL_GOOGLE_include_directive : enable
//#extension GL_EXT_debug_printf : enable
#extension GL_KHR_shader_subgroup_basic : enable
#extension GL_KHR_shader_subgroup_arithmetic : enable

#define IS_AVAILABLE_BUFFER_ANN_ENTITIES
#define IS_AVAILABLE_BUFFER_GLOBAL_MUTABLES
#define IS_AVAILABLE_BUFFER_BONES
#define IS_AVAILABLE_BUFFER_WORLD
//#define IS_AVAILABLE_BUFFER_COLLISION_GRID

#include "descriptors_compute.comp"

layout (local_size_x_id = GROUP_SIZE_CONST_ID) in;

#include "utils.comp"

shared float[ANN_MAX_SIZE] tmp1;
shared float[ANN_MAX_SIZE] tmp2;
shared uint[ANN_TOUCHED_BLOCK_COUNT] touched_block_ids;
mat3 rotation_mat_from_yaw_and_pitch(vec2 yaw_and_pitch){
    const vec2 Ss = sin(yaw_and_pitch); // let S denote sin(yaw) and s denote sin(pitch)
    const vec2 Cc = cos(yaw_and_pitch); // let C denote cos(yaw) and c denote cos(pitch)
    const vec4 Cs_cC_Sc_sS = vec4(Cc,Ss) * vec4(Ss.y,Cc,Ss.x);
    return mat3(Cs_cC_Sc_sS.y,-Ss.y,-Cs_cC_Sc_sS.z,Cs_cC_Sc_sS.x,Cc.y,-Cs_cC_Sc_sS.w,Ss.x,0,Cc.x);
}
void main() {
    const uint entity_id = gl_WorkGroupID.x;
    const uint lID = gl_LocalInvocationID.x;
    const uint entities_count = global_mutables.ann_entities;
    if (entity_id < entities_count){
        const AnnEntity entity = ann_entities[entity_id];
        const Bone bone = bones[entity.bone_idx];
        const mat3 rotation = rotation_mat_from_yaw_and_pitch(bone.yaw_and_pitch);
        const uint BLOCK_TOUCH_SENSE_OFFSET = 0;
        const uint LIDAR_LENGTH_SENSE_OFFSET = BLOCK_EXTENDED_SENSORY_FEATURES_LEN*ANN_TOUCHED_BLOCK_COUNT;
        for(uint i=lID;i<ANN_LIDAR_COUNT;i+=GROUP_SIZE){
            const vec3 rotated_lidar_direction = rotation * entity.lidars[i].direction;
            const RayCastResult ray = ray_cast(bone.new_center, rotated_lidar_direction);
            tmp1[LIDAR_LENGTH_SENSE_OFFSET+i] = ray.ratio_of_traversed_length;
        }
        for(uint i = lID;i<ANN_OUTPUT_SIZE;i+=GROUP_SIZE){
            const AnnSparseOutputNeuron neuron = entity.ann_output[i];
            float sum = neuron.bias;
            for(uint j=0;j<neuron.incoming.length();j++){
                sum += tmp1[neuron.incoming[j].src_neuron] * neuron.incoming[j].weight;
            }
            tmp2[i] = max(0,sum);//ReLU activation
        }
        vec2 rotation_change = vec2(0,0);
        for(uint i = lID;i<ANN_OUTPUT_ROTATION_MUSCLES_SIZE;i+=GROUP_SIZE){
            rotation_change += tmp2[ANN_OUTPUT_ROTATION_MUSCLES_OFFSET+i] * ANN_IMPULSES_OF_ROTATION_MUSCLES[i];
        }
        rotation_change = subgroupAdd(rotation_change);
        if(lID==0){
            bones[entity.bone_idx].yaw_and_pitch += rotation_change;
        }
    }
}

函数ray_cast可能是这个着色器中最复杂的部分,但我也在许多其他立即编译的着色器中重用了这个完全相同的函数。我想知道GL_KHR_shader_subgroup_arithmetic是否会减慢vkCreateComputePipelines的速度,但如果去掉它没有什么不同。伏尔坎花了超过一分钟的时间来完成vkCreateComputePipelines。我还包含了一些实用函数,但我只使用了其中的几个常量和ray_cast,所以其中90%的代码都是未使用的,应该由glslc删除。会不会是Vulkan正在悄悄地尝试执行任何其他类型的优化,并导致延迟?我认为所有的优化都是由glslc完成的,在SPIR-V上没有做太多的后处理。顺便说一下,我使用的是Nvidia的专有驱动程序。

我真的很困惑为什么这个着色器创建起来这么慢,尽管我还有其他着色器,它们是十倍长,更复杂,而且它们是立即加载的。

有没有办法分析一下这个?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-09-30 13:16:17

经过仔细检查,我注意到,通常情况下,所有为我的着色器生成的SPIR-V文件大约需要10-30KB。然而,这个着色器需要178KB。

spirv-dis的帮助下,我查看了生成的程序集内部,注意到绝大多数操作码都是OpConstant。这是因为我的结构看起来像

代码语言:javascript
复制
struct AnnSparseOutputNeuron{
    AnnSparseConnection[ANN_LATENT_CONNECTIONS_PER_OUTPUT_NEURON] incoming;
    float bias;
};

它们包含大型数组。因此,这两个

代码语言:javascript
复制
const AnnEntity entity = ann_entities[entity_id];

代码语言:javascript
复制
const AnnSparseOutputNeuron neuron = entity.ann_output[i];

将被编译成许多操作码,这些操作码为数组中的每个元素写入这些常量值。因此,与其编写表单的代码,

代码语言:javascript
复制
const A a = buffer_of_As[i];
f(a.some_filed)

最好是使用

代码语言:javascript
复制
f(buffer_of_As[i].some_filed)

这似乎解决了问题。我原以为glslc足够聪明,可以解决这样的优化问题,但显然并非如此。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69392228

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档