mirror of
				https://github.com/ggml-org/llama.cpp.git
				synced 2025-10-31 08:51:55 +00:00 
			
		
		
		
	 7c7836d9d4
			
		
	
	7c7836d9d4
	
	
	
		
			
			* Refactor shaders, extract GLSL code from ggml_vk_generate_shaders.py into vulkan-shaders directory * Improve debug log code * Add memory debug output option * Fix flake8 * Fix unnecessary high llama-3 VRAM use
		
			
				
	
	
		
			72 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			72 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| #version 450
 | |
| 
 | |
| #include "types.comp"
 | |
| 
 | |
| #define BLOCK_SIZE 1024
 | |
| #define ASC 0
 | |
| 
 | |
| layout(local_size_x = BLOCK_SIZE, local_size_y = 1, local_size_z = 1) in;
 | |
| 
 | |
| layout (binding = 0) readonly buffer A {A_TYPE data_a[];};
 | |
| layout (binding = 1)          buffer D {int data_d[];};
 | |
| 
 | |
| layout (push_constant) uniform parameter {
 | |
|     uint ncols;
 | |
|     uint ncols_pad;
 | |
|     uint order;
 | |
| } p;
 | |
| 
 | |
| shared int dst_row[BLOCK_SIZE];
 | |
| 
 | |
| void swap(uint idx0, uint idx1) {
 | |
|     int tmp = dst_row[idx0];
 | |
|     dst_row[idx0] = dst_row[idx1];
 | |
|     dst_row[idx1] = tmp;
 | |
| }
 | |
| 
 | |
| void main() {
 | |
|     // bitonic sort
 | |
|     const int col = int(gl_LocalInvocationID.x);
 | |
|     const uint row = gl_WorkGroupID.y;
 | |
| 
 | |
|     if (col >= p.ncols_pad) {
 | |
|         return;
 | |
|     }
 | |
| 
 | |
|     const uint row_offset = row * p.ncols;
 | |
| 
 | |
|     // initialize indices
 | |
|     dst_row[col] = col;
 | |
|     barrier();
 | |
| 
 | |
|     for (uint k = 2; k <= p.ncols_pad; k *= 2) {
 | |
|         for (uint j = k / 2; j > 0; j /= 2) {
 | |
|             const uint ixj = col ^ j;
 | |
|             if (ixj > col) {
 | |
|                 if ((col & k) == 0) {
 | |
|                     if (dst_row[col] >= p.ncols ||
 | |
|                         (dst_row[ixj] < p.ncols && (p.order == ASC ?
 | |
|                             data_a[row_offset + dst_row[col]] > data_a[row_offset + dst_row[ixj]] :
 | |
|                             data_a[row_offset + dst_row[col]] < data_a[row_offset + dst_row[ixj]]))
 | |
|                     ) {
 | |
|                         swap(col, ixj);
 | |
|                     }
 | |
|                 } else {
 | |
|                     if (dst_row[ixj] >= p.ncols ||
 | |
|                         (dst_row[col] < p.ncols && (p.order == ASC ?
 | |
|                             data_a[row_offset + dst_row[col]] < data_a[row_offset + dst_row[ixj]] :
 | |
|                             data_a[row_offset + dst_row[col]] > data_a[row_offset + dst_row[ixj]]))
 | |
|                     ) {
 | |
|                         swap(col, ixj);
 | |
|                     }
 | |
|                 }
 | |
|             }
 | |
|             barrier();
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     if (col < p.ncols) {
 | |
|         data_d[row_offset + col] = dst_row[col];
 | |
|     }
 | |
| }
 |