mirror of
https://gitlab.com/libeigen/eigen.git
synced 2025-04-29 23:34:12 +08:00
Add specialization for compile-time zero-sized dense assignment.
In the current `dense_assignment_loop` implementations, if the destination's inner or outer size is zero at compile time and if the kernel involves a product, we currently get a compile error (#2080). This is triggered by attempting to multiply a non-existent row by a column (or vice-versa). To address this, we add a specialization for zero-sized assignments (`AllAtOnceTraversal`) which evaluates to a no-op. We also add a static check to ensure the size is in-fact zero. This now seems to be the only existing use of `AllAtOnceTraversal`. Fixes #2080.
This commit is contained in:
parent
5ec4907434
commit
655c3a4042
@ -99,7 +99,8 @@ private:
|
|||||||
|
|
||||||
public:
|
public:
|
||||||
enum {
|
enum {
|
||||||
Traversal = (int(MayLinearVectorize) && (LinearPacketSize>InnerPacketSize)) ? int(LinearVectorizedTraversal)
|
Traversal = int(Dst::SizeAtCompileTime) == 0 ? int(AllAtOnceTraversal) // If compile-size is zero, traversing will fail at compile-time.
|
||||||
|
: (int(MayLinearVectorize) && (LinearPacketSize>InnerPacketSize)) ? int(LinearVectorizedTraversal)
|
||||||
: int(MayInnerVectorize) ? int(InnerVectorizedTraversal)
|
: int(MayInnerVectorize) ? int(InnerVectorizedTraversal)
|
||||||
: int(MayLinearVectorize) ? int(LinearVectorizedTraversal)
|
: int(MayLinearVectorize) ? int(LinearVectorizedTraversal)
|
||||||
: int(MaySliceVectorize) ? int(SliceVectorizedTraversal)
|
: int(MaySliceVectorize) ? int(SliceVectorizedTraversal)
|
||||||
@ -316,6 +317,22 @@ template<typename Kernel,
|
|||||||
int Unrolling = Kernel::AssignmentTraits::Unrolling>
|
int Unrolling = Kernel::AssignmentTraits::Unrolling>
|
||||||
struct dense_assignment_loop;
|
struct dense_assignment_loop;
|
||||||
|
|
||||||
|
/************************
|
||||||
|
***** Special Cases *****
|
||||||
|
************************/
|
||||||
|
|
||||||
|
// Zero-sized assignment is a no-op.
|
||||||
|
template<typename Kernel, int Unrolling>
|
||||||
|
struct dense_assignment_loop<Kernel, AllAtOnceTraversal, Unrolling>
|
||||||
|
{
|
||||||
|
EIGEN_DEVICE_FUNC static void EIGEN_STRONG_INLINE run(Kernel &kernel)
|
||||||
|
{
|
||||||
|
typedef typename Kernel::DstEvaluatorType::XprType DstXprType;
|
||||||
|
EIGEN_STATIC_ASSERT(int(DstXprType::SizeAtCompileTime) == 0,
|
||||||
|
EIGEN_INTERNAL_ERROR_PLEASE_FILE_A_BUG_REPORT)
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
/************************
|
/************************
|
||||||
*** Default traversal ***
|
*** Default traversal ***
|
||||||
************************/
|
************************/
|
||||||
@ -572,14 +589,15 @@ struct dense_assignment_loop<Kernel, SliceVectorizedTraversal, InnerUnrolling>
|
|||||||
typedef typename Kernel::DstEvaluatorType::XprType DstXprType;
|
typedef typename Kernel::DstEvaluatorType::XprType DstXprType;
|
||||||
typedef typename Kernel::PacketType PacketType;
|
typedef typename Kernel::PacketType PacketType;
|
||||||
|
|
||||||
enum { size = DstXprType::InnerSizeAtCompileTime,
|
enum { innerSize = DstXprType::InnerSizeAtCompileTime,
|
||||||
packetSize =unpacket_traits<PacketType>::size,
|
packetSize =unpacket_traits<PacketType>::size,
|
||||||
vectorizableSize = (size/packetSize)*packetSize };
|
vectorizableSize = (innerSize/packetSize)*packetSize,
|
||||||
|
size = DstXprType::SizeAtCompileTime };
|
||||||
|
|
||||||
for(Index outer = 0; outer < kernel.outerSize(); ++outer)
|
for(Index outer = 0; outer < kernel.outerSize(); ++outer)
|
||||||
{
|
{
|
||||||
copy_using_evaluator_innervec_InnerUnrolling<Kernel, 0, vectorizableSize, 0, 0>::run(kernel, outer);
|
copy_using_evaluator_innervec_InnerUnrolling<Kernel, 0, vectorizableSize, 0, 0>::run(kernel, outer);
|
||||||
copy_using_evaluator_DefaultTraversal_InnerUnrolling<Kernel, vectorizableSize, size>::run(kernel, outer);
|
copy_using_evaluator_DefaultTraversal_InnerUnrolling<Kernel, vectorizableSize, innerSize>::run(kernel, outer);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
Loading…
x
Reference in New Issue
Block a user