soft_max.comp 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. #version 450
  2. #extension GL_EXT_shader_16bit_storage : require
  3. layout (push_constant) uniform parameter
  4. {
  5. uint KX;
  6. uint KY;
  7. float scale;
  8. float max_bias;
  9. float m0;
  10. float m1;
  11. uint n_head_log2;
  12. } p;
  13. #include "types.comp"
  14. #extension GL_EXT_control_flow_attributes : enable
  15. #define BLOCK_SIZE 512
  16. layout(local_size_x = BLOCK_SIZE, local_size_y = 1, local_size_z = 1) in;
  17. layout (binding = 0) readonly buffer X {A_TYPE data_a[];};
  18. layout (binding = 1) readonly buffer Y {B_TYPE data_b[];};
  19. layout (binding = 2) buffer D {D_TYPE data_d[];};
  20. shared FLOAT_TYPE vals[BLOCK_SIZE];
  21. void main() {
  22. const uint tid = gl_LocalInvocationID.x;
  23. const uint rowx = gl_WorkGroupID.x;
  24. const uint rowy = rowx % p.KY;
  25. float slope = 1.0f;
  26. // ALiBi
  27. if (p.max_bias > 0.0f) {
  28. const uint h = rowx/p.KY; // head index
  29. const float base = h < p.n_head_log2 ? p.m0 : p.m1;
  30. const uint exp = h < p.n_head_log2 ? h + 1 : 2*(h - p.n_head_log2) + 1;
  31. slope = pow(base, exp);
  32. }
  33. // Find max
  34. FLOAT_TYPE max_val = uintBitsToFloat(0xFF800000);
  35. [[unroll]] for (uint col0 = 0; col0 < p.KX; col0 += BLOCK_SIZE) {
  36. const uint col = col0 + tid;
  37. if (col >= p.KX) {
  38. break;
  39. }
  40. max_val = max(max_val, FLOAT_TYPE(data_a[rowx * p.KX + col]) * p.scale + (p.KY > 0 ? slope * FLOAT_TYPE(data_b[rowy * p.KX + col]) : FLOAT_TYPE(0.0f)));
  41. }
  42. vals[tid] = max_val;
  43. barrier();
  44. [[unroll]] for (int s = BLOCK_SIZE / 2; s > 0; s >>= 1) {
  45. if (tid < s) {
  46. vals[tid] = max(vals[tid], vals[tid + s]);
  47. }
  48. barrier();
  49. }
  50. max_val = vals[0];
  51. barrier();
  52. // Sum up values
  53. vals[tid] = FLOAT_TYPE(0.0f);
  54. [[unroll]] for (uint col0 = 0; col0 < p.KX; col0 += BLOCK_SIZE) {
  55. const uint col = col0 + tid;
  56. if (col >= p.KX) {
  57. break;
  58. }
  59. const uint i = rowx * p.KX + col;
  60. const FLOAT_TYPE val = exp(FLOAT_TYPE(data_a[i]) * p.scale + (p.KY > 0 ? slope * FLOAT_TYPE(data_b[rowy * p.KX + col]) : FLOAT_TYPE(0.0f)) - max_val);
  61. vals[tid] += val;
  62. data_d[i] = D_TYPE(val);
  63. }
  64. barrier();
  65. [[unroll]] for (int s = BLOCK_SIZE / 2; s > 0; s >>= 1) {
  66. if (tid < s) {
  67. vals[tid] += vals[tid + s];
  68. }
  69. barrier();
  70. }
  71. const D_TYPE divisor = D_TYPE(vals[0]);
  72. [[unroll]] for (uint col0 = 0; col0 < p.KX; col0 += BLOCK_SIZE) {
  73. const uint col = col0 + tid;
  74. if (col >= p.KX) {
  75. break;
  76. }
  77. data_d[rowx*p.KX + col] /= divisor;
  78. }
  79. }