2022-08-23 12:47:09 +08:00
|
|
|
import torch
|
|
|
|
from torch.testing import assert_allclose
|
|
|
|
|
2022-08-20 01:46:01 +08:00
|
|
|
import triton
|
|
|
|
import triton.language as tl
|
2022-08-23 12:47:09 +08:00
|
|
|
import triton.runtime as runtime
|
2022-08-20 01:46:01 +08:00
|
|
|
|
|
|
|
|
2022-09-07 03:28:09 +08:00
|
|
|
def vecadd_no_scf_tester(num_warps, block_size):
|
2022-08-20 01:46:01 +08:00
|
|
|
@triton.jit
|
2022-09-07 03:28:09 +08:00
|
|
|
def kernel(x_ptr,
|
|
|
|
y_ptr,
|
|
|
|
z_ptr,
|
2022-08-20 01:46:01 +08:00
|
|
|
BLOCK_SIZE_N: tl.constexpr):
|
|
|
|
pid = tl.program_id(axis=0)
|
|
|
|
offset = pid * BLOCK_SIZE_N + tl.arange(0, BLOCK_SIZE_N)
|
|
|
|
x_ptrs = x_ptr + offset
|
|
|
|
y_ptrs = y_ptr + offset
|
|
|
|
x = tl.load(x_ptrs)
|
|
|
|
y = tl.load(y_ptrs)
|
|
|
|
z = x + y
|
|
|
|
z_ptrs = z_ptr + offset
|
|
|
|
tl.store(z_ptrs, z)
|
|
|
|
|
2022-08-23 12:47:09 +08:00
|
|
|
torch.zeros([10], device=torch.device('cuda'))
|
|
|
|
device = torch.cuda.current_device()
|
2022-09-07 03:28:09 +08:00
|
|
|
binary = runtime.build_kernel(kernel, "*fp32,*fp32,*fp32,i32",
|
|
|
|
constants={"BLOCK_SIZE_N": block_size},
|
|
|
|
num_warps=num_warps,
|
2022-08-23 12:47:09 +08:00
|
|
|
num_stages=3)
|
2022-08-20 01:46:01 +08:00
|
|
|
|
2022-09-07 03:28:09 +08:00
|
|
|
x = torch.randn((block_size,), device='cuda', dtype=torch.float32)
|
|
|
|
y = torch.randn((block_size,), device='cuda', dtype=torch.float32)
|
|
|
|
z = torch.empty((block_size,), device=x.device, dtype=x.dtype)
|
|
|
|
|
|
|
|
assert x.shape.numel() % block_size == 0, "Only test load without mask here"
|
|
|
|
grid = lambda EA: (x.shape.numel() // block_size,)
|
|
|
|
|
|
|
|
runtime.launch_kernel(kernel=binary,
|
2022-08-23 12:47:09 +08:00
|
|
|
grid=grid,
|
2022-09-07 03:28:09 +08:00
|
|
|
device=device,
|
2022-08-23 12:47:09 +08:00
|
|
|
x_ptr=x,
|
|
|
|
y_ptr=y,
|
|
|
|
z_ptr=z,
|
2022-09-07 03:28:09 +08:00
|
|
|
BLOCK_SIZE_N=tl.constexpr(block_size))
|
2022-08-23 12:47:09 +08:00
|
|
|
golden_z = x + y
|
|
|
|
assert_allclose(z, golden_z, rtol=1e-7, atol=1e-7)
|
2022-09-07 03:28:09 +08:00
|
|
|
|
|
|
|
|
|
|
|
def test_vecadd_no_scf():
|
2022-09-18 05:58:42 +08:00
|
|
|
vecadd_no_scf_tester(num_warps=4, block_size=256)
|
2022-09-07 03:28:09 +08:00
|
|
|
vecadd_no_scf_tester(num_warps=2, block_size=256)
|
|
|
|
vecadd_no_scf_tester(num_warps=1, block_size=256)
|
|
|
|
|
|
|
|
|
|
|
|
if __name__ == '__main__':
|
|
|
|
test_vecadd_no_scf()
|