Skip to content

Spec language is ambiguous and potentially insufficient for D3D12_LINEAR_ALGEBRA_MATRIX_CONSTRUCTION_SUPPORT #240

@tex3d

Description

@tex3d

Regarding this section for D3D12_LINEAR_ALGEBRA_MATRIX_CONSTRUCTION_SUPPORT:

#### D3D12_LINEAR_ALGEBRA_MATRIX_CONSTRUCTION_SUPPORT
``` cpp
typedef struct D3D12_LINEAR_ALGEBRA_MATRIX_CONSTRUCTION_SUPPORT
{
// Inputs
D3D12_LINEAR_ALGEBRA_DATATYPE ComponentType;
UINT WaveSize;
// Outputs
UINT MinM;
UINT MinK;
UINT MinN;
} D3D12_LINEAR_ALGEBRA_MATRIX_CONSTRUCTION_SUPPORT;
```
This query indicates a driver's level of support for general operations on wave-scope and group-scope matrices. Since matrices at these scopes can be loaded, stored, manipulated, and converted without actually being used in a multiplication operation, multiplication support is not sufficient. Essentially, a driver that responds positively to this query indicates that it knows how to lay out these components in registers. If a driver supports a particular component type, then it must support:
* Loading a matrix of that type from buffer or group-shared memory, and similarly for storing (`Load()`/`Store()`).
* Operating on elements of a matrix (`Length()`/`GetCoordinate()`/`Get()`/`Set()`/`Splat()`).
* Being used as a source or destination of a conversion (`Cast()`).
If a component type is not supported, `MinM`, `MinK`, and `MinN` will all be set to 0. Otherwise, all three must be nonzero, indicating support for A matrices (MxK), B matrices (KxN), and accumulator matrices (MxN).

Two issues:

  1. The spec language does not define whether supported dimensions are any combination of values that have a minimum of the specified dimensions, or if the dimensions must be even multiples of these min sizes.
  2. This API implies that only one layout of Min M/N/K is provided per component type. For multiply, multiple layouts can be supported, which require separate combinations of minimum sizes for M/N/K to express (like 4/16/16 vs. 16/4/16). If you need that for multiply, you also need it for construct, otherwise you can't construct the matrix types used in the multiply in the first place, or you imply support for sizes the driver doesn't actually support, (like an Accumulator of M=4,N=4 based on the example).

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions