From 66e202c9ff31044f7625f2c5accea8f1b2575f47 Mon Sep 17 00:00:00 2001 From: Ivan Pavlovic Date: Fri, 1 Sep 2023 18:56:46 +0200 Subject: [PATCH 1/4] Clean up the way matrix.os is setup and matched. - Backported 350c346e0dbef50d0ce8e734a81956389196f4ab --- .github/workflows/ci.yml | 14 +++----------- 1 file changed, 3 insertions(+), 11 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 534ccfb41..5b75874ee 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -116,7 +116,7 @@ jobs: ) ) && os+=("macos-latest") - [ "${{ steps.is-fork.outputs.fork }}" == "false" ] && os+=("cuda-${{ github.run_id }}-${{ github.run_attempt }}") + [ "${{ steps.is-fork.outputs.fork }}" == "false" ] && os+=("cuda") echo "os=$(jq -cn '$ARGS.positional' --args ${os[@]})" >> $GITHUB_OUTPUT outputs: @@ -162,7 +162,7 @@ jobs: library: ILGPU.Algorithms framework: net471 fail-fast: false - runs-on: ${{ contains(matrix.os, 'cuda') && format('{0}-{1}-{2}', matrix.os, matrix.library, matrix.framework) || matrix.os }} + runs-on: ${{ matrix.os }} steps: - name: Checkout uses: actions/checkout@v3 @@ -170,38 +170,30 @@ jobs: - name: Setup the latest .NET Core 3.1 SDK if: matrix.framework == 'netcoreapp3.1' uses: actions/setup-dotnet@v3.2.0 - env: - DOTNET_INSTALL_DIR: ${{ matrix.framework == 'cuda' && '~/.' }} with: dotnet-version: 3.1.x - name: Setup the latest .NET 5 SDK if: matrix.framework == 'net5.0' uses: actions/setup-dotnet@v3.2.0 - env: - DOTNET_INSTALL_DIR: ${{ matrix.framework == 'cuda' && '~/.' }} with: dotnet-version: 5.0.x - name: Setup the latest .NET 6 SDK if: matrix.framework == 'net6.0' uses: actions/setup-dotnet@v3.2.0 - env: - DOTNET_INSTALL_DIR: ${{ matrix.framework == 'cuda' && '~/.' }} with: dotnet-version: 6.0.x - name: Setup the latest .NET 7 SDK uses: actions/setup-dotnet@v3.2.0 - env: - DOTNET_INSTALL_DIR: ${{ matrix.framework == 'cuda' && '~/.' }} with: dotnet-version: 7.0.x - name: Set test flavor id: test-flavor shell: bash - run: echo "flavor=$([[ "${{ matrix.os }}" == cuda-* ]] && echo "Cuda" || echo "CPU")" >> $GITHUB_OUTPUT + run: echo "flavor=$([[ "${{ matrix.os }}" == cuda ]] && echo "Cuda" || echo "CPU")" >> $GITHUB_OUTPUT - name: Build and test run: dotnet test Src/${{ matrix.library }}.Tests.${{ steps.test-flavor.outputs.flavor }} --configuration=Release --framework=${{ matrix.framework }} -p:TreatWarningsAsErrors=true From ac8846d69cb8de2c69f0716302fd129628a3d268 Mon Sep 17 00:00:00 2001 From: Jonathan Giannuzzi Date: Mon, 4 Sep 2023 23:14:30 +0100 Subject: [PATCH 2/4] Create "All required checks succeeded" check run. - Backported 46957a5b0a445b04c2172f8530b22acc5787691f --- .github/workflows/check-required.yml | 60 ++++++++++++++++++++++++++++ .github/workflows/ci.yml | 3 ++ .github/workflows/deploy-site.yml | 5 +++ 3 files changed, 68 insertions(+) create mode 100644 .github/workflows/check-required.yml diff --git a/.github/workflows/check-required.yml b/.github/workflows/check-required.yml new file mode 100644 index 000000000..f9c24b4c5 --- /dev/null +++ b/.github/workflows/check-required.yml @@ -0,0 +1,60 @@ +name: Check required jobs + +# This workflow is triggered when a workflow run for the CI is completed. +# It checks if the "All required checks done" job was actually successful +# (and not just skipped) and creates a check run if that is the case. The +# check run can be used to protect the main branch from being merged if the +# CI is not passing. + +on: + workflow_run: + types: [completed] + workflows: + - CI + - Deploy Site with Jekyll, GitHub Pages + +permissions: + actions: read + checks: write + +jobs: + required-jobs: + name: Check required jobs + runs-on: ubuntu-latest + steps: + - uses: actions/github-script@v6 + with: + script: | + // list jobs for worklow run attempt + const { data: { jobs } } = await github.rest.actions.listJobsForWorkflowRunAttempt({ + owner: context.payload.repository.owner.login, + repo: context.payload.repository.name, + run_id: context.payload.workflow_run.id, + attempt_number: context.payload.workflow_run.run_attempt, + }); + // check if required job was successful + var success = false; + core.info(`Checking jobs for workflow run ${context.payload.workflow_run.html_url}`); + jobs.forEach(job => { + var mark = '-' + if (job.name === 'All required checks done' && job.conclusion === 'success') { + success = true; + mark = '✅'; + } + core.info(`${mark} ${job.name}: ${job.conclusion}`); + }); + // create check run if job was successful + if (success) { + await github.rest.checks.create({ + owner: context.payload.repository.owner.login, + repo: context.payload.repository.name, + name: 'All required checks succeeded', + head_sha: context.payload.workflow_run.head_sha, + status: 'completed', + conclusion: 'success', + output: { + title: 'All required checks succeeded', + summary: `See [workflow run](${context.payload.workflow_run.html_url}) for details.`, + }, + }); + } diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 5b75874ee..0b2fc2f1f 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -333,6 +333,9 @@ jobs: # Virtual job that can be configured as a required check before a PR can be # merged. + # As GitHub considers a check as successful if it is skipped, we need to + # check its status in another workflow (check-required.yml) and create a + # check there. all-required-checks-done: needs: - check-style diff --git a/.github/workflows/deploy-site.yml b/.github/workflows/deploy-site.yml index 2b92b1490..bc06408f4 100644 --- a/.github/workflows/deploy-site.yml +++ b/.github/workflows/deploy-site.yml @@ -77,6 +77,11 @@ jobs: uses: actions/upload-pages-artifact@v2 ##### GitHub Pages ##### + # Virtual job that can be configured as a required check before a PR can be + # merged. + # As GitHub considers a check as successful if it is skipped, we need to + # check its status in another workflow (check-required.yml) and create a + # check there. all-required-checks-done: needs: - build From cdc57494606d052f967d1ef996b16fbbf07017c2 Mon Sep 17 00:00:00 2001 From: MoFtZ Date: Mon, 11 Sep 2023 10:11:51 +1000 Subject: [PATCH 3/4] Modified OpenCL generator to forward declare all variables. - Backported 8a8f82599d04c22a95cb0fdbf0f38ca7dff207e5 --- .../OpenCL/CLCodeGenerator.Emitter.cs | 63 ++++++++++++++++--- Src/ILGPU/Backends/OpenCL/CLCodeGenerator.cs | 12 +++- .../Backends/OpenCL/CLFunctionGenerator.cs | 6 +- .../OpenCL/CLKernelFunctionGenerator.cs | 6 +- 4 files changed, 70 insertions(+), 17 deletions(-) diff --git a/Src/ILGPU/Backends/OpenCL/CLCodeGenerator.Emitter.cs b/Src/ILGPU/Backends/OpenCL/CLCodeGenerator.Emitter.cs index 5fa76fb1a..84556d963 100644 --- a/Src/ILGPU/Backends/OpenCL/CLCodeGenerator.Emitter.cs +++ b/Src/ILGPU/Backends/OpenCL/CLCodeGenerator.Emitter.cs @@ -47,6 +47,7 @@ public struct StatementEmitter : IDisposable #region Instance private readonly StringBuilder stringBuilder; + private readonly StringBuilder variableBuilder; private bool argMode; private int argumentCount; @@ -58,6 +59,7 @@ internal StatementEmitter(CLCodeGenerator codeGenerator) { CodeGenerator = codeGenerator; stringBuilder = codeGenerator.Builder; + variableBuilder = codeGenerator.VariableBuilder; argumentCount = 0; argMode = false; @@ -85,11 +87,7 @@ internal StatementEmitter(CLCodeGenerator codeGenerator) private void BeginAppendTarget(Variable target, bool appendNew = true) { if (appendNew) - { - var variableType = CodeGenerator.GetVariableType(target); - stringBuilder.Append(variableType); - stringBuilder.Append(' '); - } + AppendDeclaration(target); stringBuilder.Append(target.ToString()); } @@ -97,8 +95,15 @@ private void BeginAppendTarget(Variable target, bool appendNew = true) /// Appends a target declaration. /// /// The target declaration. - internal void AppendDeclaration(Variable target) => - BeginAppendTarget(target); + internal void AppendDeclaration(Variable target) + { + var variableType = CodeGenerator.GetVariableType(target); + variableBuilder.Append('\t'); + variableBuilder.Append(variableType); + variableBuilder.Append(' '); + variableBuilder.Append(target.ToString()); + variableBuilder.AppendLine(";"); + } /// /// Appends a target. @@ -828,6 +833,50 @@ public StatementEmitter BeginStatement(FormattableString command) return emitter; } + /// + /// Begins the function body, switching to variable capturing mode. + /// + protected void BeginFunctionBody() + { + // Start the function body. + Builder.AppendLine("{"); + PushIndent(); + +#if DEBUG + Builder.AppendLine(); + Builder.AppendLine("\t// Variable declarations"); + Builder.AppendLine(); +#endif + + // Switch to the alternate builder, so that we can capture the code and + // variable declarations separately. + prefixBuilder = Builder; + Builder = suffixBuilder; + } + + /// + /// Finishes the function body, ending variable capturing mode. + /// + protected void FinishFunctionBody() + { + // Restore the original builder, containing code before the variable + // declarations. + Builder = prefixBuilder; + + // Add the variable declarations at the start of the function, to avoid + // issues with OpenCL compilers that are not C99 compliant, and cannot + // handle variable declarations intermingled with other code. + Builder.Append(VariableBuilder); + Builder.AppendLine(); + + // Add the code that was generated along with the variable declarations. + Builder.Append(suffixBuilder); + + // Close the function body. + PopIndent(); + Builder.AppendLine("}"); + } + #endregion } } diff --git a/Src/ILGPU/Backends/OpenCL/CLCodeGenerator.cs b/Src/ILGPU/Backends/OpenCL/CLCodeGenerator.cs index 6c8273db8..14d8d987b 100644 --- a/Src/ILGPU/Backends/OpenCL/CLCodeGenerator.cs +++ b/Src/ILGPU/Backends/OpenCL/CLCodeGenerator.cs @@ -279,6 +279,9 @@ protected static string GetParameterName(Parameter parameter) => new Dictionary(); private readonly string labelPrefix; + private StringBuilder prefixBuilder = new StringBuilder(); + private StringBuilder suffixBuilder = new StringBuilder(); + /// /// Constructs a new code generator. /// @@ -295,7 +298,7 @@ internal CLCodeGenerator(in GeneratorArgs args, Method method, Allocas allocas) labelPrefix = "L_" + Method.Id.ToString(); - Builder = new StringBuilder(); + Builder = prefixBuilder; } #endregion @@ -327,7 +330,12 @@ public IntrinsicImplementationProvider /// /// Returns the associated string builder. /// - public StringBuilder Builder { get; } + public StringBuilder Builder { get; private set; } + + /// + /// Returns the associated string builder. + /// + public StringBuilder VariableBuilder { get; } = new StringBuilder(); #endregion diff --git a/Src/ILGPU/Backends/OpenCL/CLFunctionGenerator.cs b/Src/ILGPU/Backends/OpenCL/CLFunctionGenerator.cs index 9b46a7d11..3bb044f93 100644 --- a/Src/ILGPU/Backends/OpenCL/CLFunctionGenerator.cs +++ b/Src/ILGPU/Backends/OpenCL/CLFunctionGenerator.cs @@ -132,11 +132,9 @@ public override void GenerateCode() BindSharedMemoryAllocation(Allocas.DynamicSharedAllocations); // Generate code - Builder.AppendLine("{"); - PushIndent(); + BeginFunctionBody(); GenerateCodeInternal(); - PopIndent(); - Builder.AppendLine("}"); + FinishFunctionBody(); } #endregion diff --git a/Src/ILGPU/Backends/OpenCL/CLKernelFunctionGenerator.cs b/Src/ILGPU/Backends/OpenCL/CLKernelFunctionGenerator.cs index 7257df58d..95d0ab5a4 100644 --- a/Src/ILGPU/Backends/OpenCL/CLKernelFunctionGenerator.cs +++ b/Src/ILGPU/Backends/OpenCL/CLKernelFunctionGenerator.cs @@ -262,8 +262,7 @@ public override void GenerateCode() Builder.AppendLine(")"); // Emit code that moves view arguments into their appropriate targets - Builder.AppendLine("{"); - PushIndent(); + BeginFunctionBody(); GenerateArgumentMapping(); // Emit index computation @@ -323,8 +322,7 @@ public override void GenerateCode() // Generate code GenerateCodeInternal(); - PopIndent(); - Builder.AppendLine("}"); + FinishFunctionBody(); } /// From a99d31e9aed4ca36a79d96a5785435b7f113d029 Mon Sep 17 00:00:00 2001 From: Marcel Koester Date: Tue, 5 Sep 2023 12:05:18 +0200 Subject: [PATCH 4/4] Refined PTX argument mapping and analyses. - Backported d1758bb56859806f665b3afb553f60cf7c5242f0 --- .../PTX/Analyses/DefaultPTXBlockSchedule.cs | 6 +- .../PTX/Analyses/OptimizedPTXBlockSchedule.cs | 42 +-- .../Backends/PTX/Analyses/PTXBlockSchedule.cs | 6 +- Src/ILGPU/Backends/PTX/PTXArgumentMapper.cs | 4 +- Src/ILGPU/Backends/PTX/PTXCodeGenerator.cs | 2 +- .../PTX/Transformations/PTXBlockScheduling.cs | 4 +- Src/ILGPU/CompatibilitySuppressions.xml | 249 ++++++++++++++++++ 7 files changed, 265 insertions(+), 48 deletions(-) create mode 100644 Src/ILGPU/CompatibilitySuppressions.xml diff --git a/Src/ILGPU/Backends/PTX/Analyses/DefaultPTXBlockSchedule.cs b/Src/ILGPU/Backends/PTX/Analyses/DefaultPTXBlockSchedule.cs index 43743afa4..3b7432930 100644 --- a/Src/ILGPU/Backends/PTX/Analyses/DefaultPTXBlockSchedule.cs +++ b/Src/ILGPU/Backends/PTX/Analyses/DefaultPTXBlockSchedule.cs @@ -1,6 +1,6 @@ // --------------------------------------------------------------------------------------- // ILGPU -// Copyright (c) 2020-2021 ILGPU Project +// Copyright (c) 2020-2023 ILGPU Project // www.ilgpu.net // // File: DefaultPTXBlockSchedule.cs @@ -18,7 +18,7 @@ namespace ILGPU.Backends.PTX.Analyses /// /// Represents a default PTX-specific block schedule. /// - public sealed class DefaultPTXBlockSchedule : + sealed class DefaultPTXBlockSchedule : PTXBlockSchedule { #region Instance @@ -53,7 +53,7 @@ public override bool IsImplicitSuccessor( #endregion } - public partial class PTXBlockScheduleExtensions + partial class PTXBlockScheduleExtensions { /// /// Creates a new default block schedule using the given blocks. diff --git a/Src/ILGPU/Backends/PTX/Analyses/OptimizedPTXBlockSchedule.cs b/Src/ILGPU/Backends/PTX/Analyses/OptimizedPTXBlockSchedule.cs index 5f26eb4e0..946f76336 100644 --- a/Src/ILGPU/Backends/PTX/Analyses/OptimizedPTXBlockSchedule.cs +++ b/Src/ILGPU/Backends/PTX/Analyses/OptimizedPTXBlockSchedule.cs @@ -1,6 +1,6 @@ // --------------------------------------------------------------------------------------- // ILGPU -// Copyright (c) 2020-2021 ILGPU Project +// Copyright (c) 2020-2023 ILGPU Project // www.ilgpu.net // // File: OptimizedPTXBlockSchedule.cs @@ -24,41 +24,11 @@ namespace ILGPU.Backends.PTX.Analyses /// /// The current order. /// The control-flow direction. - public sealed class OptimizedPTXBlockSchedule : + class OptimizedPTXBlockSchedule : PTXBlockSchedule where TOrder : struct, ITraversalOrder where TDirection : struct, IControlFlowDirection { - #region Nested Types - - /// - /// A specific successor provider that inverts the successors of all - /// terminators. - /// - private readonly struct SuccessorProvider : - ITraversalSuccessorsProvider - { - /// - /// Returns all successors in the default order except for - /// terminators. The successors of these terminators - /// will be reversed to invert all if branch targets. - /// - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public readonly ReadOnlySpan GetSuccessors(BasicBlock basicBlock) - { - var successors = basicBlock.Successors; - if (basicBlock.Terminator is IfBranch ifBranch && ifBranch.IsInverted) - { - var tempList = successors.ToInlineList(); - tempList.Reverse(); - successors = tempList; - } - return successors; - } - } - - #endregion - #region Instance /// @@ -135,7 +105,7 @@ public override bool NeedBranchTarget(BasicBlock block) #endregion } - public partial class PTXBlockScheduleExtensions + partial class PTXBlockScheduleExtensions { #region Nested Types @@ -143,16 +113,14 @@ public partial class PTXBlockScheduleExtensions /// A specific successor provider that inverts the successors of all /// terminators. /// - private readonly struct SuccessorProvider : - ITraversalSuccessorsProvider + private readonly struct SuccessorProvider : ITraversalSuccessorsProvider { /// /// Returns all successors in the default order except for /// terminators. The successors of these terminators /// will be reversed to invert all if branch targets. /// - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public readonly ReadOnlySpan GetSuccessors(BasicBlock basicBlock) + public ReadOnlySpan GetSuccessors(BasicBlock basicBlock) { var successors = basicBlock.Successors; if (basicBlock.Terminator is IfBranch ifBranch && ifBranch.IsInverted) diff --git a/Src/ILGPU/Backends/PTX/Analyses/PTXBlockSchedule.cs b/Src/ILGPU/Backends/PTX/Analyses/PTXBlockSchedule.cs index 02e7b598b..faf6baa71 100644 --- a/Src/ILGPU/Backends/PTX/Analyses/PTXBlockSchedule.cs +++ b/Src/ILGPU/Backends/PTX/Analyses/PTXBlockSchedule.cs @@ -19,7 +19,7 @@ namespace ILGPU.Backends.PTX.Analyses /// /// Represents a PTX-specific block schedule. /// - public abstract class PTXBlockSchedule + abstract class PTXBlockSchedule { #region Instance @@ -96,7 +96,7 @@ public ImmutableArray.Enumerator GetEnumerator() => /// /// The current order. /// The control-flow direction. - public abstract class PTXBlockSchedule : PTXBlockSchedule + abstract class PTXBlockSchedule : PTXBlockSchedule where TOrder : struct, ITraversalOrder where TDirection : struct, IControlFlowDirection { @@ -140,5 +140,5 @@ public override PhiBindings ComputePhiBindings( /// /// Extensions methods for the class. /// - public static partial class PTXBlockScheduleExtensions { } + static partial class PTXBlockScheduleExtensions { } } diff --git a/Src/ILGPU/Backends/PTX/PTXArgumentMapper.cs b/Src/ILGPU/Backends/PTX/PTXArgumentMapper.cs index e22b9d294..12dbeca3c 100644 --- a/Src/ILGPU/Backends/PTX/PTXArgumentMapper.cs +++ b/Src/ILGPU/Backends/PTX/PTXArgumentMapper.cs @@ -1,6 +1,6 @@ // --------------------------------------------------------------------------------------- // ILGPU -// Copyright (c) 2018-2021 ILGPU Project +// Copyright (c) 2018-2023 ILGPU Project // www.ilgpu.net // // File: PTXArgumentMapper.cs @@ -22,7 +22,7 @@ namespace ILGPU.Backends.PTX /// Constructs mappings for PTX kernels. /// /// Members of this class are not thread safe. - public sealed class PTXArgumentMapper : ViewArgumentMapper + public class PTXArgumentMapper : ViewArgumentMapper { #region Nested Types diff --git a/Src/ILGPU/Backends/PTX/PTXCodeGenerator.cs b/Src/ILGPU/Backends/PTX/PTXCodeGenerator.cs index bd9436f9e..4b1713178 100644 --- a/Src/ILGPU/Backends/PTX/PTXCodeGenerator.cs +++ b/Src/ILGPU/Backends/PTX/PTXCodeGenerator.cs @@ -418,7 +418,7 @@ public IntrinsicImplementationProvider /// /// Returns all blocks in an appropriate schedule. /// - public PTXBlockSchedule Schedule { get; } + internal PTXBlockSchedule Schedule { get; } #endregion diff --git a/Src/ILGPU/Backends/PTX/Transformations/PTXBlockScheduling.cs b/Src/ILGPU/Backends/PTX/Transformations/PTXBlockScheduling.cs index b45abdfe7..dd2770859 100644 --- a/Src/ILGPU/Backends/PTX/Transformations/PTXBlockScheduling.cs +++ b/Src/ILGPU/Backends/PTX/Transformations/PTXBlockScheduling.cs @@ -1,6 +1,6 @@ // --------------------------------------------------------------------------------------- // ILGPU -// Copyright (c) 2020-2021 ILGPU Project +// Copyright (c) 2020-2023 ILGPU Project // www.ilgpu.net // // File: PTXBlockScheduling.cs @@ -20,7 +20,7 @@ namespace ILGPU.Backends.PTX.Transformations /// Adapts the actual block branch order in a way to avoid negated predicated /// branches and which maximizes the number of implicit block branches. /// - public sealed class PTXBlockScheduling : UnorderedTransformation + sealed class PTXBlockScheduling : UnorderedTransformation { /// /// Applies the PTX-specific block schedule to the given builder. diff --git a/Src/ILGPU/CompatibilitySuppressions.xml b/Src/ILGPU/CompatibilitySuppressions.xml new file mode 100644 index 000000000..152f4b6a3 --- /dev/null +++ b/Src/ILGPU/CompatibilitySuppressions.xml @@ -0,0 +1,249 @@ + + + + + CP0001 + T:ILGPU.Backends.PTX.Analyses.DefaultPTXBlockSchedule + lib/net471/ILGPU.dll + lib/net471/ILGPU.dll + true + + + CP0001 + T:ILGPU.Backends.PTX.Analyses.OptimizedPTXBlockSchedule`2 + lib/net471/ILGPU.dll + lib/net471/ILGPU.dll + true + + + CP0001 + T:ILGPU.Backends.PTX.Analyses.PTXBlockSchedule + lib/net471/ILGPU.dll + lib/net471/ILGPU.dll + true + + + CP0001 + T:ILGPU.Backends.PTX.Analyses.PTXBlockSchedule`2 + lib/net471/ILGPU.dll + lib/net471/ILGPU.dll + true + + + CP0001 + T:ILGPU.Backends.PTX.Analyses.PTXBlockScheduleExtensions + lib/net471/ILGPU.dll + lib/net471/ILGPU.dll + true + + + CP0001 + T:ILGPU.Backends.PTX.Transformations.PTXBlockScheduling + lib/net471/ILGPU.dll + lib/net471/ILGPU.dll + true + + + CP0001 + T:ILGPU.Backends.PTX.Analyses.DefaultPTXBlockSchedule + lib/net5.0/ILGPU.dll + lib/net5.0/ILGPU.dll + true + + + CP0001 + T:ILGPU.Backends.PTX.Analyses.OptimizedPTXBlockSchedule`2 + lib/net5.0/ILGPU.dll + lib/net5.0/ILGPU.dll + true + + + CP0001 + T:ILGPU.Backends.PTX.Analyses.PTXBlockSchedule + lib/net5.0/ILGPU.dll + lib/net5.0/ILGPU.dll + true + + + CP0001 + T:ILGPU.Backends.PTX.Analyses.PTXBlockSchedule`2 + lib/net5.0/ILGPU.dll + lib/net5.0/ILGPU.dll + true + + + CP0001 + T:ILGPU.Backends.PTX.Analyses.PTXBlockScheduleExtensions + lib/net5.0/ILGPU.dll + lib/net5.0/ILGPU.dll + true + + + CP0001 + T:ILGPU.Backends.PTX.Transformations.PTXBlockScheduling + lib/net5.0/ILGPU.dll + lib/net5.0/ILGPU.dll + true + + + CP0001 + T:ILGPU.Backends.PTX.Analyses.DefaultPTXBlockSchedule + lib/net6.0/ILGPU.dll + lib/net6.0/ILGPU.dll + true + + + CP0001 + T:ILGPU.Backends.PTX.Analyses.OptimizedPTXBlockSchedule`2 + lib/net6.0/ILGPU.dll + lib/net6.0/ILGPU.dll + true + + + CP0001 + T:ILGPU.Backends.PTX.Analyses.PTXBlockSchedule + lib/net6.0/ILGPU.dll + lib/net6.0/ILGPU.dll + true + + + CP0001 + T:ILGPU.Backends.PTX.Analyses.PTXBlockSchedule`2 + lib/net6.0/ILGPU.dll + lib/net6.0/ILGPU.dll + true + + + CP0001 + T:ILGPU.Backends.PTX.Analyses.PTXBlockScheduleExtensions + lib/net6.0/ILGPU.dll + lib/net6.0/ILGPU.dll + true + + + CP0001 + T:ILGPU.Backends.PTX.Transformations.PTXBlockScheduling + lib/net6.0/ILGPU.dll + lib/net6.0/ILGPU.dll + true + + + CP0001 + T:ILGPU.Backends.PTX.Analyses.DefaultPTXBlockSchedule + lib/net7.0/ILGPU.dll + lib/net7.0/ILGPU.dll + true + + + CP0001 + T:ILGPU.Backends.PTX.Analyses.OptimizedPTXBlockSchedule`2 + lib/net7.0/ILGPU.dll + lib/net7.0/ILGPU.dll + true + + + CP0001 + T:ILGPU.Backends.PTX.Analyses.PTXBlockSchedule + lib/net7.0/ILGPU.dll + lib/net7.0/ILGPU.dll + true + + + CP0001 + T:ILGPU.Backends.PTX.Analyses.PTXBlockSchedule`2 + lib/net7.0/ILGPU.dll + lib/net7.0/ILGPU.dll + true + + + CP0001 + T:ILGPU.Backends.PTX.Analyses.PTXBlockScheduleExtensions + lib/net7.0/ILGPU.dll + lib/net7.0/ILGPU.dll + true + + + CP0001 + T:ILGPU.Backends.PTX.Transformations.PTXBlockScheduling + lib/net7.0/ILGPU.dll + lib/net7.0/ILGPU.dll + true + + + CP0001 + T:ILGPU.Backends.PTX.Analyses.DefaultPTXBlockSchedule + lib/netstandard2.1/ILGPU.dll + lib/netstandard2.1/ILGPU.dll + true + + + CP0001 + T:ILGPU.Backends.PTX.Analyses.OptimizedPTXBlockSchedule`2 + lib/netstandard2.1/ILGPU.dll + lib/netstandard2.1/ILGPU.dll + true + + + CP0001 + T:ILGPU.Backends.PTX.Analyses.PTXBlockSchedule + lib/netstandard2.1/ILGPU.dll + lib/netstandard2.1/ILGPU.dll + true + + + CP0001 + T:ILGPU.Backends.PTX.Analyses.PTXBlockSchedule`2 + lib/netstandard2.1/ILGPU.dll + lib/netstandard2.1/ILGPU.dll + true + + + CP0001 + T:ILGPU.Backends.PTX.Analyses.PTXBlockScheduleExtensions + lib/netstandard2.1/ILGPU.dll + lib/netstandard2.1/ILGPU.dll + true + + + CP0001 + T:ILGPU.Backends.PTX.Transformations.PTXBlockScheduling + lib/netstandard2.1/ILGPU.dll + lib/netstandard2.1/ILGPU.dll + true + + + CP0002 + M:ILGPU.Backends.PTX.PTXCodeGenerator.get_Schedule + lib/net471/ILGPU.dll + lib/net471/ILGPU.dll + true + + + CP0002 + M:ILGPU.Backends.PTX.PTXCodeGenerator.get_Schedule + lib/net5.0/ILGPU.dll + lib/net5.0/ILGPU.dll + true + + + CP0002 + M:ILGPU.Backends.PTX.PTXCodeGenerator.get_Schedule + lib/net6.0/ILGPU.dll + lib/net6.0/ILGPU.dll + true + + + CP0002 + M:ILGPU.Backends.PTX.PTXCodeGenerator.get_Schedule + lib/net7.0/ILGPU.dll + lib/net7.0/ILGPU.dll + true + + + CP0002 + M:ILGPU.Backends.PTX.PTXCodeGenerator.get_Schedule + lib/netstandard2.1/ILGPU.dll + lib/netstandard2.1/ILGPU.dll + true + + \ No newline at end of file