File size: 2,076 Bytes
7826761
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
"""Numerical assertions used to validate actual ZeroGPU requests."""
import gc
import torch


def native_probe():
    import nvdiffrast.torch as dr
    from flame_solver import FlameSolverOps, SolverContext
    ops = FlameSolverOps()
    report = []
    for i in range(3):
        ctx = SolverContext.create(ops.extension)
        raster = None
        try:
            j_cpu = torch.tensor([[1., 2., 0.], [0., 1., 3.], [2., 0., 1.], [1., -1., 1.]], dtype=torch.float64)
            r_cpu = torch.tensor([1., -2., 3., .5], dtype=torch.float64)
            h = j_cpu.T @ j_cpu
            expected = torch.linalg.solve(h + torch.diag(.01 * h.diag() + 1e-6), -j_cpu.T @ r_cpu)
            j, r = j_cpu.float().cuda(), r_cpu.float().cuda()
            actual = ops.solve_normal_equation(ctx, j, r, .01)
            torch.testing.assert_close(actual.cpu().double(), expected, rtol=1e-4, atol=1e-5)
            batched = ops.solve_normal_equation(ctx, j[None].repeat(2, 1, 1), r[None].repeat(2, 1), .01)
            torch.testing.assert_close(batched.cpu().double(), expected[None].repeat(2, 1), rtol=1e-4, atol=1e-5)
            raster = dr.RasterizeCudaContext()
            v = torch.tensor([[[-.7, -.7, 0., 1.], [.7, -.7, 0., 1.], [0., .7, 0., 1.]]], device="cuda")
            f = torch.tensor([[0, 1, 2]], device="cuda", dtype=torch.int32)
            rast, _ = dr.rasterize(raster, v, f, resolution=[64, 64])
            count = int((rast[..., 3] > 0).sum().item())
            assert 500 < count < 1500, count
            torch.cuda.synchronize()
            report.append({"iteration": i + 1, "solver_max_error": float((actual.cpu().double() - expected).abs().max()), "raster_pixels": count})
        finally:
            torch.cuda.synchronize()
            ops.extension.destroy_cublas_handle(ctx.cublas_handle)
            ops.extension.destroy_cusolver_handle(ctx.cusolver_handle)
            del raster
            gc.collect()
    return {"passed": True, "gpu": torch.cuda.get_device_name(0), "torch": torch.__version__, "cuda": torch.version.cuda, "tests": report}