Skip to content

[BUG] std::conditional_t<> can fail when depending on shape_type type trait #953

@tbensonatl

Description

@tbensonatl

Describe the Bug

Some, but not all, operators include a shape_type type trait. Because the existence of the trait is inconsistent, the use of std::conditional_t<> to define a local shape_type depending on other operator traits will fail when composed with operators lacking shape_type.

To Reproduce

Including the code below in an application will yield a compiler error similar to the following:

/path/to/MatX/include/matx/transforms/conv.h(192): error: class "matx::detail::ShiftOp<0, matx::tensor_t<float, 1,
 matx::basic_storage<matx::raw_pointer_buffer<float, matx::matx_allocator<float>>>, matx::tensor_desc_t<cuda::std::__4::array<long long, 1UL>, cu
da::std::__4::array<long long, 1UL>, 1>>, int>" has no member "shape_type"
    using shape_type = std::conditional_t<has_shape_type_v<OutputType>, typename OutputType::shape_type, index_t>;
                                                                                             ^
          detected during:
            instantiation of "void matx::detail::matxDirectConv1DInternal(OutputType &, const InType &, const FilterType &, matx::matxConvCorrMod
e_t, const matx::cudaExecutor &) [with OutputType=matx::detail::ShiftOp<0, matx::tensor_t<float, 1, matx::basic_storage<matx::raw_pointer_buffer<
float, matx::matx_allocator<float>>>, matx::tensor_desc_t<cuda::std::__4::array<long long, 1UL>, cuda::std::__4::array<long long, 1UL>, 1>>, int>
, InType=matx::detail::tensor_impl_t<float, 1, matx::tensor_desc_t<cuda::std::__4::array<long long, 1UL>, cuda::std::__4::array<long long, 1UL>,
1>, matx::detail::DenseTensorData<float>>, FilterType=matx::detail::tensor_impl_t<float, 1, matx::tensor_desc_t<cuda::std::__4::array<long long,
1UL>, cuda::std::__4::array<long long, 1UL>, 1>, matx::detail::DenseTensorData<float>>]" at line 288
            instantiation of "void matx::conv1d_impl_internal(OutputType &, const In1Type &, const In2Type &, matx::matxConvCorrMode_t, matx::mat
xConvCorrMethod_t, const Executor &) [with OutputType=matx::detail::ShiftOp<0, matx::tensor_t<float, 1, matx::basic_storage<matx::raw_pointer_buf
fer<float, matx::matx_allocator<float>>>, matx::tensor_desc_t<cuda::std::__4::array<long long, 1UL>, cuda::std::__4::array<long long, 1UL>, 1>>,
int>, In1Type=matx::detail::tensor_impl_t<float, 1, matx::tensor_desc_t<cuda::std::__4::array<long long, 1UL>, cuda::std::__4::array<long long, 1
UL>, 1>, matx::detail::DenseTensorData<float>>, In2Type=matx::detail::tensor_impl_t<float, 1, matx::tensor_desc_t<cuda::std::__4::array<long long
, 1UL>, cuda::std::__4::array<long long, 1UL>, 1>, matx::detail::DenseTensorData<float>>, Executor=matx::cudaExecutor]" at line 388
            instantiation of "void matx::conv1d_impl(OutputType, const In1Type &, const In2Type &, matx::matxConvCorrMode_t, matx::matxConvCorrMe
thod_t, const Executor &) [with OutputType=matx::detail::ShiftOp<0, matx::tensor_t<float, 1, matx::basic_storage<matx::raw_pointer_buffer<float,
matx::matx_allocator<float>>>, matx::tensor_desc_t<cuda::std::__4::array<long long, 1UL>, cuda::std::__4::array<long long, 1UL>, 1>>, int>, In1Ty
pe=matx::detail::tensor_impl_t<float, 1, matx::tensor_desc_t<cuda::std::__4::array<long long, 1UL>, cuda::std::__4::array<long long, 1UL>, 1>, ma
tx::detail::DenseTensorData<float>>, In2Type=matx::detail::tensor_impl_t<float, 1, matx::tensor_desc_t<cuda::std::__4::array<long long, 1UL>, cud
a::std::__4::array<long long, 1UL>, 1>, matx::detail::DenseTensorData<float>>, Executor=matx::cudaExecutor]" at line 161 of
/path/to/MatX/include/matx/operators/conv.h
            instantiation of "void matx::detail::Conv1DOp<OpA, OpB, PermDims>::Exec(Out &&, Executor &&) const [with OpA=matx::tensor_t<float, 1,
 matx::basic_storage<matx::raw_pointer_buffer<float, matx::matx_allocator<float>>>, matx::tensor_desc_t<cuda::std::__4::array<long long, 1UL>, cu
da::std::__4::array<long long, 1UL>, 1>>, OpB=matx::tensor_t<float, 1, matx::basic_storage<matx::raw_pointer_buffer<float, matx::matx_allocator<f
loat>>>, matx::tensor_desc_t<cuda::std::__4::array<long long, 1UL>, cuda::std::__4::array<long long, 1UL>, 1>>, PermDims=matx::detail::no_permute
_t, Out=cuda::std::__4::tuple<matx::detail::ShiftOp<0, matx::tensor_t<float, 1, matx::basic_storage<matx::raw_pointer_buffer<float, matx::matx_al
locator<float>>>, matx::tensor_desc_t<cuda::std::__4::array<long long, 1UL>, cuda::std::__4::array<long long, 1UL>, 1>>, int>, matx::detail::Conv
1DOp<matx::tensor_t<float, 1, matx::basic_storage<matx::raw_pointer_buffer<float, matx::matx_allocator<float>>>, matx::tensor_desc_t<cuda::std::_
_4::array<long long, 1UL>, cuda::std::__4::array<long long, 1UL>, 1>>, matx::tensor_t<float, 1, matx::basic_storage<matx::raw_pointer_buffer<floa
t, matx::matx_allocator<float>>>, matx::tensor_desc_t<cuda::std::__4::array<long long, 1UL>, cuda::std::__4::array<long long, 1UL>, 1>>, matx::de
tail::no_permute_t>> &, Executor=matx::cudaExecutor &]" at line 100 of /path/to/MatX/include/matx/core/tie.h
            instantiation of "void matx::mtie<Ts...>::Exec(Executor &&) [with Ts=<matx::detail::ShiftOp<0, matx::tensor_t<float, 1, matx::basic_s
torage<matx::raw_pointer_buffer<float, matx::matx_allocator<float>>>, matx::tensor_desc_t<cuda::std::__4::array<long long, 1UL>, cuda::std::__4::
array<long long, 1UL>, 1>>, int>, matx::detail::Conv1DOp<matx::tensor_t<float, 1, matx::basic_storage<matx::raw_pointer_buffer<float, matx::matx_
allocator<float>>>, matx::tensor_desc_t<cuda::std::__4::array<long long, 1UL>, cuda::std::__4::array<long long, 1UL>, 1>>, matx::tensor_t<float,
1, matx::basic_storage<matx::raw_pointer_buffer<float, matx::matx_allocator<float>>>, matx::tensor_desc_t<cuda::std::__4::array<long long, 1UL>,
cuda::std::__4::array<long long, 1UL>, 1>>, matx::detail::no_permute_t>>, Executor=matx::cudaExecutor &]" at line 73 of
/path/to/MatX/include/matx/operators/base_operator.h
            instantiation of "void matx::BaseOp<T>::run(Ex &&) [with T=matx::mtie<matx::detail::ShiftOp<0, matx::tensor_t<float, 1, matx::basic_s
torage<matx::raw_pointer_buffer<float, matx::matx_allocator<float>>>, matx::tensor_desc_t<cuda::std::__4::array<long long, 1UL>, cuda::std::__4::
array<long long, 1UL>, 1>>, int>, matx::detail::Conv1DOp<matx::tensor_t<float, 1, matx::basic_storage<matx::raw_pointer_buffer<float, matx::matx_
allocator<float>>>, matx::tensor_desc_t<cuda::std::__4::array<long long, 1UL>, cuda::std::__4::array<long long, 1UL>, 1>>, matx::tensor_t<float,
1, matx::basic_storage<matx::raw_pointer_buffer<float, matx::matx_allocator<float>>>, matx::tensor_desc_t<cuda::std::__4::array<long long, 1UL>,
cuda::std::__4::array<long long, 1UL>, 1>>, matx::detail::no_permute_t>>, Ex=matx::cudaExecutor]" at line 112 of
/path/to/MatX/include/matx/operators/base_operator.h
            instantiation of "void matx::BaseOp<T>::run(cudaStream_t) [with T=matx::mtie<matx::detail::ShiftOp<0, matx::tensor_t<float, 1, matx::
basic_storage<matx::raw_pointer_buffer<float, matx::matx_allocator<float>>>, matx::tensor_desc_t<cuda::std::__4::array<long long, 1UL>, cuda::std
::__4::array<long long, 1UL>, 1>>, int>, matx::detail::Conv1DOp<matx::tensor_t<float, 1, matx::basic_storage<matx::raw_pointer_buffer<float, matx::matx_allocator<float>>>, matx::tensor_desc_t<cuda::std::__4::array<long long, 1UL>, cuda::std::__4::array<long long, 1UL>, 1>>, matx::tensor_t<float, 1, matx::basic_storage<matx::raw_pointer_buffer<float, matx::matx_allocator<float>>>, matx::tensor_desc_t<cuda::std::__4::array<long long, 1UL>, cuda::std::__4::array<long long, 1UL>, 1>>, matx::detail::no_permute_t>>]" at line 53 of /path/to/MatX/examples/shape_type_repro.cu

Expected Behavior

Valid composition of built-in operators should not generate compiler errors.

Code Snippets

  auto in = matx::make_tensor<float>({16});
  auto out = matx::make_tensor<float>({16});
  auto filter = matx::make_tensor<float>({3});
  (filter = 1.0f/3.0f).run();
  (in = 1.0f).run();
  (matx::shift<0>(out, 1) = matx::conv1d(in, filter, matx::MATX_C_MODE_SAME)).run();

System Details (please complete the following information):

  • OS: Ubuntu 22.04
  • CUDA version: 12.8
  • g++ version: 11.4

Additional Context

Metadata

Metadata

Assignees

Labels

No labels
No labels

Type

No fields configured for Bug.

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions