如何将内存对齐的模板指针定义为 C++ 类成员? 英特尔/海湾合作委员会

问题描述

我有一个矩阵类,它有一个指针类成员(指向类模板变量的数据指针),我想将它声明为指向对齐内存的指针,作为对英特尔编译器的提示,它可以使用对齐访问自动矢量化代码代码的简短版本如下:

template <class V>
class matrix{
public:

    typedef __declspec(align(64)) V VA;
    VA * data;
    

    int nrows,ncols;
}

当我检查优化报告时,我发现数据访问没有对齐,除非我在使用 matrix.data 的代码块中使用 __assume_aligned。

请让我知道是否有替代方法可以让 intel/gcc 编译器知道数据字段是一个对齐的指针,这样我就不必在可以访问指针的任何地方使用 __assume_aligned。

解决方法

此问题已在英特尔社区中得到解决。请参考以下链接

https://community.intel.com/t5/Intel-C-Compiler/How-to-define-a-memory-aligned-template-pointer-as-a-C-class/m-p/1287633#M38894

_mm_malloc 确保向编译器提供对齐内存访问的提示。对齐可确保不存在第二个示例中发生的剥落环。

仅使用 malloc 会降低循环对齐的机会。在这种情况下,环未对齐导致环剥落。