#include using namespace metal; struct Params { uint count; float scale; }; struct DataBuffer { array values; }; kernel void main(uint __luma_work_local_index [[thread_index_in_threadgroup]], uint3 __luma_work_global_id [[thread_position_in_grid]], uint3 __luma_work_local_id [[thread_position_in_threadgroup]], uint3 __luma_work_group_id [[threadgroup_position_in_grid]], device Params* params [[buffer(0)]], device DataBuffer* data [[buffer(1)]]) { threadgroup float scratch[64]; uint idx = __luma_work_local_index; uint gid = __luma_work_global_id.x; uint lid = __luma_work_local_id.x; uint group_x = __luma_work_group_id.x; if ((gid < params.count)) { scratch[idx] = (data.values[idx] * params.scale); threadgroup_barrier(mem_flags::mem_threadgroup); data.values[idx] = (scratch[idx] + static_cast((lid + group_x))); } }