Repository: pytorch
Issue: [caffe2] Unaligned AVX instruction operands in LayerNorm implementation in OSS build
Labels: caffe2

On my open source build the following program hits a segmentation fault:

```
from caffe2.python import core, workspace

test_net = core.Net("layer_norm_test")
test_net.LayerNorm(["input"], ["output", "mean", "stddev"], epsilon=1e-5)

import numpy as np
workspace.FeedBlob('input', np.random.rand(20, 5, 10, 10).astype('f'))
workspace.CreateNet(test_net)
workspace.RunNet(test_net.Name())
```

Looking at the stack trace it looks like Eigen is attempting to do a 256-bit wide vector add between two stack-allocated operands, which are only aligned to 16 bytes:

```
#0  0x00007fffdf694ddb in Eigen::internal::padd<float __vector>(float __vector const&, float __vector const&) (a=..., b=...)
    at ../cmake/../third_party/eigen/Eigen/src/Core/arch/AVX/PacketMath.h:130
#1  0x00007fffdf6988ae in Eigen::internal::scalar_sum_op<float, float>::packetOp<float __vector>(float __vector const&, float __vector const&) const (this=0x7fffffffbacf, a=..., b=...)
    at ../cmake/../third_party/eigen/Eigen/src/Core/functors/BinaryFunctors.h:45
#2  0x00007fffe0cbbaf4 in Eigen::internal::redux_impl<Eigen::internal::scalar_sum_op<float, float>, Eigen::internal::redux_evaluator<Eigen::Block<Eigen::Map<Eigen::Matrix<float, -1, -1, 1, -1, -1> const, 0, Eigen::Stride<0, 0> > const, 1, -1, true> >, 3, 0>::run (mat=..., func=...) at ../cmake/../third_party/eigen/Eigen/src/Core/Redux.h:240
#3  0x00007fffe0cbb6dd in Eigen::DenseBase<Eigen::Block<Eigen::Map<Eigen::Matrix<float, -1, -1, 1, -1, -1> const, 0, Eigen::Stride<0, 0> > const, 1, -1, true> >::redux<Eigen::internal::scalar_sum_op<float, float> > (this=0x7fffffffbb80, func=...) at ../cmake/../third_party/eigen/Eigen/src/Core/Redux.h:418
#4  0x00007fffe0cbb38f in Eigen::DenseBase<Eigen::Block<Eigen::Map<Eigen::Matrix<float, -1, -1, 1, -1, -1> const, 0, Eigen::Stride<0, 0> > const, 1, -1, true> >::mean (
    this=0x7fffffffbb80) at ../cmake/../third_party/eigen/Eigen/src/Core/Redux.h:468
#5  0x00007fffe0cbb180 in Eigen::internal::member_mean<float>::operator()<Eigen::Block<Eigen::Map<Eigen::Matrix<float, -1, -1, 1, -1, -1> const, 0, Eigen::Stride<0, 0> > const, 1, -1, true> > (this=0x7fffffffbcf0, mat=...) at ../cmake/../third_party/eigen/Eigen/src/Core/VectorwiseOp.h:105
#6  0x00007fffe0cbaff3 in Eigen::internal::evaluator<Eigen::PartialReduxExpr<Eigen::Map<Eigen::Matrix<float, -1, -1, 1, -1, -1> const, 0, Eigen::Stride<0, 0> >, Eigen::internal::member_mean<float>, 1> >::coeff (this=0x7fffffffbcd0, i=0, j=0) at ../cmake/../third_party/eigen/Eigen/src/Core/CoreEvaluators.h:1353
#7  0x00007fffe0cbae29 in Eigen::internal::generic_dense_assignment_kernel<Eigen::internal::evaluator<Eigen::Map<Eigen::Matrix<float, -1, -1, 1, -1, -1>, 0, Eigen::Stride<0, 0> > >, Eigen::internal::evaluator<Eigen::PartialReduxExpr<Eigen::Map<Eigen::Matrix<float, -1, -1, 1, -1, -1> const, 0, Eigen::Stride<0, 0> >, Eigen::internal::member_mean<float>, 1> >, Eigen::internal::assign_op<float, float>, 0>::assignCoeff (this=0x7fffffffbcb0, row=0, col=0) at ../cmake/../third_party/eigen/Eigen/src/Core/AssignEvaluator.h:631
#8  0x00007fffe0cbacab in Eigen::internal::generic_dense_assignment_kernel<Eigen::internal::evaluator<Eigen::Map<Eigen::Matrix<float, -1, -1, 1, -1, -1>, 0, Eigen::Stride<0, 0> > >, Eigen::internal::evaluator<Eigen::PartialReduxExpr<Eigen::Map<Eigen::Matrix<float, -1, -1, 1, -1, -1> const, 0, Eigen::Stride<0, 0> >, Eigen::internal::member_mean<float>, 1> >, Eigen::internal::assign_op<float, float>, 0>::assignCoeffByOuterInner (this=0x7fffffffbcb0, outer=0, inner=0) at ../cmake/../third_party/eigen/Eigen/src/Core/AssignEvaluator.h:645
#9  0x00007fffe0cba974 in Eigen::internal::dense_assignment_loop<Eigen::internal::generic_dense_assignment_kernel<Eigen::internal::evaluator<Eigen::Map<Eigen::Matrix<float, -1, -1, 1, -1, -1>, 0, Eigen::Stride<0, 0> > >, Eigen::internal::evaluator<Eigen::PartialReduxExpr<Eigen::Map<Eigen::Matrix<float, -1, -1, 1, -1, -1> const, 0, Eigen::Stride<0, 0> >, Eigen::internal::member_mean<float>, 1> >, Eigen::internal::assign_op<float, float>, 0>, 0, 0>::run (kernel=...) at ../cmake/../third_party/eigen/Eigen/src/Core/AssignEvaluator.h:326
#10 0x00007fffe0cba352 in Eigen::internal::call_dense_assignment_loop<Eigen::Map<Eigen::Matrix<float, -1, -1, 1, -1, -1>, 0, Eigen::Stride<0, 0> >, Eigen::PartialReduxExpr<Eigen::Map<Eigen::Matrix<float, -1, -1, 1, -1, -1> const, 0, Eigen::Stride<0, 0> >, Eigen::internal::member_mean<float>, 1>, Eigen::internal::assign_op<float, float> > (dst=..., src=..., func=...)
    at ../cmake/../third_party/eigen/Eigen/src/Core/AssignEvaluator.h:741
#11 0x00007fffe0cba1c8 in Eigen::internal::Assignment<Eigen::Map<Eigen::Matrix<float, -1, -1, 1, -1, -1>, 0, Eigen::Stride<0, 0> >, Eigen::PartialReduxExpr<Eigen::Map<Eigen::Matrix<float, -1, -1, 1, -1, -1> const, 0, Eigen::Stride<0, 0> >, Eigen::internal::member_mean<float>, 1>, Eigen::internal::assign_op<float, float>, Eigen::internal::Dense2Dense, void>::run (dst=...,
    src=..., func=...) at ../cmake/../third_party/eigen/Eigen/src/Core/AssignEvaluator.h:879
#12 0x00007fffe0cb9ea9 in Eigen::internal::call_assignment_no_alias<Eigen::Map<Eigen::Matrix<float, -1, -1, 1, -1, -1>, 0, Eigen::Stride<0, 0> >, Eigen::PartialReduxExpr<Eigen::Map<Eigen::Matrix<float, -1, -1, 1, -1, -1> const, 0, Eigen::Stride<0, 0> >, Eigen::internal::member_mean<float>, 1>, Eigen::internal::assign_op<float, float> > (dst=..., src=..., func=...)
    at ../cmake/../third_party/eigen/Eigen/src/Core/AssignEvaluator.h:836
#13 0x00007fffe0cb99ad in Eigen::internal::call_assignment<Eigen::Map<Eigen::Matrix<float, -1, -1, 1, -1, -1>, 0, Eigen::Stride<0, 0> >, Eigen::PartialReduxExpr<Eigen::Map<Eigen::Matrix<float, -1, -1, 1, -1, -1> const, 0, Eigen::Stride<0, 0> >, Eigen::internal::member_mean<float>, 1>, Eigen::internal::assign_op<float, float> >(Eigen::Map<Eigen::Matrix<float, -1, -1, 1, -1, -1>, 0, Eigen::Stride<0, 0> >&, Eigen::PartialReduxExpr<Eigen::Map<Eigen::Matrix<float, -1, -1, 1, -1, -1> const, 0, Eigen::Stride<0, 0> >, Eigen::internal::member_mean<float>, 1> const&, Eigen::internal::assign_op<float, float> const&, Eigen::internal::enable_if<!Eigen::internal::evaluator_assume_aliasing<Eigen::PartialReduxExpr<Eigen::Map<Eigen::Matrix<float, -1, -1, 1, -1, -1> const, 0, Eigen::Stride<0, 0> >, Eigen::internal::member_mean<float>, 1>, Eigen::internal::evaluator_traits<Eigen::PartialReduxExpr<Eigen::Map<Eigen::Matrix<float, -1, -1, 1, -1, -1> const, 0, Eigen::Stride<0, 0> >, Eigen::internal::member_mean<float>, 1> >::Shape>::value, void*>::type) (dst=..., src=..., func=...)
    at ../cmake/../third_party/eigen/Eigen/src/Core/AssignEvaluator.h:804
#14 0x00007fffe0cb8cd5 in Eigen::internal::call_assignment<Eigen::Map<Eigen::Matrix<float, -1, -1, 1, -1, -1>, 0, Eigen::Stride<0, 0> >, Eigen::PartialReduxExpr<Eigen::Map<Eigen::Matrix<float, -1, -1, 1, -1, -1> const, 0, Eigen::Stride<0, 0> >, Eigen::internal::member_mean<float>, 1> > (dst=..., src=...) at ../cmake/../third_party/eigen/Eigen/src/Core/AssignEvaluator.h:782
#15 0x00007fffe0cb8521 in Eigen::MatrixBase<Eigen::Map<Eigen::Matrix<float, -1, -1, 1, -1, -1>, 0, Eigen::Stride<0, 0> > >::operator=<Eigen::PartialReduxExpr<Eigen::Map<Eigen::Matrix<float, -1, -1, 1, -1, -1> const, 0, Eigen::Stride<0, 0> >, Eigen::internal::member_mean<float>, 1> > (this=0x7fffffffbea0, other=...)
    at ../cmake/../third_party/eigen/Eigen/src/Core/Assign.h:66
#16 0x00007fffe0cabaf5 in caffe2::LayerNormOp<caffe2::CPUContext>::DoRunWithType<float> (this=0x5555562c23f0) at ../caffe2/operators/layer_norm_op.cc:52
#17 0x00007fffe0cbd8bc in caffe2::LayerNormOp<caffe2::CPUContext>::RunOnDevice (this=0x5555562c23f0) at ../caffe2/operators/layer_norm_op.h:24
```
Current frame:

```
(gdb) f
#0  0x00007fffdf694ddb in Eigen::internal::padd<float __vector>(float __vector const&, float __vector const&) (a=..., b=...)
    at ../cmake/../third_party/eigen/Eigen/src/Core/arch/AVX/PacketMath.h:130
130	template<> EIGEN_STRONG_INLINE Packet8f padd<Packet8f>(const Packet8f& a, const Packet8f& b) { return _mm256_add_ps(a,b); }
```

Debug info:
```
(gdb) p &a
$1 = (const Eigen::internal::Packet8f *) 0x7fffffffb970
(gdb) p &b
$2 = (const Eigen::internal::Packet8f *) 0x7fffffffb9b0
```

I've tried building with `-DEIGEN_FORCE_ALIGN_32` but it doesn't seem to make a difference.