https://gcc.gnu.org/bugzilla/show_bug.cgi?id=120895

            Bug ID: 120895
           Summary: AVX data types default alignment is not correct
           Product: gcc
           Version: 13.1.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: david.partridge at perdrix dot co.uk
  Target Milestone: ---

Created attachment 61767
  --> https://gcc.gnu.org/bugzilla/attachment.cgi?id=61767&action=edit
test case demonstrating problem

The alignment *requirement* of __m512 is 64 bytes, and as of C++17, all
elements of a std::vector<__m512> *must* be 64 byte aligned.

The compiler is setting a required alignment of 16 bytes, not 64 bytes, but the
type requires alignment of 64 bytes. This is NOT a case where it has better
performance when aligned to 64 bytes. It is *necessary* to avoid SIGSEGV faults
in the intrinsics.

Similar comments apply to most other SIMD datatypes.

Using g++ (Ubuntu 13.1.0-8ubuntu1~22.04) 13.1.0

The elements of such vectors aren't even aligned on 32 byte boundaries!!!

System is x86_64

See attached file for test case

When I run the test case I get:

amonra@styx:~/m512$ ./a.out
std::alignment_of_v<__m512> is: 16
alignof(__m512) is: 16
__alignof__(__m512) is: 64
Address of data%64: 0
Address1%64: 0 Address2%64: 16
a.out: m512.cpp:35: int main(int, char**): Assertion `align2 == 0' failed.
Aborted (core dumped)
amonra@styx:~/m512$ 

It all works fine on MSVC (VS2022)

I know it is possible to work round this by using e.g.:

#include <boost/align/aligned_allocator.hpp>
:
typedef std::vector<VectorElementType,
boost::alignment::aligned_allocator<VectorElementType, 64> > VectorType;

but that should not be necessary.  

Please ensure that all SIMD data types are correctly aligned

Thanks
David

Reply via email to