← all workloads

autodiff

n differentiable functions arranged in bounded-depth groups, each group differentiated in both forward and reverse mode, plus a differentiable generic. Stresses the autodiff IR transform (inside linkAndOptimizeIR) and the front-end checking of [Differentiable]. Scales by breadth.

bucket: autodiff  ·  compile mode: target  ·  flags: -target spirv -emit-spirv-directly  ·  default N: 200

Phase composition across releases

Full sub-counter decomposition of compileInner — named leaf timers plus (self) residuals (a parent's time not covered by a named child, e.g. the autodiff transform in linkAndOptimizeIR (self)). Topmost band traces compileInner; hover a band for its phase.

autodiff — full phase breakdown across releases (median ms) autodiff 1.22× 0.0 2202 4403 daily → 25.14 25.15 25.16 25.17 25.18 25.19 25.20 25.21 25.22 25.23 25.24 26.1 26.2 26.3 26.4 26.5 26.7 26.8 26.9 26.10 26.11 06-25 06-26 autodiff — parseTranslationUnit autodiff — SemanticChecking autodiff — generateIR autodiff — frontEndExecute (self) autodiff — specializeModule autodiff — simplifyIR autodiff — linkIR autodiff — unrollLoopsInModule autodiff — legalizeResourceTypes autodiff — legalizeExistentialTypeLayout autodiff — performMandatoryEarlyInlining autodiff — performForceInlining autodiff — linkAndOptimizeIR (self) autodiff — generateOutput (self) autodiff — compileInner (self) phase buckets parseTranslationUnit SemanticChecking generateIR frontEndExecute (self) specializeModule simplifyIR linkIR unrollLoopsInModule legalizeResourceTypes legalizeExistentialTypeLayout performMandatoryEarlyInlining performForceInlining linkAndOptimizeIR (self) emitEntryPointsSourceFromIR generateOutput (self) compileInner (self)

Compiled Slang source

exact compiled source (N = 200); long files show the first 40 lines, the area around computeMain (±40), and the last 40 lines (gaps elided)

autodiff.slang

// AUTO-GENERATED by perf-suite/workloads.py — do not edit by hand.
RWStructuredBuffer<float> outBuf;

[Differentiable]
float leaf(float x) { return x * x + sin(x) * cos(x); }

[Differentiable]
float chain_0(float x) { return leaf(x) * 1.0009 + sin(x) * 0.5 - cos(x) * 0.25; }
[Differentiable]
float chain_1(float x) { return chain_0(x) * 1.0009 + sin(x) * 0.5 - cos(x) * 0.25; }
[Differentiable]
float chain_2(float x) { return chain_1(x) * 1.0009 + sin(x) * 0.5 - cos(x) * 0.25; }
[Differentiable]
float chain_3(float x) { return chain_2(x) * 1.0009 + sin(x) * 0.5 - cos(x) * 0.25; }
[Differentiable]
float chain_4(float x) { return chain_3(x) * 1.0009 + sin(x) * 0.5 - cos(x) * 0.25; }
[Differentiable]
float chain_5(float x) { return chain_4(x) * 1.0009 + sin(x) * 0.5 - cos(x) * 0.25; }
[Differentiable]
float chain_6(float x) { return chain_5(x) * 1.0009 + sin(x) * 0.5 - cos(x) * 0.25; }
[Differentiable]
float chain_7(float x) { return chain_6(x) * 1.0009 + sin(x) * 0.5 - cos(x) * 0.25; }
[Differentiable]
float chain_8(float x) { return leaf(x) * 1.0009 + sin(x) * 0.5 - cos(x) * 0.25; }
[Differentiable]
float chain_9(float x) { return chain_8(x) * 1.0009 + sin(x) * 0.5 - cos(x) * 0.25; }
[Differentiable]
float chain_10(float x) { return chain_9(x) * 1.0009 + sin(x) * 0.5 - cos(x) * 0.25; }
[Differentiable]
float chain_11(float x) { return chain_10(x) * 1.0009 + sin(x) * 0.5 - cos(x) * 0.25; }
[Differentiable]
float chain_12(float x) { return chain_11(x) * 1.0009 + sin(x) * 0.5 - cos(x) * 0.25; }
[Differentiable]
float chain_13(float x) { return chain_12(x) * 1.0009 + sin(x) * 0.5 - cos(x) * 0.25; }
[Differentiable]
float chain_14(float x) { return chain_13(x) * 1.0009 + sin(x) * 0.5 - cos(x) * 0.25; }
[Differentiable]
float chain_15(float x) { return chain_14(x) * 1.0009 + sin(x) * 0.5 - cos(x) * 0.25; }
[Differentiable]
float chain_16(float x) { return leaf(x) * 1.0009 + sin(x) * 0.5 - cos(x) * 0.25; }

// … 332 lines omitted …

[Differentiable]
float chain_183(float x) { return chain_182(x) * 1.0009 + sin(x) * 0.5 - cos(x) * 0.25; }
[Differentiable]
float chain_184(float x) { return leaf(x) * 1.0009 + sin(x) * 0.5 - cos(x) * 0.25; }
[Differentiable]
float chain_185(float x) { return chain_184(x) * 1.0009 + sin(x) * 0.5 - cos(x) * 0.25; }
[Differentiable]
float chain_186(float x) { return chain_185(x) * 1.0009 + sin(x) * 0.5 - cos(x) * 0.25; }
[Differentiable]
float chain_187(float x) { return chain_186(x) * 1.0009 + sin(x) * 0.5 - cos(x) * 0.25; }
[Differentiable]
float chain_188(float x) { return chain_187(x) * 1.0009 + sin(x) * 0.5 - cos(x) * 0.25; }
[Differentiable]
float chain_189(float x) { return chain_188(x) * 1.0009 + sin(x) * 0.5 - cos(x) * 0.25; }
[Differentiable]
float chain_190(float x) { return chain_189(x) * 1.0009 + sin(x) * 0.5 - cos(x) * 0.25; }
[Differentiable]
float chain_191(float x) { return chain_190(x) * 1.0009 + sin(x) * 0.5 - cos(x) * 0.25; }
[Differentiable]
float chain_192(float x) { return leaf(x) * 1.0009 + sin(x) * 0.5 - cos(x) * 0.25; }
[Differentiable]
float chain_193(float x) { return chain_192(x) * 1.0009 + sin(x) * 0.5 - cos(x) * 0.25; }
[Differentiable]
float chain_194(float x) { return chain_193(x) * 1.0009 + sin(x) * 0.5 - cos(x) * 0.25; }
[Differentiable]
float chain_195(float x) { return chain_194(x) * 1.0009 + sin(x) * 0.5 - cos(x) * 0.25; }
[Differentiable]
float chain_196(float x) { return chain_195(x) * 1.0009 + sin(x) * 0.5 - cos(x) * 0.25; }
[Differentiable]
float chain_197(float x) { return chain_196(x) * 1.0009 + sin(x) * 0.5 - cos(x) * 0.25; }
[Differentiable]
float chain_198(float x) { return chain_197(x) * 1.0009 + sin(x) * 0.5 - cos(x) * 0.25; }
[Differentiable]
float chain_199(float x) { return chain_198(x) * 1.0009 + sin(x) * 0.5 - cos(x) * 0.25; }

[Differentiable]
T poly<T : IDifferentiable & IFloat>(T x) { return x * x * x + x; }

[shader("compute")]
[numthreads(1,1,1)]
void computeMain(uint3 tid : SV_DispatchThreadID)
{
    float x = outBuf[tid.x];
    float acc = 0.0;
    { var dp = diffPair(x, 1.0);
      bwd_diff(chain_7)(dp, 1.0); acc += dp.d;
      acc += fwd_diff(chain_7)(diffPair(x, 1.0)).d; }
    { var dp = diffPair(x, 1.0);
      bwd_diff(chain_15)(dp, 1.0); acc += dp.d;
      acc += fwd_diff(chain_15)(diffPair(x, 1.0)).d; }
    { var dp = diffPair(x, 1.0);
      bwd_diff(chain_23)(dp, 1.0); acc += dp.d;
      acc += fwd_diff(chain_23)(diffPair(x, 1.0)).d; }
    { var dp = diffPair(x, 1.0);
      bwd_diff(chain_31)(dp, 1.0); acc += dp.d;
      acc += fwd_diff(chain_31)(diffPair(x, 1.0)).d; }
    { var dp = diffPair(x, 1.0);
      bwd_diff(chain_39)(dp, 1.0); acc += dp.d;
      acc += fwd_diff(chain_39)(diffPair(x, 1.0)).d; }
    { var dp = diffPair(x, 1.0);
      bwd_diff(chain_47)(dp, 1.0); acc += dp.d;
      acc += fwd_diff(chain_47)(diffPair(x, 1.0)).d; }
    { var dp = diffPair(x, 1.0);
      bwd_diff(chain_55)(dp, 1.0); acc += dp.d;
      acc += fwd_diff(chain_55)(diffPair(x, 1.0)).d; }
    { var dp = diffPair(x, 1.0);
      bwd_diff(chain_63)(dp, 1.0); acc += dp.d;
      acc += fwd_diff(chain_63)(diffPair(x, 1.0)).d; }
    { var dp = diffPair(x, 1.0);
      bwd_diff(chain_71)(dp, 1.0); acc += dp.d;
      acc += fwd_diff(chain_71)(diffPair(x, 1.0)).d; }
    { var dp = diffPair(x, 1.0);
      bwd_diff(chain_79)(dp, 1.0); acc += dp.d;
      acc += fwd_diff(chain_79)(diffPair(x, 1.0)).d; }
    { var dp = diffPair(x, 1.0);
      bwd_diff(chain_87)(dp, 1.0); acc += dp.d;
      acc += fwd_diff(chain_87)(diffPair(x, 1.0)).d; }
    { var dp = diffPair(x, 1.0);
      bwd_diff(chain_95)(dp, 1.0); acc += dp.d;
      acc += fwd_diff(chain_95)(diffPair(x, 1.0)).d; }
    { var dp = diffPair(x, 1.0);
      bwd_diff(chain_103)(dp, 1.0); acc += dp.d;
      acc += fwd_diff(chain_103)(diffPair(x, 1.0)).d; }
    { var dp = diffPair(x, 1.0);
      bwd_diff(chain_111)(dp, 1.0); acc += dp.d;
      acc += fwd_diff(chain_111)(diffPair(x, 1.0)).d; }
    { var dp = diffPair(x, 1.0);
      bwd_diff(chain_119)(dp, 1.0); acc += dp.d;
      acc += fwd_diff(chain_119)(diffPair(x, 1.0)).d; }
    { var dp = diffPair(x, 1.0);
      bwd_diff(chain_127)(dp, 1.0); acc += dp.d;
      acc += fwd_diff(chain_127)(diffPair(x, 1.0)).d; }
    { var dp = diffPair(x, 1.0);
      bwd_diff(chain_135)(dp, 1.0); acc += dp.d;
      acc += fwd_diff(chain_135)(diffPair(x, 1.0)).d; }
    { var dp = diffPair(x, 1.0);
      bwd_diff(chain_143)(dp, 1.0); acc += dp.d;
      acc += fwd_diff(chain_143)(diffPair(x, 1.0)).d; }
    { var dp = diffPair(x, 1.0);
      bwd_diff(chain_151)(dp, 1.0); acc += dp.d;
      acc += fwd_diff(chain_151)(diffPair(x, 1.0)).d; }
    { var dp = diffPair(x, 1.0);
      bwd_diff(chain_159)(dp, 1.0); acc += dp.d;
      acc += fwd_diff(chain_159)(diffPair(x, 1.0)).d; }
    { var dp = diffPair(x, 1.0);
      bwd_diff(chain_167)(dp, 1.0); acc += dp.d;
      acc += fwd_diff(chain_167)(diffPair(x, 1.0)).d; }
    { var dp = diffPair(x, 1.0);
      bwd_diff(chain_175)(dp, 1.0); acc += dp.d;
      acc += fwd_diff(chain_175)(diffPair(x, 1.0)).d; }
    { var dp = diffPair(x, 1.0);
      bwd_diff(chain_183)(dp, 1.0); acc += dp.d;
      acc += fwd_diff(chain_183)(diffPair(x, 1.0)).d; }
    { var dp = diffPair(x, 1.0);
      bwd_diff(chain_191)(dp, 1.0); acc += dp.d;
      acc += fwd_diff(chain_191)(diffPair(x, 1.0)).d; }
    { var dp = diffPair(x, 1.0);
      bwd_diff(chain_199)(dp, 1.0); acc += dp.d;
      acc += fwd_diff(chain_199)(diffPair(x, 1.0)).d; }
    acc += fwd_diff(poly<float>)(diffPair(x, 1.0)).d;
    outBuf[0] = acc;
}