blob: 3d59694f8164dc385d5bc229477497a096ff195c [file] [edit]
#version 450 core
#pragma use_vulkan_memory_model
#extension GL_KHR_shader_subgroup_basic : enable
#extension GL_EXT_scalar_block_layout : enable
#extension GL_KHR_memory_scope_semantics : enable
#extension GL_KHR_cooperative_matrix : enable
#extension GL_EXT_buffer_reference : enable
#extension GL_EXT_control_flow_attributes : enable
#extension GL_KHR_shader_subgroup_basic : enable
#extension GL_EXT_shader_explicit_arithmetic_types_float32 : enable
#extension GL_EXT_shader_explicit_arithmetic_types_float16 : enable
#extension GL_EXT_shader_explicit_arithmetic_types_int32 : enable
#extension GL_EXT_shader_explicit_arithmetic_types_int8 : enable
#extension GL_QCOM_cooperative_matrix_conversion : enable
layout(set=0, binding=0) readonly buffer InputA { float x[]; } inputA;
layout(set=0, binding=1) readonly buffer InputB { float x[]; } inputB;
layout(set=0, binding=2) readonly buffer InputC { float x[]; } inputC;
layout(set=0, binding=3) buffer Output { float x[]; } outputO;
layout(local_size_x = 64, local_size_y = 2, local_size_z = 2) in;
void main()
{
float16_t hvec8A[16];
float32_t vec8A[8];
int32_t ivec8A[8];
uint32_t uvec8A[8];
float16_t hvec32B[64];
float32_t vec32B[32];
int32_t ivec32B[32];
uint32_t uvec32B[32];
float vec64Acc[64];
int ivec64Acc[64];
uint uvec64Acc[64];
float16_t hvec8A_4[4];
// bitcastQCOM
{
bitcastQCOM(hvec8A, uvec8A);
bitcastQCOM(uvec8A, hvec8A);
bitcastQCOM(ivec8A, vec8A);
bitcastQCOM( vec8A, ivec8A);
bitcastQCOM(hvec32B, ivec32B);
bitcastQCOM(ivec32B, hvec32B);
bitcastQCOM(uvec32B, vec32B);
bitcastQCOM( vec32B, uvec32B);
bitcastQCOM(uvec64Acc, ivec64Acc);
bitcastQCOM(ivec64Acc, uvec64Acc);
bitcastQCOM(uvec64Acc, vec64Acc);
bitcastQCOM( vec64Acc, uvec64Acc);
}
// extractSubArrayQCOM
{
extractSubArrayQCOM(ivec64Acc, 0, ivec8A);
extractSubArrayQCOM(ivec64Acc, 8, ivec32B);
extractSubArrayQCOM(uvec64Acc, 0, uvec8A);
extractSubArrayQCOM(uvec64Acc, 8, uvec32B);
extractSubArrayQCOM( vec64Acc, 0, vec8A);
extractSubArrayQCOM( vec64Acc, 4, vec32B);
extractSubArrayQCOM(hvec32B, 0, hvec8A);
extractSubArrayQCOM(hvec32B, 4, hvec8A_4);
}
coopmat< uint8_t, gl_ScopeSubgroup, 64, 32, gl_MatrixUseA> matA_u8_64_32;
coopmat< int8_t, gl_ScopeSubgroup, 64, 32, gl_MatrixUseA> matA_i8_64_32;
coopmat<float16_t, gl_ScopeSubgroup, 64, 16, gl_MatrixUseA> matA_f16_64_16;
coopmat<float32_t, gl_ScopeSubgroup, 64, 8, gl_MatrixUseA> matA_f32_64_8;
// vectorToCoopmatQCOM gl_MatrixUseA
{
vectorToCoopmatQCOM( vec8A, matA_f32_64_8);
vectorToCoopmatQCOM(uvec8A, matA_f32_64_8);
vectorToCoopmatQCOM(hvec8A, matA_f16_64_16);
vectorToCoopmatQCOM(uvec8A, matA_f16_64_16);
int8_t i8vec8A[32];
vectorToCoopmatQCOM(i8vec8A, matA_i8_64_32);
vectorToCoopmatQCOM( uvec8A, matA_i8_64_32);
uint8_t u8vec8A[32];
vectorToCoopmatQCOM(u8vec8A, matA_u8_64_32);
vectorToCoopmatQCOM( uvec8A, matA_u8_64_32);
}
coopmat< uint8_t, gl_ScopeSubgroup, 32, 64, gl_MatrixUseB> matB_u8_32_64;
coopmat< int8_t, gl_ScopeSubgroup, 32, 64, gl_MatrixUseB> matB_i8_32_64;
coopmat<float16_t, gl_ScopeSubgroup, 16, 64, gl_MatrixUseB> matB_f16_16_64;
coopmat<float32_t, gl_ScopeSubgroup, 8, 64, gl_MatrixUseB> matB_f32_8_64;
coopmat<float16_t, gl_ScopeSubgroup, 16, 32, gl_MatrixUseB> matB_f16_16_32;
coopmat< int8_t, gl_ScopeSubgroup, 32, 16, gl_MatrixUseB> matB_i8_32_16;
// vectorToCoopmatQCOM gl_MatrixUseB
{
vectorToCoopmatQCOM( vec8A, matB_f32_8_64);
vectorToCoopmatQCOM(uvec8A, matB_f32_8_64);
vectorToCoopmatQCOM(hvec8A, matB_f16_16_64);
vectorToCoopmatQCOM(uvec8A, matB_f16_16_64);
int8_t i8vec8B[32];
vectorToCoopmatQCOM(i8vec8B, matB_i8_32_64);
vectorToCoopmatQCOM( uvec8A, matB_i8_32_64);
uint8_t u8vec8B[32];
vectorToCoopmatQCOM(u8vec8B, matB_u8_32_64);
vectorToCoopmatQCOM( uvec8A, matB_u8_32_64);
vectorToCoopmatQCOM(hvec8A, matB_f16_16_32);
vectorToCoopmatQCOM(uvec8A, matB_f16_16_32);
vectorToCoopmatQCOM(i8vec8B, matB_i8_32_16);
vectorToCoopmatQCOM(uvec8A, matB_i8_32_16);
}
coopmat< uint32_t, gl_ScopeSubgroup, 64, 64, gl_MatrixUseAccumulator> matAcc_u32_64_64;
coopmat< int32_t, gl_ScopeSubgroup, 64, 64, gl_MatrixUseAccumulator> matAcc_i32_64_64;
coopmat<float16_t, gl_ScopeSubgroup, 64, 64, gl_MatrixUseAccumulator> matAcc_f16_64_64;
coopmat<float32_t, gl_ScopeSubgroup, 64, 64, gl_MatrixUseAccumulator> matAcc_f32_64_64;
// vectorToCoopmatQCOM gl_MatrixUseAccumulator
{
vectorToCoopmatQCOM( vec64Acc, matAcc_f32_64_64);
vectorToCoopmatQCOM(uvec64Acc, matAcc_f32_64_64);
float16_t hvec64Acc[64];
vectorToCoopmatQCOM(hvec64Acc, matAcc_f16_64_64);
vectorToCoopmatQCOM(uvec32B, matAcc_f16_64_64);
vectorToCoopmatQCOM(ivec64Acc, matAcc_i32_64_64);
vectorToCoopmatQCOM(uvec64Acc, matAcc_i32_64_64);
vectorToCoopmatQCOM(uvec64Acc, matAcc_u32_64_64);
}
// coopmatToVectorQCOM gl_MatrixUseA
{
coopmatToVectorQCOM(matA_f32_64_8, vec8A);
coopmatToVectorQCOM(matA_f32_64_8, uvec8A);
coopmatToVectorQCOM(matA_f16_64_16, hvec8A);
coopmatToVectorQCOM(matA_f16_64_16, uvec8A);
int8_t i8vec8A[32];
coopmatToVectorQCOM(matA_i8_64_32, i8vec8A);
coopmatToVectorQCOM(matA_i8_64_32, uvec8A);
uint8_t u8vec8A[32];
coopmatToVectorQCOM(matA_u8_64_32, u8vec8A);
coopmatToVectorQCOM(matA_u8_64_32, uvec8A);
}
// coopmatToVectorQCOM gl_MatrixUseB
{
coopmatToVectorQCOM(matB_f32_8_64, vec8A);
coopmatToVectorQCOM(matB_f32_8_64, uvec8A);
coopmatToVectorQCOM(matB_f16_16_64, hvec8A);
coopmatToVectorQCOM(matB_f16_16_64, uvec8A);
int8_t i8vec8B[32];
coopmatToVectorQCOM(matB_i8_32_64, i8vec8B);
coopmatToVectorQCOM(matB_i8_32_64, uvec8A);
uint8_t u8vec8B[32];
coopmatToVectorQCOM(matB_u8_32_64, u8vec8B);
coopmatToVectorQCOM(matB_u8_32_64, uvec8A);
coopmatToVectorQCOM(matB_f16_16_32, hvec8A);
coopmatToVectorQCOM(matB_f16_16_32, uvec8A);
coopmatToVectorQCOM(matB_i8_32_16, i8vec8B);
coopmatToVectorQCOM(matB_i8_32_16, uvec8A);
}
// coopmatToVectorQCOM gl_MatrixUseAccumulator
{
coopmatToVectorQCOM(matAcc_f32_64_64, vec64Acc);
coopmatToVectorQCOM(matAcc_f32_64_64, uvec64Acc);
float16_t hvec64Acc[64];
coopmatToVectorQCOM(matAcc_f16_64_64, hvec64Acc);
coopmatToVectorQCOM(matAcc_f16_64_64, uvec32B);
coopmatToVectorQCOM(matAcc_i32_64_64, ivec64Acc);
coopmatToVectorQCOM(matAcc_i32_64_64, uvec64Acc);
coopmatToVectorQCOM(matAcc_u32_64_64, uvec64Acc);
}
}