@@ -359,6 +359,9 @@ class DxilConf_SM610_LinAlg {
359359 // Convert
360360 TEST_METHOD (Convert);
361361
362+ // Vector Accumulate
363+ TEST_METHOD (VectorAccumulateDescriptor_Thread_F16);
364+
362365private:
363366 CComPtr<ID3D12Device> D3DDevice;
364367 dxc::SpecificDllLoader DxcSupport;
@@ -1718,4 +1721,41 @@ void DxilConf_SM610_LinAlg::Convert() {
17181721 runConvert (D3DDevice, DxcSupport, VerboseLogging);
17191722}
17201723
1724+ static const char VectorAccumulateDescriptorShader[] = R"(
1725+ RWByteAddressBuffer Output : register(u0);
1726+
1727+ [numthreads(1, 1, 1)]
1728+ void main() {
1729+ vector<half, 4> InVec = {1.0, 2.0, 3.0, 4.0};
1730+ __builtin_LinAlg_VectorAccumulateToDescriptor(InVec, Output, 0, 64);
1731+ }
1732+ )" ;
1733+
1734+ static void runVectorAccumulateDescriptor (ID3D12Device *Device, dxc::SpecificDllLoader &DxcSupport,
1735+ bool Verbose) {
1736+ std::string Args = " -HV 202x" ;
1737+ MatrixDim NumElements = 4 ;
1738+ size_t BufferSize = elementSize (ComponentType::F16 ) * NumElements;
1739+
1740+ compileShader (DxcSupport, VectorAccumulateDescriptorShader, " cs_6_10" , Args, Verbose);
1741+
1742+ auto Expected = makeExpectedVec (ComponentType::F16 , NumElements, 1.0 );
1743+
1744+ auto Op = createComputeOp (VectorAccumulateDescriptorShader, " cs_6_10" , " UAV(u0)" , Args.c_str ());
1745+ addUAVBuffer (Op.get (), " Output" , BufferSize, true );
1746+ addRootView (Op.get (), 0 , " Output" );
1747+
1748+ auto Result = runShaderOp (Device, DxcSupport, std::move (Op));
1749+
1750+ MappedData OutData;
1751+ Result->Test ->GetReadBackData (" Output" , &OutData);
1752+
1753+ VERIFY_IS_TRUE (verifyComponentBuffer (ComponentType::F16 , OutData.data (),
1754+ Expected, NumElements, Verbose));
1755+ }
1756+
1757+ void DxilConf_SM610_LinAlg::VectorAccumulateDescriptor_Thread_F16 () {
1758+ runVectorAccumulateDescriptor (D3DDevice, DxcSupport, VerboseLogging);
1759+ }
1760+
17211761} // namespace LinAlg
0 commit comments