Xenova's picture
Xenova HF Staff
sync 2e7068faf55e
f62a28c verified
Raw
History Blame
39.8 kB
{
"op": "ai.onnx.ReduceProd",
"fixtureArrays": {
"rank3_axis1_middle_keepdims_input_x": [1, -2, 0.5, 4, -3, 2, -1, 0.25, 2, -0.5, 3, -2, -1, 1.5, 2, -4, 0.5, -2, -3, 1, -2, 4, 0.25, -0.5]
},
"cases": [
{
"name": "all_axes_flat_rank1_boundary_8192",
"provenance": {
"notes": "The parallel full-reduction threshold must supersede the rank1 serial and row-reduction fallbacks."
},
"attrs": { "axes": [0], "keepdims": 0 },
"inputs": { "x": { "dtype": "float32", "shape": [8192], "data": { "kind": "constant", "value": 1.0 } } },
"outputs": { "y": { "dtype": "float32", "shape": [], "tolerance": 0 } }
},
{
"name": "all_axes_flat_fullreduce_32x32x32_keepdims",
"attrs": { "keepdims": 1 },
"inputs": {
"x": {
"dtype": "float32",
"shape": [32, 32, 32],
"data": { "kind": "linspace", "start": 0.9995, "end": 1.0005 }
}
},
"outputs": { "y": { "dtype": "float32", "shape": [1, 1, 1], "tolerance": 0.0005, "relTolerance": 0.001 } }
},
{
"name": "dispatch_cliff_axis1_rank2_count_over_16m",
"attrs": { "axes": [1], "keepdims": 0 },
"inputs": { "x": { "dtype": "float32", "shape": [16776961, 1], "data": { "kind": "constant", "value": 1.0 } } },
"outputs": { "y": { "dtype": "float32", "shape": [16776961], "tolerance": 0 } }
},
{
"name": "axis0",
"attrs": { "axes": [0], "keepdims": 0 },
"inputs": {
"x": {
"dtype": "float32",
"shape": [3, 4],
"data": { "kind": "values", "values": [1.0, 2.0, 3.0, 4.0, 2.0, 3.0, 4.0, 5.0, 3.0, 4.0, 5.0, 6.0] }
}
},
"outputs": { "y": { "dtype": "float32", "shape": [4] } }
},
{
"name": "axis0_tiled_64x32",
"attrs": { "axes": [0], "keepdims": 0 },
"inputs": {
"x": {
"dtype": "float32",
"shape": [64, 32],
"data": { "kind": "fillFloat32", "sinStep": 0.17, "cosStep": 0.07, "offset": 1.0, "scale": 0.001 }
}
},
"outputs": { "y": { "dtype": "float32", "shape": [32], "tolerance": 0.00001, "relTolerance": 0.0001 } }
},
{
"name": "axis1",
"attrs": { "axes": [1], "keepdims": 0 },
"inputs": {
"x": {
"dtype": "float32",
"shape": [3, 4],
"data": { "kind": "values", "values": [1.0, 2.0, 3.0, 4.0, 2.0, 3.0, 4.0, 5.0, 3.0, 4.0, 5.0, 6.0] }
}
},
"outputs": { "y": { "dtype": "float32", "shape": [3] } }
},
{
"name": "f32_normal_inputs_subnormal_product_gpu_gap",
"skipGpu": {
"category": "permanent",
"reason": "Portable WGSL floating-point semantics do not guarantee preservation of the subnormal values required by this fixture. Backend evidence: WebGPU/Metal flushes subnormals to zero in f32; bit-exact subnormal preservation is unattainable on GPU."
},
"provenance": {
"source": "onnxruntime/test/providers/cpu/reduction/reduction_ops_test.cc",
"test": "ReductionOpTest.ReduceProd",
"notes": "Inputs are normal float32 values, but the row product is finite subnormal; reduction multiplication must not flush that product to zero."
},
"attrs": { "axes": [1], "keepdims": 0 },
"inputs": {
"x": {
"dtype": "float32",
"shape": [2, 3],
"data": { "kind": "values", "values": [1e-20, 1e-20, 1.0, -1e-20, 1e-20, 1.0] }
}
},
"outputs": {
"y": {
"dtype": "float32",
"shape": [2],
"tolerance": 2e-45,
"data": { "kind": "values", "values": [1e-40, -1e-40] }
}
}
},
{
"name": "f32_normal_inputs_subnormal_product_axis0_gpu_gap",
"skipGpu": {
"category": "permanent",
"reason": "Portable WGSL floating-point semantics do not guarantee preservation of the subnormal values required by this fixture. Backend evidence: WebGPU/Metal flushes subnormals to zero in f32; bit-exact subnormal preservation is unattainable on GPU."
},
"provenance": {
"source": "onnxruntime/test/providers/cpu/reduction/reduction_ops_test.cc",
"test": "ReductionOpTest.ReduceProd",
"notes": "Axis-0 companion: normal inputs produce finite subnormal products, which must not be flushed to zero."
},
"attrs": { "axes": [0], "keepdims": 0 },
"inputs": {
"x": {
"dtype": "float32",
"shape": [2, 3],
"data": { "kind": "values", "values": [1e-20, -1e-20, 2e-20, 1e-20, 1e-20, -2e-20] }
}
},
"outputs": {
"y": {
"dtype": "float32",
"shape": [3],
"tolerance": 6e-45,
"data": { "kind": "values", "values": [1e-40, -1e-40, -4e-40] }
}
}
},
{
"name": "f32_normal_inputs_subnormal_product_last_axis_vec4_gpu_gap",
"skipGpu": {
"category": "permanent",
"reason": "Portable WGSL floating-point semantics do not guarantee preservation of the subnormal values required by this fixture. Backend evidence: WebGPU/Metal flushes subnormals to zero in f32; bit-exact subnormal preservation is unattainable on GPU."
},
"provenance": {
"source": "onnxruntime/test/providers/cpu/reduction/reduction_ops_test.cc",
"test": "ReductionOpTest.ReduceProd",
"notes": "Vec4 last-axis path: normal inputs produce finite subnormal products, which must survive reduction."
},
"attrs": { "axes": [-1], "keepdims": 0 },
"inputs": {
"x": {
"dtype": "float32",
"shape": [2, 4],
"data": { "kind": "values", "values": [1e-20, 1e-20, 1.0, 1.0, -1e-20, 1e-20, 1.0, 1.0] }
}
},
"outputs": {
"y": {
"dtype": "float32",
"shape": [2],
"tolerance": 2e-45,
"data": { "kind": "values", "values": [1e-40, -1e-40] }
}
}
},
{
"name": "f32_normal_inputs_subnormal_product_rank3_axis1_gpu_gap",
"skipGpu": {
"category": "permanent",
"reason": "Portable WGSL floating-point semantics do not guarantee preservation of the subnormal values required by this fixture. Backend evidence: WebGPU/Metal flushes subnormals to zero in f32; bit-exact subnormal preservation is unattainable on GPU."
},
"provenance": {
"source": "onnxruntime/test/providers/cpu/reduction/reduction_ops_test.cc",
"test": "ReductionOpTest.ReduceProd",
"notes": "Rank-3 non-last-axis path: normal inputs produce finite subnormal products along axis 1."
},
"attrs": { "axes": [1], "keepdims": 0 },
"inputs": {
"x": {
"dtype": "float32",
"shape": [2, 2, 2],
"data": { "kind": "values", "values": [1e-20, -1e-20, 1e-20, 1e-20, 2e-20, -2e-20, 2e-20, 2e-20] }
}
},
"outputs": {
"y": {
"dtype": "float32",
"shape": [2, 2],
"tolerance": 6e-45,
"data": { "kind": "values", "values": [1e-40, -1e-40, 4e-40, -4e-40] }
}
}
},
{
"name": "axis0_empty_rows_identity_one",
"attrs": { "axes": [0], "keepdims": 0 },
"inputs": { "x": { "dtype": "float32", "shape": [0, 3], "data": { "kind": "values", "values": [] } } },
"outputs": { "y": { "dtype": "float32", "shape": [3], "tolerance": 0 } }
},
{
"name": "axis1_empty_cols_identity_one",
"attrs": { "axes": [1], "keepdims": 0 },
"inputs": { "x": { "dtype": "float32", "shape": [2, 0], "data": { "kind": "values", "values": [] } } },
"outputs": { "y": { "dtype": "float32", "shape": [2], "tolerance": 0 } }
},
{
"name": "axis_minus_one",
"attrs": { "axes": [-1], "keepdims": 0 },
"inputs": {
"x": {
"dtype": "float32",
"shape": [3, 4],
"data": { "kind": "values", "values": [1.0, 2.0, 3.0, 4.0, 2.0, -3.0, 4.0, -5.0, 0.5, 1.5, 2.0, 3.0] }
}
},
"outputs": { "y": { "dtype": "float32", "shape": [3], "tolerance": 0.000001 } }
},
{
"name": "rank3_axis1_middle_keepdims",
"attrs": { "axes": [1], "keepdims": 1 },
"inputs": {
"x": {
"dtype": "float32",
"shape": [2, 3, 4],
"data": { "kind": "values", "values": { "$ref": "#/fixtureArrays/rank3_axis1_middle_keepdims_input_x" } }
}
},
"outputs": { "y": { "dtype": "float32", "shape": [2, 1, 4], "tolerance": 0.000001 } }
},
{
"name": "ort_empty_rank3_middle_axis_keepdims",
"provenance": {
"source": "onnxruntime/test/providers/cpu/reduction/reduction_ops_test.cc",
"test": "ReductionOpTest.empty_set_ReduceProd_13"
},
"attrs": { "axes": [1], "keepdims": 1 },
"inputs": { "x": { "dtype": "float32", "shape": [2, 0, 4], "data": { "kind": "values", "values": [] } } },
"outputs": { "y": { "dtype": "float32", "shape": [2, 1, 4], "tolerance": 0 } }
},
{
"name": "rank4_axis1_channel_no_keepdims",
"attrs": { "axes": [1], "keepdims": 0 },
"inputs": {
"x": {
"dtype": "float32",
"shape": [2, 4, 2, 2],
"data": {
"kind": "values",
"values": [1.0, -2.0, 0.5, -1.0, -3.0, 2.0, -1.0, 0.25, 2.0, -0.5, 3.0, -2.0, -1.0, 1.5, 2.0, -4.0, 0.5, -2.0, -3.0, 1.0, -2.0, 4.0, 0.25, -0.5, 1.5, -1.0, 2.0, -2.0, -0.25, 0.5, -4.0, 3.0]
}
}
},
"outputs": { "y": { "dtype": "float32", "shape": [2, 2, 2], "tolerance": 0.000001 } }
},
{
"name": "rank1_axis0_keepdims",
"attrs": { "axes": [-1], "keepdims": 1 },
"inputs": {
"x": { "dtype": "float32", "shape": [5], "data": { "kind": "values", "values": [2.0, -3.0, 0.5, -1.0, 4.0] } }
},
"outputs": { "y": { "dtype": "float32", "shape": [1], "tolerance": 0.000001 } }
},
{
"name": "ort_axis1_rank3_no_keepdims",
"provenance": {
"source": "onnxruntime/test/providers/cpu/reduction/reduction_ops_test.cc",
"test": "ReductionOpTest.ReduceProd_do_not_keepdims"
},
"attrs": { "axes": [1], "keepdims": 0 },
"inputs": {
"x": {
"dtype": "float32",
"shape": [3, 2, 2],
"data": { "kind": "values", "values": [1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0] }
}
},
"outputs": { "y": { "dtype": "float32", "shape": [3, 2], "tolerance": 0.000001 } }
},
{
"name": "ort_axis1_rank3_keepdims",
"provenance": {
"source": "onnxruntime/test/providers/cpu/reduction/reduction_ops_test.cc",
"test": "ReductionOpTest.ReduceProd_keepdims"
},
"attrs": { "axes": [1], "keepdims": 1 },
"inputs": {
"x": {
"dtype": "float32",
"shape": [3, 2, 2],
"data": { "kind": "values", "values": [1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0] }
}
},
"outputs": { "y": { "dtype": "float32", "shape": [3, 1, 2], "tolerance": 0.000001 } }
},
{
"name": "ort_axis0_rank1_scalar",
"provenance": {
"source": "onnxruntime/test/providers/cpu/reduction/reduction_ops_test.cc",
"test": "ReductionOpTest.ReduceProd_do_not_keepdims_2"
},
"attrs": { "axes": [0], "keepdims": 0 },
"inputs": { "x": { "dtype": "float32", "shape": [3], "data": { "kind": "values", "values": [1.0, 2.0, 3.0] } } },
"outputs": { "y": { "dtype": "float32", "shape": [], "tolerance": 0.000001 } }
},
{
"name": "ort_rank0_scalar",
"provenance": {
"source": "onnxruntime/test/providers/cpu/reduction/reduction_ops_test.cc",
"test": "ReductionOpTest.ReduceProd0DTensor"
},
"inputs": { "x": { "dtype": "float32", "shape": [], "data": { "kind": "values", "values": [2.0] } } },
"outputs": { "y": { "dtype": "float32", "shape": [], "tolerance": 0 } }
},
{
"name": "onnx_backend_reduce_prod_do_not_keepdims_example",
"attrs": { "keepdims": 0, "axes": [1] },
"inputs": {
"x": {
"dtype": "float32",
"shape": [3, 2, 2],
"data": { "kind": "values", "values": [1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0] }
}
},
"outputs": { "y": { "dtype": "float32", "shape": [3, 2] } },
"provenance": {
"source": "cmake/external/onnx/onnx/backend/test/data/node/test_reduce_prod_do_not_keepdims_example",
"notes": "The ONNX int64 axes input is materialized as this compile-time axes list."
}
},
{
"name": "onnx_backend_reduce_prod_do_not_keepdims_random",
"attrs": { "keepdims": 0, "axes": [1] },
"inputs": {
"x": {
"dtype": "float32",
"shape": [3, 2, 2],
"data": {
"kind": "values",
"values": [0.9762700796127319, 4.3037872314453125, 2.055267572402954, 0.8976636528968811, -1.5269039869308472, 2.917882204055786, -1.248255729675293, 7.835460186004639, 9.273255348205566, -2.331169605255127, 5.834500789642334, 0.577898383140564]
}
}
},
"outputs": { "y": { "dtype": "float32", "shape": [3, 2] } },
"provenance": {
"source": "cmake/external/onnx/onnx/backend/test/data/node/test_reduce_prod_do_not_keepdims_random",
"notes": "The ONNX int64 axes input is materialized as this compile-time axes list."
}
},
{
"name": "onnx_backend_reduce_prod_empty_set",
"attrs": { "keepdims": 1, "axes": [1] },
"inputs": { "x": { "dtype": "float32", "shape": [2, 0, 4], "data": { "kind": "values", "values": [] } } },
"outputs": { "y": { "dtype": "float32", "shape": [2, 1, 4] } },
"provenance": {
"source": "cmake/external/onnx/onnx/backend/test/data/node/test_reduce_prod_empty_set",
"notes": "The ONNX int64 axes input is materialized as this compile-time axes list."
}
},
{
"name": "onnx_backend_reduce_prod_keepdims_example",
"attrs": { "keepdims": 1, "axes": [1] },
"inputs": {
"x": {
"dtype": "float32",
"shape": [3, 2, 2],
"data": { "kind": "values", "values": [1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0] }
}
},
"outputs": { "y": { "dtype": "float32", "shape": [3, 1, 2] } },
"provenance": {
"source": "cmake/external/onnx/onnx/backend/test/data/node/test_reduce_prod_keepdims_example",
"notes": "The ONNX int64 axes input is materialized as this compile-time axes list."
}
},
{
"name": "onnx_backend_reduce_prod_keepdims_random",
"attrs": { "keepdims": 1, "axes": [1] },
"inputs": {
"x": {
"dtype": "float32",
"shape": [3, 2, 2],
"data": {
"kind": "values",
"values": [0.9762700796127319, 4.3037872314453125, 2.055267572402954, 0.8976636528968811, -1.5269039869308472, 2.917882204055786, -1.248255729675293, 7.835460186004639, 9.273255348205566, -2.331169605255127, 5.834500789642334, 0.577898383140564]
}
}
},
"outputs": { "y": { "dtype": "float32", "shape": [3, 1, 2] } },
"provenance": {
"source": "cmake/external/onnx/onnx/backend/test/data/node/test_reduce_prod_keepdims_random",
"notes": "The ONNX int64 axes input is materialized as this compile-time axes list."
}
},
{
"name": "onnx_backend_reduce_prod_negative_axes_keepdims_example",
"attrs": { "keepdims": 1, "axes": [-2] },
"inputs": {
"x": {
"dtype": "float32",
"shape": [3, 2, 2],
"data": { "kind": "values", "values": [1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0] }
}
},
"outputs": { "y": { "dtype": "float32", "shape": [3, 1, 2] } },
"provenance": {
"source": "cmake/external/onnx/onnx/backend/test/data/node/test_reduce_prod_negative_axes_keepdims_example",
"notes": "The ONNX int64 axes input is materialized as this compile-time axes list."
}
},
{
"name": "onnx_backend_reduce_prod_negative_axes_keepdims_random",
"attrs": { "keepdims": 1, "axes": [-2] },
"inputs": {
"x": {
"dtype": "float32",
"shape": [3, 2, 2],
"data": {
"kind": "values",
"values": [0.9762700796127319, 4.3037872314453125, 2.055267572402954, 0.8976636528968811, -1.5269039869308472, 2.917882204055786, -1.248255729675293, 7.835460186004639, 9.273255348205566, -2.331169605255127, 5.834500789642334, 0.577898383140564]
}
}
},
"outputs": { "y": { "dtype": "float32", "shape": [3, 1, 2] } },
"provenance": {
"source": "cmake/external/onnx/onnx/backend/test/data/node/test_reduce_prod_negative_axes_keepdims_random",
"notes": "The ONNX int64 axes input is materialized as this compile-time axes list."
}
},
{
"name": "ort_default_axes_rank3_no_keepdims_scalar",
"provenance": {
"source": "onnxruntime/test/providers/cpu/reduction/reduction_ops_test.cc",
"test": "ReductionOpTest.ReduceProd_default_axes_do_not_keep_dims",
"notes": "Default axes reduce all input dimensions to a rank-0 scalar when keepdims=0."
},
"attrs": { "keepdims": 0 },
"inputs": {
"x": {
"dtype": "float32",
"shape": [3, 2, 2],
"data": { "kind": "values", "values": [1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0] }
}
},
"outputs": { "y": { "dtype": "float32", "shape": [], "tolerance": 0 } }
},
{
"name": "onnx_backend_reduce_prod_default_axes_keepdims_example",
"provenance": {
"source": "cmake/external/onnx/onnx/backend/test/data/node/test_reduce_prod_default_axes_keepdims_example"
},
"attrs": { "keepdims": 1 },
"inputs": {
"x": {
"dtype": "float32",
"shape": [3, 2, 2],
"data": { "kind": "values", "values": [1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0] }
}
},
"outputs": { "y": { "dtype": "float32", "shape": [1, 1, 1], "tolerance": 0 } }
},
{
"name": "ort_empty_default_axes_keepdims_all_rank2",
"provenance": {
"source": "onnxruntime/test/providers/cpu/reduction/reduction_ops_test.cc",
"test": "ReductionOpTest.ReduceProd_EmptySet_DefaultAxes_KeepDims",
"notes": "ORT uses an empty axes input to request reduction over all axes; this fixture represents that with omitted axis."
},
"attrs": { "keepdims": 1 },
"inputs": { "x": { "dtype": "float32", "shape": [2, 0], "data": { "kind": "values", "values": [] } } },
"outputs": {
"y": { "dtype": "float32", "shape": [1, 1], "tolerance": 0, "data": { "kind": "values", "values": [1.0] } }
}
},
{
"name": "onnx_backend_reduce_prod_default_axes_keepdims_random",
"provenance": {
"source": "cmake/external/onnx/onnx/backend/test/data/node/test_reduce_prod_default_axes_keepdims_random"
},
"attrs": { "keepdims": 1 },
"inputs": {
"x": {
"dtype": "float32",
"shape": [3, 2, 2],
"data": {
"kind": "values",
"values": [0.9762700796127319, 4.3037872314453125, 2.055267572402954, 0.8976636528968811, -1.5269039869308472, 2.917882204055786, -1.248255729675293, 7.835460186004639, 9.273255348205566, -2.331169605255127, 5.834500789642334, 0.577898383140564]
}
}
},
"outputs": { "y": { "dtype": "float32", "shape": [1, 1, 1], "tolerance": 0 } }
},
{
"name": "subgroup_vec4_last_axis_2x256",
"attrs": { "axes": [-1], "keepdims": 0 },
"inputs": {
"x": {
"dtype": "float32",
"shape": [2, 256],
"data": { "kind": "fillFloat32", "sinStep": 0.13, "cosStep": 0.29, "offset": 1.0, "scale": 0.05 }
}
},
"outputs": { "y": { "dtype": "float32", "shape": [2], "tolerance": 0.00001, "relTolerance": 0.0001 } }
},
{
"name": "subgroup_scalar_last_axis_2x65",
"attrs": { "axes": [1], "keepdims": 0 },
"inputs": {
"x": {
"dtype": "float32",
"shape": [2, 65],
"data": { "kind": "fillFloat32", "sinStep": 0.23, "cosStep": 0.11, "offset": 1.0, "scale": 0.05 }
}
},
"outputs": { "y": { "dtype": "float32", "shape": [2], "tolerance": 0.00001, "relTolerance": 0.0001 } }
},
{
"name": "ort_int32_multi_axis_keepdims",
"provenance": {
"source": "onnxruntime/test/providers/cpu/reduction/reduction_ops_test.cc",
"test": "ReductionOpTest.ReduceProd_int32"
},
"attrs": { "axes": [0, 2], "keepdims": 1 },
"inputs": {
"x": {
"dtype": "int32",
"shape": [3, 2, 2],
"data": { "kind": "values", "values": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12] }
}
},
"outputs": {
"y": {
"dtype": "int32",
"shape": [1, 2, 1],
"data": { "kind": "values", "values": [5400, 88704] },
"tolerance": 0
}
}
},
{
"name": "ort_noop_empty_axes_identity",
"provenance": {
"source": "onnxruntime/test/providers/cpu/reduction/reduction_ops_test.cc",
"test": "ReductionOpTest.ReduceProd_noop_axes_input_initializer_opset_18",
"notes": "The omitted axes input exercises empty-axes behavior."
},
"attrs": { "keepdims": 0, "noop_with_empty_axes": 1 },
"inputs": {
"x": { "dtype": "float32", "shape": [1, 2, 2], "data": { "kind": "values", "values": [1.0, 2.0, 3.0, 4.0] } }
},
"outputs": { "y": { "dtype": "float32", "shape": [1, 2, 2], "tolerance": 0 } }
},
{
"name": "ort_int32_positive_overflow_saturates_gpu_gap",
"skipGpu": {
"category": "todo",
"reason": "The current integer reduction route uses an i32 accumulator, so it cannot reproduce the fixture's widened intermediate arithmetic and final int32 saturation. A portable multiword accumulator can implement this behavior."
},
"provenance": {
"source": "onnxruntime/test/providers/cpu/reduction/reduction_ops_test.cc",
"test": "ReductionOpTest.ReduceProd_int32_Overflow_Saturates"
},
"attrs": { "axes": [0], "keepdims": 1 },
"inputs": {
"x": { "dtype": "int32", "shape": [3], "data": { "kind": "values", "values": [100000, 100000, 100000] } }
},
"outputs": {
"y": { "dtype": "int32", "shape": [1], "data": { "kind": "values", "values": [2147483647] }, "tolerance": 0 }
}
},
{
"name": "ort_int32_negative_overflow_saturates_gpu_gap",
"skipGpu": {
"category": "todo",
"reason": "The current integer reduction route uses an i32 accumulator, so it cannot reproduce the fixture's widened intermediate arithmetic and final int32 saturation. A portable multiword accumulator can implement this behavior."
},
"provenance": {
"source": "onnxruntime/test/providers/cpu/reduction/reduction_ops_test.cc",
"test": "ReductionOpTest.ReduceProd_int32_NegativeOverflow_Saturates"
},
"attrs": { "axes": [0], "keepdims": 1 },
"inputs": {
"x": { "dtype": "int32", "shape": [3], "data": { "kind": "values", "values": [-100000, 100000, 100000] } }
},
"outputs": {
"y": { "dtype": "int32", "shape": [1], "data": { "kind": "values", "values": [-2147483648] }, "tolerance": 0 }
}
},
{
"name": "ort_float_multi_axis_keepdims",
"provenance": {
"source": "onnxruntime/test/providers/cpu/reduction/reduction_ops_test.cc",
"test": "ReductionOpTest.ReduceProd"
},
"attrs": { "axes": [0, 2], "keepdims": 1 },
"inputs": {
"x": {
"dtype": "float32",
"shape": [3, 2, 2],
"data": { "kind": "values", "values": [1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0] }
}
},
"outputs": { "y": { "dtype": "float32", "shape": [1, 2, 1], "tolerance": 0.000001 } }
},
{
"name": "rank3_lastaxis_cols1024_tree_f32",
"attrs": { "axes": [2], "keepdims": 0 },
"inputs": {
"x": {
"dtype": "float32",
"shape": [2, 2, 1024],
"data": { "kind": "cycle", "values": [1.0, -1.0, 1.0, -1.0, 1.0, -1.0, 1.0, 1.0] }
}
},
"outputs": { "y": { "dtype": "float32", "shape": [2, 2], "tolerance": 0.00001 } }
},
{
"name": "rank3_lastaxis_cols1024_tree_i32",
"attrs": { "axes": [2], "keepdims": 0 },
"inputs": {
"x": {
"dtype": "int32",
"shape": [2, 2, 1024],
"data": { "kind": "cycle", "values": [1, -1, 1, -1, 1, -1, 1, 1] }
}
},
"outputs": { "y": { "dtype": "int32", "shape": [2, 2], "tolerance": 0.00001 } }
},
{
"name": "axis0_splitk_8192x32",
"attrs": { "axes": [0], "keepdims": 0 },
"inputs": {
"x": {
"dtype": "float32",
"shape": [8192, 32],
"data": { "kind": "fillFloat32", "sinStep": 0.17, "cosStep": 0.07, "offset": 1.0, "scale": 0.001 }
}
},
"outputs": { "y": { "dtype": "float32", "shape": [32], "tolerance": 0.001 } }
},
{
"name": "axis0_splitk_8192x48_keepdims",
"attrs": { "axes": [0], "keepdims": 1 },
"inputs": {
"x": {
"dtype": "float32",
"shape": [8192, 48],
"data": { "kind": "fillFloat32", "sinStep": 0.17, "cosStep": 0.07, "offset": 1.0, "scale": 0.001 }
}
},
"outputs": { "y": { "dtype": "float32", "shape": [1, 48], "tolerance": 0.001 } }
},
{
"name": "int32_rank2_axis1_last",
"provenance": {
"notes": "Exercises int32 ReduceProd over the last axis of a rank-2 tensor with an in-range product."
},
"attrs": { "axes": [1], "keepdims": 0 },
"inputs": {
"x": {
"dtype": "int32",
"shape": [3, 4],
"data": { "kind": "values", "values": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12] }
}
},
"outputs": { "y": { "dtype": "int32", "shape": [3], "tolerance": 0 } }
},
{
"name": "int32_rank2_axis0",
"provenance": {
"source": "onnxruntime/test/providers/cpu/reduction/reduction_ops_test.cc",
"test": "ReductionOpTest.ReduceProd_int32",
"notes": "Exercises int32 ReduceProd over axis 0 of a rank-2 tensor; all expected products remain in int32 range."
},
"attrs": { "axes": [0], "keepdims": 0 },
"inputs": {
"x": {
"dtype": "int32",
"shape": [3, 4],
"data": { "kind": "values", "values": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12] }
}
},
"outputs": { "y": { "dtype": "int32", "shape": [4], "tolerance": 0 } }
},
{
"name": "int32_rank1_axis0",
"provenance": {
"source": "onnxruntime/test/providers/cpu/reduction/reduction_ops_test.cc",
"test": "ReductionOpTest.ReduceProd_int32",
"notes": "Exercises int32 ReduceProd over the sole axis of a rank-1 tensor, producing the in-range scalar value 120."
},
"attrs": { "axes": [0], "keepdims": 0 },
"inputs": { "x": { "dtype": "int32", "shape": [4], "data": { "kind": "values", "values": [2, 3, 4, 5] } } },
"outputs": { "y": { "dtype": "int32", "shape": [], "tolerance": 0 } }
},
{
"name": "int32_rank3_axis1_middle",
"provenance": {
"source": "onnxruntime/test/providers/cpu/reduction/reduction_ops_test.cc",
"test": "ReductionOpTest.ReduceProd_do_not_keepdims",
"notes": "Exercises int32 ReduceProd over the middle axis of a rank-3 tensor with keepdims=0; all expected products remain in int32 range."
},
"attrs": { "axes": [1], "keepdims": 0 },
"inputs": {
"x": {
"dtype": "int32",
"shape": [2, 3, 2],
"data": { "kind": "values", "values": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12] }
}
},
"outputs": { "y": { "dtype": "int32", "shape": [2, 2], "tolerance": 0 } }
},
{
"name": "f32_last_axis_inf_nan_propagation",
"provenance": {
"source": "onnxruntime/test/providers/cpu/reduction/reduction_ops_test.cc",
"test": "ReductionOpTest.ReduceProd",
"notes": "Float edge-value coverage on the working vec4 last-axis path (cols=4, %4==0 -> subgroup_last_axis_vec4). Row0 contains 0*inf -> NaN; row1 overflows the product to +inf. Metal handles inf/NaN in arithmetic (only subnormals are FTZ-flushed), so this should PASS on GPU. Fills the no-inf/NaN-input coverage gap noted in coverage."
},
"attrs": { "axes": [-1], "keepdims": 0 },
"inputs": {
"x": {
"dtype": "float32",
"shape": [2, 4],
"data": {
"kind": "values",
"values": [0.0, 1e+30, 1.0, 1.0, 100000000000000000000.0, 100000000000000000000.0, 100000000000000000000.0, 100000000000000000000.0]
}
}
},
"outputs": { "y": { "dtype": "float32", "shape": [2], "allowNaN": true } }
},
{
"name": "rank4_multi_axis_12_keepdims",
"attrs": { "axes": [1, 2], "keepdims": 1 },
"inputs": {
"x": {
"dtype": "float32",
"shape": [2, 3, 2, 2],
"data": {
"kind": "values",
"values": [1.05, 0.95, 1.1, 0.9, 1.0, 0.98, 1.02, 0.97, 1.03, 0.99, 1.01, 0.96, 1.04, 0.94, 1.06, 0.92, 1.08, 0.93, 1.07, 0.91, 1.09, 0.95, 1.05, 1.0]
}
}
},
"outputs": { "y": { "dtype": "float32", "shape": [2, 1, 1, 2], "tolerance": 0.0001, "relTolerance": 0.0001 } }
},
{
"name": "tree_lastaxis_dispatch_fold_f32_70000x64",
"attrs": { "axes": [-1], "keepdims": 0 },
"inputs": {
"x": { "dtype": "float32", "shape": [70000, 64], "data": { "kind": "cycle", "values": [1.0, -1.0, 0.5, 2.0] } }
},
"outputs": { "y": { "dtype": "float32", "shape": [70000], "tolerance": 0 } }
},
{
"name": "tree_lastaxis_i32_dispatch_fold_70000x64",
"attrs": { "axes": [-1], "keepdims": 0 },
"inputs": {
"x": {
"dtype": "int32",
"shape": [70000, 64],
"data": { "kind": "cycle", "values": [1, -1, 1, -1, 1, -1, 1, 1] }
}
},
"outputs": { "y": { "dtype": "int32", "shape": [70000], "tolerance": 0 } }
},
{
"name": "all_axes_flat_gridstride_tail_numel_8196",
"attrs": { "keepdims": 1 },
"inputs": {
"x": { "dtype": "float32", "shape": [4, 2049], "data": { "kind": "cycle", "values": [1.0, -1.0, 0.5, 2.0] } }
},
"outputs": { "y": { "dtype": "float32", "shape": [1, 1], "tolerance": 0 } }
},
{
"name": "subgroup_vec4_manyrows_under_32768_short_cols_16384x64",
"attrs": { "axes": [-1], "keepdims": 0 },
"requires": { "features": ["subgroups"] },
"inputs": {
"x": { "dtype": "float32", "shape": [16384, 64], "data": { "kind": "cycle", "values": [1.0, -1.0, 0.5, 2.0] } }
},
"outputs": { "y": { "dtype": "float32", "shape": [16384], "tolerance": 0 } }
},
{
"name": "int32_all_axes_flat_128x64",
"attrs": { "keepdims": 1 },
"inputs": { "x": { "dtype": "int32", "shape": [128, 64], "data": { "kind": "cycle", "values": [1, -1] } } },
"outputs": { "y": { "dtype": "int32", "shape": [1, 1], "tolerance": 0 } }
},
{
"name": "axis0_narrow_f32_8192x3_splitk_guard_lock",
"provenance": {
"notes": "Compact lock below the historical 16-column split-K guard. Multiplicative identity input validates partial and combine identities exactly."
},
"attrs": { "axes": [0], "keepdims": 0 },
"inputs": { "x": { "dtype": "float32", "shape": [8192, 3], "data": { "kind": "constant", "value": 1.0 } } },
"outputs": { "y": { "dtype": "float32", "shape": [3], "tolerance": 0 } }
},
{
"name": "contiguous_suffix_axes12_parallel",
"provenance": {
"notes": "Contiguous axes {1,2} exercise the shared cooperative suffix reduction instead of one serial lane per output."
},
"attrs": { "axes": [1, 2], "keepdims": 1 },
"inputs": {
"x": {
"dtype": "float32",
"shape": [3, 16, 16],
"data": { "kind": "fillFloat32", "sinStep": 0.13, "cosStep": 0.07, "offset": 1.0, "scale": 0.001 }
}
},
"outputs": { "y": { "dtype": "float32", "shape": [3, 1, 1], "tolerance": 0.0001, "relTolerance": 0.0001 } }
},
{
"name": "axis_split_rank3_axis1_2x8192x4",
"attrs": { "axes": [1], "keepdims": 0 },
"inputs": {
"x": {
"dtype": "float32",
"shape": [2, 8192, 4],
"data": { "kind": "fillFloat32", "sinStep": 0.17, "cosStep": 0.07, "offset": 1.0, "scale": 0.001 }
}
},
"outputs": { "y": { "dtype": "float32", "shape": [2, 4], "tolerance": 0.001 } }
},
{
"name": "f16_axis_split_tiled_narrow_2x8192x4",
"attrs": { "axes": [1], "keepdims": 0 },
"inputs": {
"x": {
"dtype": "float16",
"shape": [2, 8192, 4],
"data": { "kind": "fillFloat32", "sinStep": 0.17, "cosStep": 0.07, "offset": 1.0, "scale": 0.001 }
}
},
"outputs": { "y": { "dtype": "float16", "shape": [2, 4], "tolerance": 0.05, "relTolerance": 0.01 } }
},
{
"name": "axis_split_rank3_axis1_wide_2x8192x32",
"attrs": { "axes": [1], "keepdims": 0 },
"inputs": {
"x": {
"dtype": "float32",
"shape": [2, 8192, 32],
"data": { "kind": "fillFloat32", "sinStep": 0.17, "cosStep": 0.07, "offset": 1.0, "scale": 0.001 }
}
},
"outputs": { "y": { "dtype": "float32", "shape": [2, 32], "tolerance": 0.001 } }
},
{
"name": "f16_axis_split_wide_2x8192x32",
"attrs": { "axes": [1], "keepdims": 0 },
"inputs": {
"x": {
"dtype": "float16",
"shape": [2, 8192, 32],
"data": { "kind": "fillFloat32", "sinStep": 0.17, "cosStep": 0.07, "offset": 1.0, "scale": 0.001 }
}
},
"outputs": { "y": { "dtype": "float16", "shape": [2, 32], "tolerance": 0.05, "relTolerance": 0.01 } }
},
{
"name": "f16_rank3_axis1_serial",
"attrs": { "axes": [1], "keepdims": 1 },
"inputs": {
"x": {
"dtype": "float16",
"shape": [2, 3, 4],
"data": { "kind": "values", "values": { "$ref": "#/fixtureArrays/rank3_axis1_middle_keepdims_input_x" } }
}
},
"outputs": { "y": { "dtype": "float16", "shape": [2, 1, 4], "tolerance": 0.05 } }
},
{
"name": "f16_last_axis_serial_fallback",
"attrs": { "axes": [1], "keepdims": 0 },
"inputs": {
"x": {
"dtype": "float16",
"shape": [2, 65],
"data": { "kind": "fillFloat32", "sinStep": 0.23, "cosStep": 0.11, "offset": 1.0, "scale": 0.05 }
}
},
"outputs": { "y": { "dtype": "float16", "shape": [2], "tolerance": 0.05, "relTolerance": 0.0001 } }
},
{
"name": "f16_all_axes",
"attrs": { "axes": [0], "keepdims": 0 },
"inputs": { "x": { "dtype": "float16", "shape": [8192], "data": { "kind": "constant", "value": 1.0 } } },
"outputs": { "y": { "dtype": "float16", "shape": [], "tolerance": 0.05 } }
},
{
"name": "f16_axis0_splitk_8192x8",
"attrs": { "axes": [0], "keepdims": 0 },
"inputs": {
"x": {
"dtype": "float16",
"shape": [8192, 8],
"data": { "kind": "fillFloat32", "sinStep": 0.17, "cosStep": 0.07, "offset": 1.0, "scale": 0.001 }
}
},
"outputs": { "y": { "dtype": "float16", "shape": [8], "tolerance": 0.05, "relTolerance": 0.01 } }
},
{
"name": "f16_last_axis_vec4_8x1024",
"attrs": { "axes": [1], "keepdims": 0 },
"inputs": {
"x": {
"dtype": "float16",
"shape": [8, 1024],
"data": { "kind": "fillFloat32", "sinStep": 0.17, "cosStep": 0.07, "offset": 1.0, "scale": 0.001 }
}
},
"outputs": { "y": { "dtype": "float16", "shape": [8], "tolerance": 0.05, "relTolerance": 0.01 } }
},
{
"name": "f16_last_axis_scalar_8x1023",
"attrs": { "axes": [1], "keepdims": 0 },
"inputs": {
"x": {
"dtype": "float16",
"shape": [8, 1023],
"data": { "kind": "fillFloat32", "sinStep": 0.17, "cosStep": 0.07, "offset": 1.0, "scale": 0.001 }
}
},
"outputs": { "y": { "dtype": "float16", "shape": [8], "tolerance": 0.05, "relTolerance": 0.01 } }
},
{
"name": "f16_all_axes_flat_65543",
"attrs": { "keepdims": 0 },
"inputs": {
"x": {
"dtype": "float16",
"shape": [65543],
"data": { "kind": "fillFloat32", "sinStep": 0.17, "cosStep": 0.07, "offset": 1.0, "scale": 0.001 }
}
},
"outputs": { "y": { "dtype": "float16", "shape": [], "tolerance": 0.05, "relTolerance": 0.01 } }
},
{
"name": "f16_suffix_vec4_4x8x128",
"attrs": { "axes": [1, 2], "keepdims": 0 },
"inputs": {
"x": {
"dtype": "float16",
"shape": [4, 8, 128],
"data": { "kind": "fillFloat32", "sinStep": 0.17, "cosStep": 0.07, "offset": 1.0, "scale": 0.001 }
}
},
"outputs": { "y": { "dtype": "float16", "shape": [4], "tolerance": 0.05, "relTolerance": 0.01 } }
},
{
"name": "f16_suffix_scalar_4x7x37",
"attrs": { "axes": [1, 2], "keepdims": 0 },
"inputs": {
"x": {
"dtype": "float16",
"shape": [4, 7, 37],
"data": { "kind": "fillFloat32", "sinStep": 0.17, "cosStep": 0.07, "offset": 1.0, "scale": 0.001 }
}
},
"outputs": { "y": { "dtype": "float16", "shape": [4], "tolerance": 0.05, "relTolerance": 0.01 } }
},
{
"name": "f16_axis0_tilecols_4096x64",
"attrs": { "axes": [0], "keepdims": 0 },
"inputs": {
"x": {
"dtype": "float16",
"shape": [4096, 64],
"data": { "kind": "fillFloat32", "sinStep": 0.17, "cosStep": 0.07, "offset": 1.0, "scale": 0.001 }
}
},
"outputs": { "y": { "dtype": "float16", "shape": [64], "tolerance": 0.05, "relTolerance": 0.01 } }
},
{
"name": "int32_axis0_tiled_64x32",
"attrs": { "axes": [0], "keepdims": 0 },
"inputs": {
"x": { "dtype": "int32", "shape": [64, 32], "data": { "kind": "cycle", "values": [1, -1, 3, 1, 2, -1, 1] } }
},
"outputs": { "y": { "dtype": "int32", "shape": [32], "tolerance": 0 } }
},
{
"name": "axis0_splitk_i32_8192x5",
"provenance": {
"notes": "Integer ReduceProd on the axis-0 split-K route, which ReduceProd did not have until now. A three-value cycle over five columns is coprime with the row stride, so the count of negative factors differs per column and so do the signs of the results; keeping every factor at +/-1 makes the product exact."
},
"attrs": { "axes": [0], "keepdims": 0 },
"inputs": { "x": { "dtype": "int32", "shape": [8192, 5], "data": { "kind": "cycle", "values": [1, 1, -1] } } },
"outputs": { "y": { "dtype": "int32", "shape": [5], "tolerance": 0 } }
}
]
}