submission 717449
champagnepapi · python · License unknown
Use it
Vendorable · source mirrored · license unknownView source →
No package. Vendor the mirrored source: 194 lines, June 9 Researcher Reciprocity License v1.0.
submission.py
curl "https://kernelindex.com/api/v1/implementations/kernelbot-amd-moe-mxfp4-717449?include=source"interfacepython
Compatibility
measured onAMD Instinct MI355X
declared hardwareAMD Instinct MI355X
architecturesgfx950
dtypesbf16, fp32, fp8_e8m0, int32, mxfp4
Benchmark evidence
1 measurement across 1 GPU, fastest first.
Operation / workload
Hardware
Latency
Rank
Observed
Reported · How evidence levels are derived →
Source and license
sourceavailable
revision digestsha256:c1bf06aeb664ea213e0414795094ceb547e08c28615b8a1f768896260215689d
license declaredunknown
license concludedunknown
authorschampagnepapi
imported2026-08-15
Kernel source
submission.py194 lines
import torch,os,sys,shutil,glob,lzma,base64,re,threading
from typing import Dict
from task import input_t,output_t
import aiter
from aiter import dtypes
from torch.utils.cpp_extension import load_inline
os.environ['PYTORCH_ROCM_ARCH']='gfx950'
_B="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"
print("[v7] Decompressing...",flush=True)
_a=lzma.decompress(base64.b64decode(_B)).decode()
_p={}
for c in _a.split("\n===SPLIT===\n"):
k=c.split("\n",1)[0];_p[k]=c.split("\n",1)[1]
_C1=_p["C1"];_C2=_p["C2"];_C3Q=_p["C3Q"];_C3K=_p["C3K"]
_C4=_p["C4"];_C5=_p["C5"];_C6=_p["C6"];_C7=_p["C7"]
del _a,_p
print("[v7] Ready.",flush=True)
def _cc(n):
for d in glob.glob(os.path.expanduser(f"~/.cache/torch_extensions/py*/{n}*")):shutil.rmtree(d,ignore_errors=True)
def _asobjs():
ap=os.path.dirname(os.path.dirname(aiter.__file__))
bd=os.path.join(ap,'aiter','jit','build','module_moe_sorting')
if not os.path.exists(bd) or not any(f.endswith('.o') for f in os.listdir(bd)):
d=torch.zeros(1,dtype=torch.int32,device='cuda')
try:aiter.moe_sorting_fwd(d,torch.zeros(1,dtype=torch.float32,device='cuda'),d,torch.zeros(1,dtype=torch.float32,device='cuda'),d,torch.zeros(2,dtype=torch.int32,device='cuda'),torch.zeros(1,dtype=torch.bfloat16,device='cuda'),1,1,None,None,0)
except:pass
so=[]
for r,ds,fs in os.walk(os.path.join(ap,'aiter','jit','build')):
for f in fs:
if 'moe_sorting' in f and f.endswith('.o'):so.append(os.path.join(r,f))
ck=os.path.join(ap,'3rdparty','composable_kernel')
return so,[os.path.join(ap,'csrc','include'),os.path.join(ck,'include'),os.path.join(ck,'include','ck_tile'),os.path.join(ck,'library','include')]
_K={};_B2={}
def _mc1():
_cc('sub_c1_v226')
return load_inline(name='sub_c1_v226',cpp_sources="""
#include <ATen/ATen.h>
void launch_fused_moe_v226(at::Tensor,at::Tensor,at::Tensor,at::Tensor,at::Tensor,at::Tensor,at::Tensor,at::Tensor,at::Tensor,at::Tensor,at::Tensor,at::Tensor,at::Tensor,at::Tensor,int,int,int);
""",cuda_sources=_C1,functions=['launch_fused_moe_v226'],extra_cuda_cflags=['-O3','-std=c++17','-mcumode','-mllvm','-amdgpu-early-inline-all=true','-mllvm','-amdgpu-function-calls=false'],verbose=False)
def _rc1(d):
hs,w1r,w2r,w1s,w2s,w1sh,w2sh,w1ss,w2ss,tw,ti,cfg=d
M=cfg['bs'];E=cfg['n_routed_experts']+cfg['n_shared_experts']
dh=cfg['d_hidden_pad'];de=cfg['d_expert_pad'];tk=cfg['total_top_k'];bm=32
k=('c1',M,E,dh,de)
if k not in _B2:
mn=M*tk+E*bm-tk;mm=(mn+bm-1)//bm;mt=mm*bm
_B2[k]=dict(si=torch.zeros(mt,dtype=torch.int32,device='cuda'),sw=torch.zeros(mt,dtype=torch.float32,device='cuda'),se=torch.zeros(mm,dtype=torch.int32,device='cuda'),nv=torch.empty(2,dtype=torch.int32,device='cuda'),mb=torch.empty((M,dh),dtype=torch.bfloat16,device='cuda'),af=torch.zeros(M,dh//2,dtype=torch.uint8,device='cuda'),asc=torch.zeros(M,dh//32,dtype=torch.uint8,device='cuda'),ifp4=torch.zeros(mt,de//2,dtype=torch.uint8,device='cuda'),isc=torch.zeros(mt,de//32,dtype=torch.uint8,device='cuda'),out=torch.zeros(M,dh,dtype=torch.bfloat16,device='cuda'))
b=_B2[k];m=_K['c1']
w1u=w1sh.view(torch.uint8);w1su=w1ss.view(dtypes.fp8_e8m0).view(torch.uint8)
w2u=w2sh.view(torch.uint8);w2su=w2ss.view(dtypes.fp8_e8m0).view(torch.uint8)
aiter.moe_sorting_fwd(ti,tw,b['si'],b['sw'],b['se'],b['nv'],b['mb'],E,bm,None,None,0)
m.launch_fused_moe_v226(hs,w1u,w1su,w2u,w2su,b['out'],b['af'],b['asc'],b['ifp4'],b['isc'],b['si'],b['sw'],b['se'],b['nv'],dh,de,M)
return b['out'][:,:cfg['d_hidden']]
def _mc2():
ls=re.findall(r'void\s+(launch_\w+)\s*\(',_C2)
cd=['#include <ATen/ATen.h>']
for m in re.finditer(r'(void\s+launch_\w+\([^)]+\))\s*\{',_C2):cd.append(m.group(1).strip()+';')
_cc('sub_c2_v328')
return load_inline(name='sub_c2_v328',cpp_sources='\n'.join(cd),cuda_sources=_C2,functions=ls,extra_cuda_cflags=['-O3','-std=c++17','-mcumode','-mllvm','-amdgpu-early-inline-all=true','-mllvm','-amdgpu-function-calls=false'],verbose=False)
def _rc2(d):
hs,w1r,w2r,w1s,w2s,w1sh,w2sh,w1ss,w2ss,tw,ti,cfg=d
M=cfg['bs'];E=cfg['n_routed_experts']+cfg['n_shared_experts']
dh=cfg['d_hidden_pad'];de=cfg['d_expert_pad'];tk=cfg['total_top_k'];bm=32
k=('c2',M,E,dh,de)
if k not in _B2:
mn=M*tk+E*bm-tk;mm=(mn+bm-1)//bm;mt=mm*bm
nc=dh//32;nb=(nc+7)//8;a5=((mt+31)//32)*nb*256
_B2[k]=dict(si=torch.empty(mt,dtype=torch.int32,device='cuda'),sw=torch.empty(mt,dtype=torch.float32,device='cuda'),se=torch.empty(mm,dtype=torch.int32,device='cuda'),nv=torch.empty(2,dtype=torch.int32,device='cuda'),mb=torch.empty((M,dh),dtype=torch.bfloat16,device='cuda'),af=torch.empty(M,dh//2,dtype=torch.uint8,device='cuda'),ars=torch.empty(M,nc,dtype=torch.uint8,device='cuda'),asf=torch.full((a5,),127,dtype=torch.uint8,device='cuda'),ifp4=torch.empty(mt,de//2,dtype=torch.uint8,device='cuda'),isc=torch.empty(mt,de//32,dtype=torch.uint8,device='cuda'),out=torch.empty(M,dh,dtype=torch.bfloat16,device='cuda'))
b=_B2[k];m=_K['c2']
w1u=w1sh.view(torch.uint8);w1su=w1ss.view(dtypes.fp8_e8m0).view(torch.uint8)
w2u=w2sh.view(torch.uint8);w2su=w2ss.view(dtypes.fp8_e8m0).view(torch.uint8)
aiter.moe_sorting_fwd(ti,tw,b['si'],b['sw'],b['se'],b['nv'],b['mb'],E,bm,None,None,0)
m.launch_fused_moe_v328(hs,w1u,w1su,w2u,w2su,b['out'],b['af'],b['ars'],b['asf'],b['ifp4'],b['isc'],b['si'],b['sw'],b['se'],b['nv'],dh,de,M)
return b['out'][:,:cfg['d_hidden']]
def _mc3():
_cc('sub_c3_v481')
return load_inline(name='sub_c3_v481',cpp_sources="""
#include <ATen/ATen.h>
void launch_stage1_v481(at::Tensor,at::Tensor,at::Tensor,at::Tensor,at::Tensor,at::Tensor,at::Tensor,at::Tensor,at::Tensor,int,int,int,int);
void launch_memset_v481(at::Tensor);
void launch_stage2_v481(at::Tensor,at::Tensor,at::Tensor,at::Tensor,at::Tensor,at::Tensor,at::Tensor,at::Tensor,at::Tensor,int,int,int,int);
void launch_pipeline_v481(at::Tensor,at::Tensor,at::Tensor,at::Tensor,at::Tensor,at::Tensor,at::Tensor,at::Tensor,at::Tensor,at::Tensor,at::Tensor,at::Tensor,at::Tensor,at::Tensor,int,int,int,int);
""",cuda_sources=_C3Q+'\n'+_C3K,functions=['launch_stage1_v481','launch_memset_v481','launch_stage2_v481','launch_pipeline_v481'],extra_cuda_cflags=['-O3','-std=c++17','--offload-arch=gfx950','-mllvm','-amdgpu-early-inline-all=true','-mllvm','-amdgpu-function-calls=false'],verbose=False)
def _rc3(d):
hs,w1r,w2r,w1s,w2s,w1sh,w2sh,w1ss,w2ss,tw,ti,cfg=d
M=cfg['bs'];E=cfg['n_routed_experts']+cfg['n_shared_experts']
dh=cfg['d_hidden_pad'];de=cfg['d_expert_pad'];tk=cfg['total_top_k'];bm=32
k=('c3',M,E,dh,de)
if k not in _B2:
mn=M*tk+E*bm-tk;mm=(mn+bm-1)//bm;mt=mm*bm
_B2[k]=dict(si=torch.zeros(mt,dtype=torch.int32,device='cuda'),sw=torch.zeros(mt,dtype=torch.float32,device='cuda'),se=torch.zeros(mm,dtype=torch.int32,device='cuda'),nv=torch.empty(2,dtype=torch.int32,device='cuda'),mb=torch.empty((M,dh),dtype=torch.bfloat16,device='cuda'),qfp4=torch.empty(M,dh//2,dtype=torch.uint8,device='cuda'),qsc=torch.zeros(M,dh//32,dtype=torch.uint8,device='cuda'),ifp4=torch.zeros(mt,de//2,dtype=torch.uint8,device='cuda'),isc=torch.zeros(mt,de//32,dtype=torch.uint8,device='cuda'),out=torch.zeros(M,dh,dtype=torch.bfloat16,device='cuda'),max_mb=mm)
b=_B2[k];m=_K['c3']
w1u=w1sh.view(torch.uint8);w1su=w1ss.view(dtypes.fp8_e8m0).view(torch.uint8)
w2u=w2sh.view(torch.uint8);w2su=w2ss.view(dtypes.fp8_e8m0).view(torch.uint8)
aiter.moe_sorting_fwd(ti,tw,b['si'],b['sw'],b['se'],b['nv'],b['mb'],E,bm,None,None,0)
m.launch_pipeline_v481(hs,b['qfp4'],b['qsc'],b['out'],w1u,w1su,b['ifp4'],b['isc'],w2u,w2su,b['si'],b['sw'],b['se'],b['nv'],dh,de,M,b['max_mb'])
return b['out'][:,:cfg['d_hidden']]
def _mc4():
so,ic=_asobjs()
_cc('sub_c4_v16')
return load_inline(name='sub_c4_v16',cpp_sources="""
#include <ATen/ATen.h>
void launch_v16(at::Tensor,at::Tensor,at::Tensor,at::Tensor,at::Tensor,at::Tensor,at::Tensor,at::Tensor,at::Tensor,at::Tensor,at::Tensor,at::Tensor,at::Tensor,at::Tensor,at::Tensor,at::Tensor,at::Tensor,int,int,int,int,int);
""",cuda_sources=_C4,functions=['launch_v16'],extra_cuda_cflags=['-O3','-std=c++17','--offload-arch=gfx950','-mllvm','-amdgpu-early-inline-all=true','-mllvm','-amdgpu-function-calls=false'],extra_ldflags=so,extra_include_paths=ic,verbose=False)
def _rc4(d):
hs,w1r,w2r,w1s,w2s,w1sh,w2sh,w1ss,w2ss,tw,ti,cfg=d
M=cfg['bs'];E=cfg['n_routed_experts']+cfg['n_shared_experts']
dh=cfg['d_hidden_pad'];de=cfg['d_expert_pad'];tk=cfg['total_top_k'];bm=32
k=('c4',M,E,dh,de)
if k not in _B2:
mn=M*tk+E*bm-tk;mm=(mn+bm-1)//bm;mt=mm*bm
_B2[k]=dict(si=torch.zeros(mt,dtype=torch.int32,device='cuda'),sw=torch.zeros(mt,dtype=torch.float32,device='cuda'),se=torch.zeros(mm,dtype=torch.int32,device='cuda'),nv=torch.empty(2,dtype=torch.int32,device='cuda'),mb=torch.empty((M,dh),dtype=torch.bfloat16,device='cuda'),af=torch.zeros(M,dh//2,dtype=torch.uint8,device='cuda'),asc=torch.zeros(M,dh//32,dtype=torch.uint8,device='cuda'),ifp4=torch.zeros(mt,de//2,dtype=torch.uint8,device='cuda'),isc=torch.zeros(mt,de//32,dtype=torch.uint8,device='cuda'),out=torch.zeros(M,dh,dtype=torch.float32,device='cuda'))
b=_B2[k];m=_K['c4']
w1u=w1sh.view(torch.uint8);w1su=w1ss.view(dtypes.fp8_e8m0).view(torch.uint8)
w2u=w2sh.view(torch.uint8);w2su=w2ss.view(dtypes.fp8_e8m0).view(torch.uint8)
m.launch_v16(hs,w1u,w1su,w2u,w2su,b['out'],b['af'],b['asc'],b['ifp4'],b['isc'],ti,tw,b['si'],b['sw'],b['se'],b['nv'],b['mb'],dh,de,M,E,bm)
return b['out'][:,:cfg['d_hidden']]
def _mc5():
so,ic=_asobjs()
_cc('sub_c5_b4')
return load_inline(name='sub_c5_b4',cpp_sources="""
#include <ATen/ATen.h>
void launch_everything_gather_fp4(at::Tensor,at::Tensor,at::Tensor,at::Tensor,at::Tensor,at::Tensor,at::Tensor,at::Tensor,at::Tensor,at::Tensor,at::Tensor,at::Tensor,at::Tensor,at::Tensor,at::Tensor,at::Tensor,at::Tensor,int,int,int,int,int);
""",cuda_sources=_C5,functions=['launch_everything_gather_fp4'],extra_cuda_cflags=['-O3','-std=c++17','--offload-arch=gfx950'],extra_ldflags=so,extra_include_paths=ic,verbose=False)
def _rc5(d):
hs,w1r,w2r,w1s,w2s,w1sh,w2sh,w1ss,w2ss,tw,ti,cfg=d
M=cfg['bs'];E=cfg['n_routed_experts']+cfg['n_shared_experts']
dh=cfg['d_hidden_pad'];de=cfg['d_expert_pad'];tk=cfg['total_top_k'];bm=32
k=('c5',M,E,dh,de)
if k not in _B2:
mm=(M*tk+bm-1)//bm+E+E;mt=mm*bm
_B2[k]=dict(si=torch.empty(mt,dtype=torch.int32,device='cuda'),sw=torch.empty(mt,dtype=torch.float32,device='cuda'),se=torch.empty(mm,dtype=torch.int32,device='cuda'),nv=torch.empty(2,dtype=torch.int32,device='cuda'),mb=torch.empty((M,dh),dtype=torch.bfloat16,device='cuda'),af=torch.empty(M,dh//2,dtype=torch.uint8,device='cuda'),asc=torch.empty(M,dh//32,dtype=torch.uint8,device='cuda'),ifp4=torch.empty(mt,de//2,dtype=torch.uint8,device='cuda'),isc=torch.empty(mt,de//32,dtype=torch.uint8,device='cuda'),out=torch.empty(M,dh,dtype=torch.float32,device='cuda'))
b=_B2[k];m=_K['c5']
w1u=w1sh.view(torch.uint8);w1su=w1ss.view(dtypes.fp8_e8m0).view(torch.uint8)
w2u=w2sh.view(torch.uint8);w2su=w2ss.view(dtypes.fp8_e8m0).view(torch.uint8)
m.launch_everything_gather_fp4(hs,w1u,w1su,w2u,w2su,b['out'],b['af'],b['asc'],b['ifp4'],b['isc'],ti,tw,b['si'],b['sw'],b['se'],b['nv'],b['mb'],dh,de,M,E,bm)
return b['out'][:,:cfg['d_hidden']]
def _mc6():
_cc('sub_c6_v1095')
return load_inline(name='sub_c6_v1095',cpp_sources="""
#include <ATen/ATen.h>
void launch_fused_moe_v443(at::Tensor,at::Tensor,at::Tensor,at::Tensor,at::Tensor,at::Tensor,at::Tensor,at::Tensor,at::Tensor,at::Tensor,at::Tensor,at::Tensor,at::Tensor,at::Tensor,at::Tensor,at::Tensor,at::Tensor,at::Tensor,at::Tensor,int,int,int,int,int,int);
""",cuda_sources=_C6,functions=['launch_fused_moe_v443'],extra_cuda_cflags=['-O3','-std=c++17','--offload-arch=gfx950','-mllvm','-amdgpu-early-inline-all=true','-mllvm','-amdgpu-function-calls=false'],verbose=False)
def _rc6(d):
hs,w1r,w2r,w1s,w2s,w1sh,w2sh,w1ss,w2ss,tw,ti,cfg=d
M=cfg['bs'];E=cfg['n_routed_experts']+cfg['n_shared_experts']
dh=cfg['d_hidden_pad'];de=cfg['d_expert_pad'];tk=cfg['total_top_k'];bm=32
k=('c6',M,E,dh,de)
if k not in _B2:
mn=M*tk+E*bm-tk;mm=(mn+bm-1)//bm;mt=mm*bm
_B2[k]=dict(si=torch.empty(mt,dtype=torch.int32,device='cuda'),sw=torch.empty(mt,dtype=torch.float32,device='cuda'),se=torch.empty(mm,dtype=torch.int32,device='cuda'),nv=torch.empty(2,dtype=torch.int32,device='cuda'),mb=torch.empty((M,dh),dtype=torch.bfloat16,device='cuda'),a1fp4=torch.empty(M,dh//2,dtype=torch.uint8,device='cuda'),a1sc=torch.empty(M,dh//32,dtype=torch.uint8,device='cuda'),ifp4=torch.empty(mt,de//2,dtype=torch.uint8,device='cuda'),isc=torch.empty(mt,de//32,dtype=torch.uint8,device='cuda'),out=torch.empty(M,dh,dtype=torch.bfloat16,device='cuda'),tile_out=torch.empty(mt,dh,dtype=torch.bfloat16,device='cuda'),tsr=torch.empty(M,tk,dtype=torch.int32,device='cuda'),tc=torch.empty(M,dtype=torch.int32,device='cuda'))
b=_B2[k];m=_K['c6']
w1u=w1sh.view(torch.uint8);w1su=w1ss.view(dtypes.fp8_e8m0).view(torch.uint8)
w2u=w2sh.view(torch.uint8);w2su=w2ss.view(dtypes.fp8_e8m0).view(torch.uint8)
m.launch_fused_moe_v443(hs,w1u,w1su,w2u,w2su,b['out'],b['a1fp4'],b['a1sc'],b['ifp4'],b['isc'],ti,tw,b['si'],b['sw'],b['se'],b['nv'],b['tile_out'],b['tsr'],b['tc'],dh,de,M,tk,E,bm)
return b['out'][:,:cfg['d_hidden']]
def _mc7():
_cc('sub_c7_v508')
return load_inline(name='sub_c7_v508',cpp_sources="""
#include <ATen/ATen.h>
void launch_fused_moe(at::Tensor,at::Tensor,at::Tensor,at::Tensor,at::Tensor,at::Tensor,at::Tensor,at::Tensor,at::Tensor,at::Tensor,at::Tensor,at::Tensor,at::Tensor,at::Tensor,at::Tensor,at::Tensor,int,int,int,int,int,int);
""",cuda_sources=_C7,functions=['launch_fused_moe'],extra_cuda_cflags=['-O3','-std=c++17','--offload-arch=gfx950','-mllvm','-amdgpu-early-inline-all=true','-mllvm','-amdgpu-function-calls=false'],verbose=False)
def _rc7(d):
hs,w1r,w2r,w1s,w2s,w1sh,w2sh,w1ss,w2ss,tw,ti,cfg=d
M=cfg['bs'];E=cfg['n_routed_experts']+cfg['n_shared_experts']
dh=cfg['d_hidden_pad'];de=cfg['d_expert_pad'];tk=cfg['total_top_k'];bm=128
k=('c7',M,E,dh,de)
if k not in _B2:
mn=M*tk+E*bm-tk;mm=(mn+bm-1)//bm;mt=mm*bm
_B2[k]=dict(si=torch.zeros(mt,dtype=torch.int32,device='cuda'),sw=torch.zeros(mt,dtype=torch.float32,device='cuda'),se=torch.zeros(mm,dtype=torch.int32,device='cuda'),nv=torch.empty(2,dtype=torch.int32,device='cuda'),mb=torch.empty((M,dh),dtype=torch.bfloat16,device='cuda'),af=torch.zeros(M,dh//2,dtype=torch.uint8,device='cuda'),asc=torch.zeros(M,dh//32,dtype=torch.uint8,device='cuda'),ifp4=torch.zeros(mt,de//2,dtype=torch.uint8,device='cuda'),isc=torch.zeros(mt,de//32,dtype=torch.uint8,device='cuda'),out=torch.zeros(M,dh,dtype=torch.bfloat16,device='cuda'))
b=_B2[k];m=_K['c7']
w1u=w1sh.view(torch.uint8);w1su=w1s.view(dtypes.fp8_e8m0).view(torch.uint8)
w2u=w2sh.view(torch.uint8);w2su=w2s.view(dtypes.fp8_e8m0).view(torch.uint8)
m.launch_fused_moe(hs,w1u,w1su,w2u,w2su,b['out'],b['af'],b['asc'],b['ifp4'],b['isc'],b['si'],b['sw'],b['se'],b['nv'],ti,tw,dh,de,M,tk,E,bm)
return b['out'][:,:cfg['d_hidden']]
_CM={'c1':_mc1,'c2':_mc2,'c3':_mc3,'c4':_mc4,'c5':_mc5,'c6':_mc6,'c7':_mc7}
_RM={'c1':_rc1,'c2':_rc2,'c3':_rc3,'c4':_rc4,'c5':_rc5,'c6':_rc6,'c7':_rc7}
_SK={(256,256,16):'c1',(256,256,128):'c2',(256,256,512):'c3',(32,512,16):'c4',(32,512,128):'c5',(32,512,512):'c6',(32,2048,512):'c7'}
def _rck(d):
from aiter import ActivationType,QuantType
from aiter.fused_moe import fused_moe
hs,w1r,w2r,w1s,w2s,w1sh,w2sh,w1ss,w2ss,tw,ti,cfg=d
return fused_moe(hs,w1sh,w2sh,tw,ti,expert_mask=None,activation=ActivationType.Silu,quant_type=QuantType.per_1x32,doweight_stage1=False,w1_scale=w1ss,w2_scale=w2ss,a1_scale=None,a2_scale=None,hidden_pad=cfg['d_hidden_pad']-cfg['d_hidden'],intermediate_pad=cfg['d_expert_pad']-cfg['d_expert'])
_cl=threading.Lock()
def custom_kernel(data:input_t)->output_t:
cfg=data[-1];sk=(cfg['n_routed_experts'],cfg['d_expert'],cfg['bs'])
ck=_SK.get(sk)
if ck is None:return _rck(data)
if ck not in _K:
with _cl:
if ck not in _K:
print(f"[v7] Compiling {ck}...",flush=True);_K[ck]=_CM[ck]();print(f"[v7] {ck} ready.",flush=True)
return _RM[ck](data)
scrolls · 194 lines total
Source code from GPU Mode and the KernelBot dataset · June 9 Researcher Reciprocity License v1.0
Best evidence level for this revision: reported
JSON