yum-mirror/slang

Making it easier to work with shaders

git clone https://git.yummers.dev/yum-mirror/slang

Harsh Aggarwal (NVIDIA)Fix 7723 - Add autodiff tests (#7919)d10732742

master
3.6 KiB109 linesraw
1//TEST(compute, vulkan):COMPARE_COMPUTE_EX:-vk -compute -shaderobj -output-using-type
2//TEST(compute):COMPARE_COMPUTE_EX:-slang -compute -shaderobj -output-using-type
3//TEST(compute):COMPARE_COMPUTE_EX:-wgpu -compute -output-using-type
4//TEST(compute):COMPARE_COMPUTE_EX:-cuda -compute -shaderobj -output-using-type
5
6//TEST_INPUT:ubuffer(data=[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0], stride=4):out,name=outputBuffer
7RWStructuredBuffer<float> outputBuffer;
8
9typedef DifferentialPair<float> dpfloat;
10typedef DifferentialPair<float2> dpfloat2;
11
12[BackwardDifferentiable]
13float diffCopysign(float x, float y)
14{
15    return copysign(x, y);
16}
17
18[BackwardDifferentiable]
19float2 diffCopysign(float2 x, float2 y)
20{
21    return copysign(x, y);
22}
23
24[numthreads(1, 1, 1)]
25void computeMain(uint3 dispatchThreadID: SV_DispatchThreadID)
26{
27    // Test 1: forward diff copysign(3.0, -1.0) with dx=2.0, dy=1.0
28    {
29        dpfloat dpx = dpfloat(3.0, 2.0);
30        dpfloat dpy = dpfloat(-1.0, 1.0);
31        dpfloat res = __fwd_diff(diffCopysign)(dpx, dpy);
32        outputBuffer[0] = res.p;               
33        outputBuffer[1] = res.d;
34    }
35
36    // Test 2: forward diff copysign(-2.0, 4.0) with dx=1.5, dy=-0.5
37    {
38        dpfloat dpx = dpfloat(-2.0, 1.5);
39        dpfloat dpy = dpfloat(4.0, -0.5);
40        dpfloat res = __fwd_diff(diffCopysign)(dpx, dpy);
41        outputBuffer[2] = res.p;               
42        outputBuffer[3] = res.d;
43    }
44
45    // Test 3: forward diff copysign(0.0, -1.0) with dx=3.0, dy=2.0
46    {
47        dpfloat dpx = dpfloat(0.0, 3.0);
48        dpfloat dpy = dpfloat(-1.0, 2.0);
49        dpfloat res = __fwd_diff(diffCopysign)(dpx, dpy);
50        outputBuffer[4] = res.p;               
51        outputBuffer[5] = res.d;
52    }
53
54    // Test 4: vector forward diff
55    {
56        dpfloat2 dpx = dpfloat2(float2(5.0, -3.0), float2(1.0, 2.0));
57        dpfloat2 dpy = dpfloat2(float2(-2.0, 4.0), float2(0.5, -1.0));
58        dpfloat2 res = __fwd_diff(diffCopysign)(dpx, dpy);
59        outputBuffer[6] = res.p[0];            
60        outputBuffer[7] = res.d[0];            
61        outputBuffer[8] = res.p[1];            
62        outputBuffer[9] = res.d[1];
63    }
64
65    // Test 5: backward diff copysign(4.0, -2.0)
66    {
67        dpfloat dpx = dpfloat(4.0, 0.0);
68        dpfloat dpy = dpfloat(-2.0, 0.0);
69        __bwd_diff(diffCopysign)(dpx, dpy, 1.0);
70        outputBuffer[10] = dpx.d;              
71        outputBuffer[11] = dpy.d;
72    }
73
74    // Test 6: backward diff copysign(-3.0, 5.0)  
75    {
76        dpfloat dpx = dpfloat(-3.0, 0.0);
77        dpfloat dpy = dpfloat(5.0, 0.0);
78        __bwd_diff(diffCopysign)(dpx, dpy, 2.0);
79        outputBuffer[12] = dpx.d;              
80        outputBuffer[13] = dpy.d;
81    }
82
83    // Test 7: copysign with y=0 - derivative should be 0
84    {
85        dpfloat dpx = dpfloat(3.0, 2.0);
86        dpfloat dpy = dpfloat(0.0, 1.0);
87        dpfloat res = __fwd_diff(diffCopysign)(dpx, dpy);
88        outputBuffer[14] = res.p;               
89        outputBuffer[15] = res.d;
90    }
91
92    // Test 8: copysign with x=0 - derivative should be 0
93    {
94        dpfloat dpx = dpfloat(0.0, 2.0);
95        dpfloat dpy = dpfloat(-1.0, 1.0);
96        dpfloat res = __fwd_diff(diffCopysign)(dpx, dpy);
97        outputBuffer[16] = res.p;               
98        outputBuffer[17] = res.d;
99    }
100
101    // Test 9: vector backward diff
102    {
103        dpfloat2 dpx = dpfloat2(float2(2.0, -1.0), float2(0.0, 0.0));
104        dpfloat2 dpy = dpfloat2(float2(-3.0, 4.0), float2(0.0, 0.0));
105        __bwd_diff(diffCopysign)(dpx, dpy, float2(1.0, 3.0));
106        outputBuffer[18] = dpx.d[0];           
107        outputBuffer[19] = dpx.d[1];           
108    }
109}